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:
@@ -421,6 +421,14 @@ end
|
|||||||
-- Kaldes HVERT frame: kører én opgave af den aktuelle scanning. En ny mark påbegyndes højst hvert
|
-- 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.
|
-- SCAN_INTERVAL_MS; marklisten opdateres hvert OWNED_REFRESH_MS.
|
||||||
ADFields.SCAN_INTERVAL_MS = 2000
|
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
|
ADFields.lastScanStart = nil
|
||||||
|
|
||||||
function ADFields.scanStep(adEnv, farmId, now)
|
function ADFields.scanStep(adEnv, farmId, now)
|
||||||
@@ -442,12 +450,22 @@ function ADFields.scanStep(adEnv, farmId, now)
|
|||||||
end
|
end
|
||||||
local task = scan.queue[scan.head]
|
local task = scan.queue[scan.head]
|
||||||
if task ~= nil then
|
if task ~= nil then
|
||||||
scan.queue[scan.head] = nil
|
-- flere små opgaver pr. frame inden for et tidsbudget (efter genstart skal alle marker scannes;
|
||||||
scan.head = scan.head + 1
|
-- én pr. frame gjorde listen fuld først efter flere minutter). Uden ur (tests): én pr. frame.
|
||||||
local ok, err = pcall(task)
|
local started = ADFields.clock()
|
||||||
if not ok then
|
for _ = 1, ADFields.MAX_TASKS_PER_FRAME do
|
||||||
Logging.warning("ADSmartPickup: F%s kunne ikke scannes: %s", tostring(scan.id or "-"), tostring(err))
|
task = scan.queue[scan.head]
|
||||||
ADFields.activeScan = nil
|
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
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
<modDesc descVersion="107">
|
<modDesc descVersion="107">
|
||||||
<author>masterdraco</author>
|
<author>masterdraco</author>
|
||||||
<version>1.28.8.0</version>
|
<version>1.28.9.0</version>
|
||||||
<title>
|
<title>
|
||||||
<en>AD Smart Pickup</en>
|
<en>AD Smart Pickup</en>
|
||||||
</title>
|
</title>
|
||||||
|
|||||||
@@ -74,5 +74,21 @@ check("SC9 højst ét punkts arbejde pr. frame (<= 4 opslag)", maxPerFrame <= 4,
|
|||||||
print(" (flest opslag i ét frame: " .. maxPerFrame .. ")")
|
print(" (flest opslag i ét frame: " .. maxPerFrame .. ")")
|
||||||
check("SC10 marklisten", #ADFields.list(), 1)
|
check("SC10 marklisten", #ADFields.list(), 1)
|
||||||
|
|
||||||
|
-- SC11: med ur kører flere opgaver pr. frame inden for budgettet (0,5 ms), højst MAX_TASKS_PER_FRAME
|
||||||
|
local fakeTime = 0
|
||||||
|
netGetTime = function() fakeTime = fakeTime + 0.1; return fakeTime end -- hver opgave "koster" 0,1 ms
|
||||||
|
ADFields.cache, ADFields.listCache, ADFields.activeScan, ADFields.lastScanStart = {}, nil, nil, nil
|
||||||
|
local frames2 = 0
|
||||||
|
for _ = 1, 400 do
|
||||||
|
if ADFields.getInfo(7) ~= nil then break end
|
||||||
|
ADFields.scanStep(adEnv, 1, now)
|
||||||
|
now = now + 16
|
||||||
|
frames2 = frames2 + 1
|
||||||
|
end
|
||||||
|
check("SC11 scannet igen med ur", ADFields.getInfo(7) ~= nil, true)
|
||||||
|
check("SC11 færre frames end én opgave pr. frame", frames2 < frames + 0, true)
|
||||||
|
print(" (frames uden ur: " .. frames .. ", med ur: " .. frames2 .. ")")
|
||||||
|
netGetTime = nil
|
||||||
|
|
||||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||||
os.exit(failures == 0 and 0 or 1)
|
os.exit(failures == 0 and 0 or 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user