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:
@@ -0,0 +1,53 @@
|
||||
-- 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
|
||||
Reference in New Issue
Block a user