как можно оптимизировать код?

iOS

Активный
Автор темы
131
29
Версия MoonLoader
.026-beta
наговнокодил тут штуку:
function findNearest3dTextByString(searchText)
    local closestTextDist = 9999
    local closestTextPos = {0, 0, 0}
    for i = 0, 2281337 do
        if sampIs3dTextDefined(i) then
            local text, color, posX, posY, posZ, Wdist, Wh, onplayer, onTransport = sampGet3dTextInfoById(i)
            local x,y,z = getCharCoordinates(PLAYER_PED)
            local dist = getDistanceBetweenCoords3d(x,y,z,posX,posY,posZ)
            if string.match(text, searchText) then
                if dist < closestTextDist then
                    closestTextDist = dist
                    closestTextPos = {posX, posY, posZ}
                end
            end
        end
    end
    if closestTextDist < 9999 then
        return closestTextPos[1], closestTextPos[2], closestTextPos[3], closestTextDist
    end
end
она работает, но при каждом вызове чтоб вернуть мне значения ей требуется секунды 2. полагаю, из-за того что на ферме, где использую ее очень много подходящего текста и требуется время на сравнение. можно как-то оптимизировать это?
 
Решение
наговнокодил тут штуку:
function findNearest3dTextByString(searchText)
    local closestTextDist = 9999
    local closestTextPos = {0, 0, 0}
    for i = 0, 2281337 do
        if sampIs3dTextDefined(i) then
            local text, color, posX, posY, posZ, Wdist, Wh, onplayer, onTransport = sampGet3dTextInfoById(i)
            local x,y,z = getCharCoordinates(PLAYER_PED)
            local dist = getDistanceBetweenCoords3d(x,y,z,posX,posY,posZ)
            if string.match(text, searchText) then
                if dist < closestTextDist then
                    closestTextDist = dist
                    closestTextPos = {posX, posY, posZ}
                end
            end
        end
    end
    if closestTextDist < 9999 then
        return...

sVor

Активный
135
85
наговнокодил тут штуку:
function findNearest3dTextByString(searchText)
    local closestTextDist = 9999
    local closestTextPos = {0, 0, 0}
    for i = 0, 2281337 do
        if sampIs3dTextDefined(i) then
            local text, color, posX, posY, posZ, Wdist, Wh, onplayer, onTransport = sampGet3dTextInfoById(i)
            local x,y,z = getCharCoordinates(PLAYER_PED)
            local dist = getDistanceBetweenCoords3d(x,y,z,posX,posY,posZ)
            if string.match(text, searchText) then
                if dist < closestTextDist then
                    closestTextDist = dist
                    closestTextPos = {posX, posY, posZ}
                end
            end
        end
    end
    if closestTextDist < 9999 then
        return closestTextPos[1], closestTextPos[2], closestTextPos[3], closestTextDist
    end
end
она работает, но при каждом вызове чтоб вернуть мне значения ей требуется секунды 2. полагаю, из-за того что на ферме, где использую ее очень много подходящего текста и требуется время на сравнение. можно как-то оптимизировать это?
Емае, зачем же ты так дохера ID`шников перебираешь? 2048 с головой
Lua:
function findNearest3dTextByString(searchText)
    local closestTextDist = 9999
    local closestTextPos = {0, 0, 0}
    for i = 0, 2048 do
        if sampIs3dTextDefined(i) then
            local text, color, posX, posY, posZ, Wdist, Wh, onplayer, onTransport = sampGet3dTextInfoById(i)
            local x,y,z = getCharCoordinates(PLAYER_PED)
            local dist = getDistanceBetweenCoords3d(x,y,z,posX,posY,posZ)
            if string.match(text, searchText) then
                if dist < closestTextDist then
                    closestTextDist = dist
                    closestTextPos = {posX, posY, posZ}
                end
            end
        end
    end
    if closestTextDist < 9999 then
        return closestTextPos[1], closestTextPos[2], closestTextPos[3], closestTextDist
    end
end
 
  • Нравится
Реакции: iOS

Tema05

Известный
1,441
401
Емае, зачем же ты так дохера ID`шников перебираешь? 2048 с головой
Lua:
function findNearest3dTextByString(searchText)
    local closestTextDist = 9999
    local closestTextPos = {0, 0, 0}
    for i = 0, 2048 do
        if sampIs3dTextDefined(i) then
            local text, color, posX, posY, posZ, Wdist, Wh, onplayer, onTransport = sampGet3dTextInfoById(i)
            local x,y,z = getCharCoordinates(PLAYER_PED)
            local dist = getDistanceBetweenCoords3d(x,y,z,posX,posY,posZ)
            if string.match(text, searchText) then
                if dist < closestTextDist then
                    closestTextDist = dist
                    closestTextPos = {posX, posY, posZ}
                end
            end
        end
    end
    if closestTextDist < 9999 then
        return closestTextPos[1], closestTextPos[2], closestTextPos[3], closestTextDist
    end
end
Оно скорее всего всё равно выполняет за время близкое к 0, но всё же можно намного лучше. Отказаться от создания кучи лишних переменных, от создания ненужных таблиц, постоянных перезаписей переменных и вместо match юзать find. И лейбла с id 2048 не бывает. Их всего 2048, а счёт идёт с 0

Ну а чтоб вообще разъёб не использовать функции, а парсить пул лейблов (3dtext) напрямую из памяти. Раз в 100 быстрее будет. Особенно если в бесконечном цикле юзать
Пример с использованием либы sampapi
Lua:
local timing = os.clock()
local t, x, y, z
for step = 1, 1000 do
    for i = 2047, 0, -1 do
        if sampIs3dTextDefined(i) then
            t, _, x, y, z = sampGet3dTextInfoById(i)
        end
    end
end
print(os.clock() - timing) --0.56499999999869

local label_pool = require('sampapi').require('CNetGame', true).RefNetGame().m_pPools.m_pLabel
local timing = os.clock()
local t, x, y, z
for step = 1, 1000 do
    for i = 2047, 0, -1 do
        if label_pool.m_bNotEmpty[i] == 1 then
            t = ffi.string(label_pool.m_object[i].m_pText)
            x = label_pool.m_object[i].m_position.x
            y = label_pool.m_object[i].m_position.y
            z = label_pool.m_object[i].m_position.z
        end
    end
end
print(os.clock() - timing) --0.0050000000010186
 
Последнее редактирование:
  • Нравится
Реакции: archvillain, iOS и sVor