diff --git a/FS25_ADSmartPickup/adFields.lua b/FS25_ADSmartPickup/adFields.lua index e64c57d..8ef0685 100644 --- a/FS25_ADSmartPickup/adFields.lua +++ b/FS25_ADSmartPickup/adFields.lua @@ -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 diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 7e1768e..e2208ea 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.28.8.0 + 1.28.9.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adFieldsScan.lua b/tests/test_adFieldsScan.lua index 796f3b5..a2f56cd 100644 --- a/tests/test_adFieldsScan.lua +++ b/tests/test_adFieldsScan.lua @@ -74,5 +74,21 @@ check("SC9 højst ét punkts arbejde pr. frame (<= 4 opslag)", maxPerFrame <= 4, print(" (flest opslag i ét frame: " .. maxPerFrame .. ")") 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")) os.exit(failures == 0 and 0 or 1)