perf: rutetjek frem+tilbage går markør->markør og gemmes 5 min (var 30-39 ms pr. kald, genberegnet hver 10 m); bygningsliste 30 s — hak på 44-67 ms (v1.33.4.0)
This commit is contained in:
@@ -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}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.33.3.0</version>
|
||||
<version>1.33.4.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</title>
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user