diff --git a/FS25_ADSmartPickup/adBuildings.lua b/FS25_ADSmartPickup/adBuildings.lua index c6c9298..3ba50c6 100644 --- a/FS25_ADSmartPickup/adBuildings.lua +++ b/FS25_ADSmartPickup/adBuildings.lua @@ -11,7 +11,7 @@ ADBuildings.MAX_MARKER_DISTANCE = 40 -- en separat drop-markør (≠ bygningens læssemarkør) må højst stå så langt fra aflæsningstriggeren ADBuildings.MAX_DROP_DISTANCE = 25 -- bygninger ændrer sig sjældent; genopbygningen (bygninger x markører) er dyr — 1 s gav et hak hvert sekund -ADBuildings.CACHE_MS = 10000 +ADBuildings.CACHE_MS = 30000 local cache = {list = nil, farmId = nil, time = -math.huge} diff --git a/FS25_ADSmartPickup/adWaitPool.lua b/FS25_ADSmartPickup/adWaitPool.lua index 7b94ad7..d5c764e 100644 --- a/FS25_ADSmartPickup/adWaitPool.lua +++ b/FS25_ADSmartPickup/adWaitPool.lua @@ -219,11 +219,39 @@ function ADWaitPool.hasRouteTo(adEnv, vehicle, wayPointId) return result end +-- Rute mellem to markører: afhænger ikke af vognens position, så svaret gemmes længe (5 min). Profiler +-- 26/9: "rutetjek frem+tilbage" tog 30-39 ms pr. kald og blev regnet igen hver gang vognen havde flyttet sig +-- 10 m — det gav hak på 44-67 ms hvert minut. +ADWaitPool.MARKER_ROUTE_MS = 300000 +local markerRoutes = {} +function ADWaitPool.hasMarkerRoute(adEnv, fromWayPointId, toWayPointId) + local graph = adEnv.ADGraphManager + if graph.pathFromTo == nil then return true end + local key = tostring(fromWayPointId) .. ">" .. tostring(toWayPointId) + local now = clockMs() + local cached = markerRoutes[key] + if cached ~= nil and now ~= nil and now - cached.at < ADWaitPool.MARKER_ROUTE_MS then + return cached.result + end + local result = pathReaches(graph:pathFromTo(fromWayPointId, toWayPointId), toWayPointId) + if now ~= nil then markerRoutes[key] = {result = result, at = now + math.random() * ADWaitPool.MARKER_ROUTE_MS * 0.5} end + return result +end + +function ADWaitPool.resetMarkerRoutes() + markerRoutes = {} +end + function ADWaitPool.hasRouteBothWays(adEnv, vehicle, toWayPointId, homeWayPointId) local graph = adEnv.ADGraphManager if graph.getPathTo == nil or graph.pathFromTo == nil then return true end + -- kendt hjem (kilden): vognen kører hjem -> mål -> hjem; markør til markør, gemt længe + if homeWayPointId ~= nil then + return ADWaitPool.hasMarkerRoute(adEnv, homeWayPointId, toWayPointId) + and ADWaitPool.hasMarkerRoute(adEnv, toWayPointId, homeWayPointId) + end local now = clockMs() local key = now ~= nil and routeKey(vehicle, tostring(toWayPointId) .. ">" .. tostring(homeWayPointId)) or nil local cached = key ~= nil and routeCache[key] or nil diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 0ba4569..35ca31a 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.33.3.0 + 1.33.4.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adWaitPool.lua b/tests/test_adWaitPool.lua index bb0e5a8..9ad70b4 100644 --- a/tests/test_adWaitPool.lua +++ b/tests/test_adWaitPool.lua @@ -137,5 +137,24 @@ do netGetTime = nil end +-- MR: rute markør->markør gemmes (uafhængig af hvor vognen er) — hak 26/9: 30-39 ms pr. rutetjek +do + local calls = 0 + local realFromTo = adEnv.ADGraphManager.pathFromTo + adEnv.ADGraphManager.pathFromTo = function(self, from, to) calls = calls + 1; return realFromTo(self, from, to) end + local savedClock = netGetTime + local t = 1000 + netGetTime = function() return t end + ADWaitPool.resetMarkerRoutes() + local far = {name = "far", rootNode = {x = 5000, z = 5000}} + check("MR første: rute", ADWaitPool.hasRouteBothWays(adEnv, v2, 10, 30), true) + local afterFirst = calls + t = t + 60000 + check("MR anden fra en helt anden position: samme svar", ADWaitPool.hasRouteBothWays(adEnv, far, 10, 30), true) + check("MR anden gang ingen ny ruteberegning", calls, afterFirst) + adEnv.ADGraphManager.pathFromTo = realFromTo + netGetTime = savedClock +end + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)