Skip to content

Commit

Permalink
Add model freeing delay by a bit
Browse files Browse the repository at this point in the history
  • Loading branch information
Fernando-A-Rocha committed Jul 6, 2024
1 parent 325d0f5 commit 3d86e8d
Showing 1 changed file with 32 additions and 8 deletions.
40 changes: 32 additions & 8 deletions newmodels_reborn/core/client.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ addEvent("newmodels_reborn:receiveCustomModels", true)

local loadedModels = {}

local FREE_ID_DELAY = 10000 -- ms
local FREE_ID_DELAY_STEP = 500 -- ms
local currFreeIdDelay = FREE_ID_DELAY

local function applyElementCustomModel(element)
local customModel = tonumber(getElementData(element, CUSTOM_MODEL_DATA_KEY))
if not customModel then return end
Expand Down Expand Up @@ -84,7 +88,13 @@ local function loadCustomModel(customModel, elementToApply)
elementTypes = { "object", "pickup" }
end

loadedModels[customModel] = { id = allocatedModel, baseModel = customInfo.baseModel, elements = { txd = txd, dff = dff, col = col }, elementTypes = elementTypes }
-- Set loadedModel info
loadedModels[customModel] = {
id = allocatedModel, baseModel = customInfo.baseModel,
elementTypes = elementTypes,
freeAllocatedTimer = nil,
elements = { txd = txd, dff = dff, col = col }
}

if isElement(elementToApply) then
applyElementCustomModel(elementToApply)
Expand All @@ -104,13 +114,27 @@ local function countStreamedElementsWithCustomModel(elementTypes, customModel)
end

local function freeAllocatedModel(customModel, loadedModel)
engineRestoreCOL(loadedModel.id)
engineRestoreModel(loadedModel.id)
engineFreeModel(loadedModel.id)
if isElement(loadedModel.elements.col) then destroyElement(loadedModel.elements.col) end
if isElement(loadedModel.elements.txd) then destroyElement(loadedModel.elements.txd) end
if isElement(loadedModel.elements.dff) then destroyElement(loadedModel.elements.dff) end
loadedModels[customModel] = nil
if isTimer(loadedModel.freeAllocatedTimer) then
killTimer(loadedModel.freeAllocatedTimer)
end
-- Do not free all models at once, delay each model by a bit
currFreeIdDelay = currFreeIdDelay + FREE_ID_DELAY_STEP
loadedModel.freeAllocatedTimer = setTimer(function()
if not loadedModels[customModel] then
return -- Unexpected behavior
end
engineRestoreCOL(loadedModel.id)
engineRestoreModel(loadedModel.id)
engineFreeModel(loadedModel.id)
if isElement(loadedModel.elements.col) then destroyElement(loadedModel.elements.col) end
if isElement(loadedModel.elements.txd) then destroyElement(loadedModel.elements.txd) end
if isElement(loadedModel.elements.dff) then destroyElement(loadedModel.elements.dff) end

-- Unset loadedModel info
loadedModels[customModel] = nil

currFreeIdDelay = currFreeIdDelay - FREE_ID_DELAY_STEP
end, currFreeIdDelay, 1)
end

local function freeAllocatedModelIfUnused(customModel)
Expand Down

0 comments on commit 3d86e8d

Please sign in to comment.