Files
fs25-adsmartpickup/FS25_ADSmartPickup/adCache.lua
T
masterdraco 6fd917caca 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.
2026-09-26 11:24:05 +02:00

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