perf(marker): hak hvert sekund — ingen kopier når intet ændrer sig, passive marker i tiendedele, scan hvert 2. s, cachet markliste/markører, tick-tidsmåling i loggen (v1.27.1.0)
In-game 26/9: lille hak ca. hvert sekund. Markarbejdets tick kopierede alle markers data hvert sekund (affald -> GC-pause), hentede alle kortets marker og alle AD-markører.
This commit is contained in:
@@ -11,6 +11,11 @@ ADFields.cache = {}
|
||||
ADFields.order = {}
|
||||
ADFields.scanIndex = 0
|
||||
ADFields.mowable = nil
|
||||
-- markliste og F-markører ændrer sig sjældent: slås op igen efter så lang tid (ikke hvert scan)
|
||||
ADFields.OWNED_REFRESH_MS = 30000
|
||||
ADFields.MARKER_REFRESH_MS = 30000
|
||||
ADFields.ownedAt = nil
|
||||
ADFields.now = 0
|
||||
|
||||
function ADFields.parseMarkerName(name)
|
||||
if type(name) ~= "string" then return nil end
|
||||
@@ -287,11 +292,15 @@ local function scanField(adEnv, field, fieldId)
|
||||
info.kind = "bare"
|
||||
end
|
||||
readSoil(info)
|
||||
if info.x ~= nil then
|
||||
local previous = ADFields.cache[fieldId]
|
||||
if previous ~= nil and previous.markerCheckedAt ~= nil and ADFields.now - previous.markerCheckedAt < ADFields.MARKER_REFRESH_MS then
|
||||
info.markerId, info.markerName, info.markerDistance, info.markerCheckedAt = previous.markerId, previous.markerName, previous.markerDistance, previous.markerCheckedAt
|
||||
elseif info.x ~= nil then
|
||||
local marker, distance = findMarker(adEnv, fieldId, info.x, info.z)
|
||||
info.markerId = marker ~= nil and marker.id or nil
|
||||
info.markerName = marker ~= nil and marker.name or nil
|
||||
info.markerDistance = distance
|
||||
info.markerCheckedAt = ADFields.now
|
||||
end
|
||||
return info
|
||||
end
|
||||
@@ -310,18 +319,25 @@ local function ownedFields(farmId)
|
||||
end
|
||||
|
||||
-- Scanner næste mark (round-robin) og returnerer alle kendte. Kaldes hvert sekund af job-løkken.
|
||||
function ADFields.scanNext(adEnv, farmId)
|
||||
local owned = ownedFields(farmId)
|
||||
local ids = {}
|
||||
for _, entry in ipairs(owned) do ids[entry.id] = true end
|
||||
for id in pairs(ADFields.cache) do
|
||||
if not ids[id] then ADFields.cache[id] = nil end
|
||||
function ADFields.scanNext(adEnv, farmId, now)
|
||||
ADFields.now = now or ADFields.now
|
||||
if ADFields.ownedAt == nil or ADFields.now - ADFields.ownedAt >= ADFields.OWNED_REFRESH_MS then
|
||||
ADFields.ownedAt = ADFields.now
|
||||
local owned = ownedFields(farmId)
|
||||
local ids = {}
|
||||
for _, entry in ipairs(owned) do ids[entry.id] = true end
|
||||
for id in pairs(ADFields.cache) do
|
||||
if not ids[id] then ADFields.cache[id] = nil end
|
||||
end
|
||||
ADFields.order = owned
|
||||
ADFields.listCache = nil
|
||||
end
|
||||
ADFields.order = owned
|
||||
local owned = ADFields.order
|
||||
if #owned == 0 then return end
|
||||
ADFields.scanIndex = ADFields.scanIndex % #owned + 1
|
||||
local entry = owned[ADFields.scanIndex]
|
||||
local ok, info = pcall(scanField, adEnv, entry.field, entry.id)
|
||||
ADFields.listCache = nil
|
||||
if ok then
|
||||
ADFields.cache[entry.id] = info
|
||||
else
|
||||
@@ -329,12 +345,15 @@ function ADFields.scanNext(adEnv, farmId)
|
||||
end
|
||||
end
|
||||
|
||||
-- Samme liste indtil næste scanning (list() kaldes hvert sekund; ingen ny tabel hver gang).
|
||||
function ADFields.list()
|
||||
if ADFields.listCache ~= nil then return ADFields.listCache end
|
||||
local infos = {}
|
||||
for _, entry in ipairs(ADFields.order) do
|
||||
local info = ADFields.cache[entry.id]
|
||||
if info ~= nil then table.insert(infos, info) end
|
||||
end
|
||||
ADFields.listCache = infos
|
||||
return infos
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user