6fd917caca
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.
54 lines
2.1 KiB
Lua
54 lines
2.1 KiB
Lua
-- AD Cache
|
|
-- Fælles korttids-cache for dyre opslag (markør -> station, salgssteder, identify, Wait-punkter, lagre).
|
|
-- Holdende vogne genplanlægger hvert 5. s og slog de samme ting op igen og igen (markører x stationer x
|
|
-- triggere) -> hak (in-game 26/9). Verden ændrer sig ikke så hurtigt. Uden spillets tid (tests) caches
|
|
-- intet, så adfærden er som før. "Intet fundet" gemmes også.
|
|
|
|
ADCache = {}
|
|
|
|
ADCache.buckets = {}
|
|
-- tændes af ADSmartPickup når hooksene er installeret (i spillet); tests kører uden cache
|
|
ADCache.enabled = false
|
|
local NOTHING = {}
|
|
|
|
-- Til moduler der indlæses uden adCache (tests): kald fn direkte.
|
|
function ADCacheGet(bucket, key, ttlMs, fn)
|
|
if ADCache == nil or not ADCache.enabled then return fn() end
|
|
return ADCache.get(bucket, key, ttlMs, fn)
|
|
end
|
|
|
|
local function now()
|
|
local mission = g_currentMission
|
|
if mission ~= nil and type(mission.time) == "number" then return mission.time end
|
|
return nil
|
|
end
|
|
|
|
-- Resultatet af fn() for (bucket, key), genbrugt i ttlMs.
|
|
function ADCache.get(bucket, key, ttlMs, fn)
|
|
local time = now()
|
|
if not ADCache.enabled or time == nil or key == nil then return fn() end
|
|
local store = ADCache.buckets[bucket]
|
|
if store == nil then
|
|
store = {size = 0, entries = {}}
|
|
ADCache.buckets[bucket] = store
|
|
end
|
|
local entry = store.entries[key]
|
|
if entry ~= nil and time - entry.at < ttlMs then
|
|
if entry.value == NOTHING then return nil end
|
|
return entry.value
|
|
end
|
|
local value = fn()
|
|
if entry == nil then
|
|
store.size = store.size + 1
|
|
if store.size > 5000 then store.entries, store.size = {}, 1 end
|
|
end
|
|
-- spredt udløb (levetid +0-50 %): poster der blev lavet i samme kald, udløber ikke i samme frame
|
|
-- (simulering 26/9: 600 markør-opslag udløb samtidig -> hak hvert 10. s)
|
|
store.entries[key] = {value = value == nil and NOTHING or value, at = time + math.random() * ttlMs * 0.5}
|
|
return value
|
|
end
|
|
|
|
function ADCache.clear(bucket)
|
|
if bucket == nil then ADCache.buckets = {} else ADCache.buckets[bucket] = nil end
|
|
end
|