perf(marker): markscanning som arbejdskø — højst ét prøvepunkt pr. frame (v1.27.2.0)
In-game 26/9: hakket kom sjældnere da scanningen gik fra 1 s til 2 s -> scanningen af én mark i ét frame var årsagen (opslag gennemgår alle ~40 afgrødetyper pr. punkt). Coroutines findes ikke i FS25 (Giants fjernede dem, jf. Courseplays HybridAStar), derfor en eksplicit kø. Tidsmåling bruger netGetTime. Test (test_adFieldsScan) beviser: færdig, korrekt resultat, <= 3 opslag pr. frame.
This commit is contained in:
@@ -8,7 +8,6 @@ ADFieldJobs = {}
|
||||
ADFieldJobs.LOG_PREFIX = "ADSmartPickup: "
|
||||
ADFieldJobs.TICK_MS = 1000
|
||||
-- én mark scannes hvert andet sekund; passive marker (manuelle, uden mål) vurderes i ti portioner
|
||||
ADFieldJobs.SCAN_EVERY_TICKS = 2
|
||||
ADFieldJobs.PASSIVE_SLICES = 10
|
||||
-- tidsmåling: tager et tick mere end dette, skrives det i loggen (højst én gang pr. minut)
|
||||
ADFieldJobs.SLOW_TICK_MS = 3
|
||||
@@ -269,9 +268,12 @@ local function stepField(adEnv, info, env)
|
||||
end
|
||||
end
|
||||
|
||||
-- Realtid i ms: netGetTime (bruges overalt i FS), ellers getTimeSec.
|
||||
local function clockMs()
|
||||
local ok, seconds = pcall(getTimeSec)
|
||||
return ok and type(seconds) == "number" and seconds * 1000 or nil
|
||||
local ok, ms = pcall(function() return netGetTime() end)
|
||||
if ok and type(ms) == "number" then return ms end
|
||||
local okSec, seconds = pcall(function() return getTimeSec() end)
|
||||
return okSec and type(seconds) == "number" and seconds * 1000 or nil
|
||||
end
|
||||
|
||||
-- Et langsomt tick (> SLOW_TICK_MS) skrives i loggen med fordeling, højst én gang pr. minut.
|
||||
@@ -286,15 +288,17 @@ end
|
||||
function ADFieldJobs.tick(adEnv, dt)
|
||||
ADFieldJobs.now = ADFieldJobs.now + dt
|
||||
ADFieldJobs.timer = ADFieldJobs.timer + dt
|
||||
if ADFieldJobs.loaded then
|
||||
-- markscanningen kører et lille stykke HVERT frame (coroutine), aldrig en hel mark i ét frame
|
||||
local okScan, errScan = pcall(ADFields.scanStep, adEnv, g_currentMission:getFarmId(), ADFieldJobs.now)
|
||||
if not okScan then Logging.warning(ADFieldJobs.LOG_PREFIX .. "markscanning: %s", tostring(errScan)) end
|
||||
end
|
||||
if ADFieldJobs.timer < ADFieldJobs.TICK_MS then return end
|
||||
ADFieldJobs.timer = 0
|
||||
ADFieldJobs.tickCount = ADFieldJobs.tickCount + 1
|
||||
if not ADFieldJobs.loaded then ADFieldJobs.load() end
|
||||
local t0 = clockMs()
|
||||
if ADFieldJobs.tickCount % ADFieldJobs.SCAN_EVERY_TICKS == 0 then
|
||||
ADFields.scanNext(adEnv, g_currentMission:getFarmId(), ADFieldJobs.now)
|
||||
end
|
||||
local t1 = clockMs()
|
||||
local t1 = t0
|
||||
for _, assignment in pairs(ADFieldJobs.state.assignments) do
|
||||
local ok, err = pcall(ADFieldWork.follow, adEnv, assignment)
|
||||
if not ok then
|
||||
|
||||
Reference in New Issue
Block a user