perf: hak-audit — spredte timere, fælles cache (markør->station, salgssteder, identify, Wait-punkter, lagre, positioner), bygningsliste 10 s, profiler, simulering (v1.28.0.0)
Audit (2 reviewere) + simulering bench/bench_hak.lua: værste frame 124,7 ms -> 0,9 ms. - Holdende vognes genplanlægning (5 s) spredes tilfældigt over hele intervallet (før: alle i samme frame). - ADCache: korttids-cache m. spredt udløb (+0-50 %), kun aktiv i spillet; stationsopslag 30 s. - Bygningsliste 10 s (før 1 s: bygninger x markører hvert sekund). Markarbejde-tick forskudt 0,5 s fra menuen. - ADProfiler: logger top-6 langsomste indgange pr. minut ved > 2 ms.
This commit is contained in:
@@ -5,6 +5,13 @@
|
||||
|
||||
ADWaitPool = {}
|
||||
|
||||
-- ADCache-opslag der også virker uden adCache (tests)
|
||||
local function cacheGet(bucket, key, ttlMs, fn)
|
||||
if ADCacheGet == nil then return fn() end
|
||||
return ADCacheGet(bucket, key, ttlMs, fn)
|
||||
end
|
||||
|
||||
|
||||
ADWaitPool.LOG_PREFIX = "ADSmartPickup: "
|
||||
-- sættes af den der installerer opgave-hooks (task.STATE_DRIVING); 2 er AD's værdi
|
||||
ADWaitPool.STATE_DRIVING = 2
|
||||
@@ -14,6 +21,10 @@ ADWaitPool.claims = setmetatable({}, {__mode = "v"})
|
||||
|
||||
-- poolGroup: run'ets Wait-mappe; tom/nil = alle Wait-mapper.
|
||||
function ADWaitPool.getCandidates(adEnv, poolGroup)
|
||||
return cacheGet("waitCandidates", tostring(poolGroup or ""), 10000, function() return ADWaitPool.findCandidates(adEnv, poolGroup) end)
|
||||
end
|
||||
|
||||
function ADWaitPool.findCandidates(adEnv, poolGroup)
|
||||
local candidates = {}
|
||||
for _, marker in pairs(adEnv.ADGraphManager:getMapMarkers()) do
|
||||
local isInPool = poolGroup == nil or poolGroup == "" or marker.group == poolGroup
|
||||
@@ -57,20 +68,31 @@ ADWaitPool.OCCUPIED_RADIUS = 6
|
||||
|
||||
-- Positioner for ANDRE motoriserede køretøjer (ikke vognen selv eller dens redskaber) — til at se om et
|
||||
-- Wait-punkt fysisk er optaget, også uden reservation (fx lige efter en omplanlægning).
|
||||
-- Alle motoriserede køretøjers positioner, delt mellem opslag i 0,5 s (ikke én runde pr. vogn pr. opslag).
|
||||
local function allVehiclePositions()
|
||||
return cacheGet("vehiclePositions", "all", 500, function()
|
||||
local list = {}
|
||||
local system = g_currentMission ~= nil and g_currentMission.vehicleSystem or nil
|
||||
for _, other in pairs(system ~= nil and system.vehicles or {}) do
|
||||
if other.spec_motorized ~= nil and other.rootNode ~= nil then
|
||||
local ok, x, _, z = pcall(getWorldTranslation, other.rootNode)
|
||||
if ok and x ~= nil then table.insert(list, {vehicle = other, x = x, z = z}) end
|
||||
end
|
||||
end
|
||||
return list
|
||||
end)
|
||||
end
|
||||
|
||||
local function otherVehiclePositions(vehicle)
|
||||
local positions = {}
|
||||
local system = g_currentMission ~= nil and g_currentMission.vehicleSystem or nil
|
||||
local own = {}
|
||||
if vehicle.getChildVehicles ~= nil then
|
||||
local ok, children = pcall(vehicle.getChildVehicles, vehicle)
|
||||
for _, child in pairs(ok and children or {}) do own[child] = true end
|
||||
end
|
||||
own[vehicle] = true
|
||||
for _, other in pairs(system ~= nil and system.vehicles or {}) do
|
||||
if not own[other] and other.spec_motorized ~= nil and other.rootNode ~= nil then
|
||||
local ok, x, _, z = pcall(getWorldTranslation, other.rootNode)
|
||||
if ok and x ~= nil then table.insert(positions, {x = x, z = z}) end
|
||||
end
|
||||
for _, entry in ipairs(allVehiclePositions()) do
|
||||
if not own[entry.vehicle] then table.insert(positions, entry) end
|
||||
end
|
||||
return positions
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user