Оптимизация парсинга таблицы json

Anti...

Участник
Автор темы
245
19
Версия MoonLoader
.026-beta
Здравствуйте, имеется скрипт с возможностью создавать вкладки(mimgui), а в этих вкладках можно создавать/удалять/включать инпуты для ренда объектов(добавляю модели и т.п). Столкнулся с резкой просадкой ФПС при активации рендера, чем больше активируешь, тем больше падает ФПС. Да, рендер на mimgui.

Сама проблема, как я понял, в циклах, но я не знаю как сделать по-другому, чтобы код и работал и был оптимизированее)) Подскажите, как же можно оптимизировать это дело?

Lua:
local cfg = json(fileName):Load({
    theme = 1,
    state = false,
    DATA = {
        {
            name = u8('Новая вкладка'),
            data = {},
            settings = {
                color = {1, 1, 1, 1},
                toggleLine = false,
                toggle = false,
                sizeText = 14
            }
        }
    }
})
Lua:
local frameDrawList = imgui.OnFrame(
    function() return true and not isPauseMenuActive() end,
    function(self)
        self.HideCursor = true
        local DL = imgui.GetBackgroundDrawList()
       
        local json = prepareJSON(cfg.DATA)
        for _, tab in ipairs(cfg.DATA) do
            for _, data in ipairs(tab.data) do
                if data.bool then
                    if data.name ~= "" and data.model ~= "" and data.material ~= "" then -- Если инпуты не пустые
                        for k, v in pairs(getAllObjects()) do                                              
                            if isObjectOnScreen(v) then
                                local success, objectId = pcall(sampGetObjectSampIdByHandle, v)
                                if success and objectId > 0 then
                                    if getObjectModel(v) == tonumber(data.model) then -- Если модель объекта равна модели, которая в инпуте                                        
                                        local color = sampGetObjectMaterialColor(objectId, 0) -- Получаем цвет объекта  
                                        if color == tonumber(data.material) then -- Если полученный цвет объекта равен цвету в инпуте
                                            local _, Ox, Oy, Oz = getObjectCoordinates(v) -- Получаем координаты этого объекта
                                            local cX, cY = convert3DCoordsToScreen(Ox,Oy,Oz)
                                            -- Рендерим на координаты цветного объекта
                                            local colorVec4 = {tab.settings.color[1], tab.settings.color[2], tab.settings.color[3], tab.settings.color[4]}
                                            local sizeText = tonumber(tab.settings.sizeText)
                                            DL:AddTextFontPtr(font[30], sizeText, imgui.ImVec2(cX, cY), imgui.GetColorU32Vec4(colorVec4), data.name);

                                            if tab.settings.toggleLine then
                                                local mPx, mPy, mPz = getCharCoordinates(PLAYER_PED)
                                                local CPx, CPy = convert3DCoordsToScreen(mPx,mPy,mPz)
                                                DL:AddLine(imgui.ImVec2(CPx, CPy), imgui.ImVec2(cX, cY), imgui.GetColorU32Vec4(colorVec4), 1.5);
                                                DL:AddCircleFilled(imgui.ImVec2(cX, cY), 3, imgui.GetColorU32Vec4(colorVec4));  
                                            end
                                        end
                                    end                                
                                end
                            end
                        end
                    end
                end
            end
        end      
    end
)
 
Последнее редактирование:
Решение
Нихуя не получилось, может для вас это и легко, но у меня оно не работает, возвращает nil. Покажите на примере мне хотя бы, ну не мучение одно с этим..

Up
Глобальную переменную перед main, аля tabsData
в мейне читаем конфиг и после прочтения парсим в эту переменную табы. В фрейме читаем из переменеой tabsData инфу. Нужно изменить табы? изменяем tabsData. При сохранении инфы конвертим tabsData в json и сохраняем в конфиг.

Это не вопрос уменний программировать, это вопрос мышления и понимания. Ломай мозг, сиди до потери пульса пока не поймешь, так закаляется программист

Anti...

Участник
Автор темы
245
19
Потому-что ты выполняешь парс json каждый фрейм, а это тяжелая операция. Парси один раз и выводи таблицу, модифицируй её, затем конверти и сохраняй
Да, я это понимаю, но не знаю как правильно это сделать, потому что всё что я пробовал - не работало. Тут ты говоришь модифицировать, не совсем понял что именно нужно сделать 😕
Я пробовал парсить таблицув функции и потом возвращать из неё таблицу и обращаться в фрейме уже по ключу, но что-то не получилось.


Lua:
function pairsJSON(data)
    local table = {}

    for _, tab in ipairs(cfg.DATA) do
        for _, data in ipairs(tab.data) do
            table[tab] = data
        end
    end

    return table
end

local json = pairsJSON(cfg.DATA)

Поможет кто?


Потому-что ты выполняешь парс json каждый фрейм, а это тяжелая операция. Парси один раз и выводи таблицу, модифицируй её, затем конверти и сохраняй
Покажи пожалуйста как это нормально сделать можно 🫤
 
Последнее редактирование:

AnWu

Guardian of Order
Всефорумный модератор
4,689
5,201
Да, я это понимаю, но не знаю как правильно это сделать, потому что всё что я пробовал - не работало. Тут ты говоришь модифицировать, не совсем понял что именно нужно сделать 😕
Я пробовал парсить таблицув функции и потом возвращать из неё таблицу и обращаться в фрейме уже по ключу, но что-то не получилось.


Lua:
function pairsJSON(data)
    local table = {}

    for _, tab in ipairs(cfg.DATA) do
        for _, data in ipairs(tab.data) do
            table[tab] = data
        end
    end

    return table
end

local json = pairsJSON(cfg.DATA)

Поможет кто?



Покажи пожалуйста как это нормально сделать можно 🫤
спарси конфиг в какую-то переменную, потом читай с этой переменной, изменяй её в ходе настройки, после чего конверти её обратно в джейсон.
Задача простая: не вызывать парсинг жесона каждый кадр. Решай
 
  • Клоун
  • Нравится
Реакции: Fott и Anti...

Anti...

Участник
Автор темы
245
19
Нихуя не получилось, может для вас это и легко, но у меня оно не работает, возвращает nil. Покажите на примере мне хотя бы, ну не мучение одно с этим..

Up
 
Последнее редактирование:
  • Эм
  • Грустно
Реакции: AnWu и de_clain

AnWu

Guardian of Order
Всефорумный модератор
4,689
5,201
Нихуя не получилось, может для вас это и легко, но у меня оно не работает, возвращает nil. Покажите на примере мне хотя бы, ну не мучение одно с этим..

Up
Глобальную переменную перед main, аля tabsData
в мейне читаем конфиг и после прочтения парсим в эту переменную табы. В фрейме читаем из переменеой tabsData инфу. Нужно изменить табы? изменяем tabsData. При сохранении инфы конвертим tabsData в json и сохраняем в конфиг.

Это не вопрос уменний программировать, это вопрос мышления и понимания. Ломай мозг, сиди до потери пульса пока не поймешь, так закаляется программист
 
  • Клоун
  • Нравится
Реакции: Fott и chapo