perf(markarbejde): markscanning kører op til 8 opgaver pr. frame inden for 0,5 ms — marklisten fyldes hurtigt efter genstart (v1.28.9.0)

This commit is contained in:
2026-09-26 12:51:50 +02:00
parent 6138b6b874
commit 5d06c46fa9
3 changed files with 41 additions and 7 deletions
+24 -6
View File
@@ -421,6 +421,14 @@ end
-- Kaldes HVERT frame: kører én opgave af den aktuelle scanning. En ny mark påbegyndes højst hvert
-- SCAN_INTERVAL_MS; marklisten opdateres hvert OWNED_REFRESH_MS.
ADFields.SCAN_INTERVAL_MS = 2000
ADFields.MAX_TASKS_PER_FRAME = 8
ADFields.FRAME_BUDGET_MS = 0.5
function ADFields.clock()
if netGetTime == nil then return nil end
local ok, ms = pcall(netGetTime)
return ok and type(ms) == "number" and ms or nil
end
ADFields.lastScanStart = nil
function ADFields.scanStep(adEnv, farmId, now)
@@ -442,12 +450,22 @@ function ADFields.scanStep(adEnv, farmId, now)
end
local task = scan.queue[scan.head]
if task ~= nil then
scan.queue[scan.head] = nil
scan.head = scan.head + 1
local ok, err = pcall(task)
if not ok then
Logging.warning("ADSmartPickup: F%s kunne ikke scannes: %s", tostring(scan.id or "-"), tostring(err))
ADFields.activeScan = nil
-- flere små opgaver pr. frame inden for et tidsbudget (efter genstart skal alle marker scannes;
-- én pr. frame gjorde listen fuld først efter flere minutter). Uden ur (tests): én pr. frame.
local started = ADFields.clock()
for _ = 1, ADFields.MAX_TASKS_PER_FRAME do
task = scan.queue[scan.head]
if task == nil then return end
scan.queue[scan.head] = nil
scan.head = scan.head + 1
local ok, err = pcall(task)
if not ok then
Logging.warning("ADSmartPickup: F%s kunne ikke scannes: %s", tostring(scan.id or "-"), tostring(err))
ADFields.activeScan = nil
return
end
local current = started ~= nil and ADFields.clock() or nil
if current == nil or current - started >= ADFields.FRAME_BUDGET_MS then return end
end
return
end