Ticket #4191: AIWorker-update-rewrite.patch

File AIWorker-update-rewrite.patch, 6.1 KB (added by Itms, 8 years ago)
  • source/simulation2/components/CCmpAIManager.cpp

     
    512512
    513513        return true;
    514514    }
    515     void StartComputation(const shared_ptr<ScriptInterface::StructuredClone>& gameState,
    516         const Grid<NavcellData>& passabilityMap, const GridUpdateInformation& dirtinessInformations,
    517         const Grid<u8>& territoryMap, bool territoryMapDirty,
     515
     516    void UpdateGameState(const shared_ptr<ScriptInterface::StructuredClone>& gameState)
     517    {
     518        ENSURE(m_CommandsComputed);
     519        m_GameState = gameState;
     520    }
     521
     522    void UpdatePathfinder(const Grid<NavcellData>& passabilityMap, bool globallyDirty, const Grid<u8>& dirtinessGrid,
    518523        const std::map<std::string, pass_class_t>& nonPathfindingPassClassMasks, const std::map<std::string, pass_class_t>& pathfindingPassClassMasks)
    519524    {
    520525        ENSURE(m_CommandsComputed);
     526        bool dimensionChange = m_PassabilityMap.m_W != passabilityMap.m_W || m_PassabilityMap.m_H != passabilityMap.m_H;
    521527
    522         m_GameState = gameState;
     528        m_PassabilityMap = passabilityMap;
     529        if (globallyDirty)
     530            m_LongPathfinder.Reload(&m_PassabilityMap, nonPathfindingPassClassMasks, pathfindingPassClassMasks);
     531        else
     532            m_LongPathfinder.Update(&m_PassabilityMap, dirtinessGrid);
     533
    523534        JSContext* cx = m_ScriptInterface->GetContext();
     535        if (dimensionChange)
     536            ScriptInterface::ToJSVal(cx, &m_PassabilityMapVal, m_PassabilityMap);
     537        else
     538        {
     539            // Avoid a useless memory reallocation followed by a garbage collection.
     540            JSAutoRequest rq(cx);
    524541
    525         if (dirtinessInformations.dirty)
     542            JS::RootedObject mapObj(cx, &m_PassabilityMapVal.toObject());
     543            JS::RootedValue mapData(cx);
     544            ENSURE(JS_GetProperty(cx, mapObj, "data", &mapData));
     545            JS::RootedObject dataObj(cx, &mapData.toObject());
     546
     547            u32 length = 0;
     548            ENSURE(JS_GetArrayLength(cx, dataObj, &length));
     549            u32 nbytes = (u32)(length * sizeof(NavcellData));
     550
     551            JS::AutoCheckCannotGC nogc;
     552            memcpy((void*)JS_GetUint16ArrayData(dataObj, nogc), m_PassabilityMap.m_Data, nbytes);
     553        }       
     554    }
     555
     556    void UpdateTerritoryMap(const Grid<u8>& territoryMap)
     557    {
     558        ENSURE(m_CommandsComputed);
     559        bool dimensionChange = m_TerritoryMap.m_W != territoryMap.m_W || m_TerritoryMap.m_H != territoryMap.m_H;
     560
     561        m_TerritoryMap = territoryMap;
     562       
     563        JSContext* cx = m_ScriptInterface->GetContext();
     564        if (dimensionChange)
     565            ScriptInterface::ToJSVal(cx, &m_TerritoryMapVal, m_TerritoryMap);
     566        else
    526567        {
    527             m_PassabilityMap = passabilityMap;
    528             if (dirtinessInformations.globallyDirty)
    529                 m_LongPathfinder.Reload(&m_PassabilityMap, nonPathfindingPassClassMasks, pathfindingPassClassMasks);
    530             else
    531                 m_LongPathfinder.Update(&m_PassabilityMap, dirtinessInformations.dirtinessGrid);
    532             ScriptInterface::ToJSVal(cx, &m_PassabilityMapVal, m_PassabilityMap);
    533         }
     568            // Avoid a useless memory reallocation followed by a garbage collection.
     569            JSAutoRequest rq(cx);
    534570
    535         if (territoryMapDirty)
    536         {
    537             m_TerritoryMap = territoryMap;
    538             ScriptInterface::ToJSVal(cx, &m_TerritoryMapVal, m_TerritoryMap);
     571            JS::RootedObject mapObj(cx, &m_TerritoryMapVal.toObject());
     572            JS::RootedValue mapData(cx);
     573            ENSURE(JS_GetProperty(cx, mapObj, "data", &mapData));
     574            JS::RootedObject dataObj(cx, &mapData.toObject());
     575
     576            u32 length = 0;
     577            ENSURE(JS_GetArrayLength(cx, dataObj, &length));
     578            u32 nbytes = (u32)(length * sizeof(u8));
     579
     580            JS::AutoCheckCannotGC nogc;
     581            memcpy((void*)JS_GetUint8ArrayData(dataObj, nogc), m_TerritoryMap.m_Data, nbytes);
    539582        }
     583    }
    540584
     585    void StartComputation()
     586    {
    541587        m_CommandsComputed = false;
    542588    }
    543589
     
    10581104            cmpAIInterface->GetFullRepresentation(&state, false);
    10591105        else
    10601106            cmpAIInterface->GetRepresentation(&state);
     1107        LoadPathfinderClasses(state); // add the pathfinding classes to it
    10611108
    1062         // Get the passability data
    1063         Grid<NavcellData> dummyGrid;
    1064         const Grid<NavcellData>* passabilityMap = &dummyGrid;
     1109        // Update the game state
     1110        m_Worker.UpdateGameState(scriptInterface.WriteStructuredClone(state));
     1111
     1112        // Update the pathfinding data
    10651113        CmpPtr<ICmpPathfinder> cmpPathfinder(GetSystemEntity());
    10661114        if (cmpPathfinder)
    1067             passabilityMap = &cmpPathfinder->GetPassabilityGrid();
     1115        {
     1116            GridUpdateInformation dirtinessInformations = cmpPathfinder->GetDirtinessData();
    10681117
    1069         GridUpdateInformation dirtinessInformations = cmpPathfinder->GetDirtinessData();
     1118            if (dirtinessInformations.dirty)
     1119            {
     1120                const Grid<NavcellData>& passabilityMap = cmpPathfinder->GetPassabilityGrid();
    10701121
    1071         // Get the territory data
     1122                std::map<std::string, pass_class_t> nonPathfindingPassClassMasks, pathfindingPassClassMasks;
     1123                cmpPathfinder->GetPassabilityClasses(nonPathfindingPassClassMasks, pathfindingPassClassMasks);
     1124
     1125                m_Worker.UpdatePathfinder(passabilityMap, dirtinessInformations.globallyDirty, dirtinessInformations.dirtinessGrid,
     1126                    nonPathfindingPassClassMasks, pathfindingPassClassMasks);
     1127            }
     1128        }
     1129
     1130        // Update the territory data
    10721131        // Since getting the territory grid can trigger a recalculation, we check NeedUpdate first
    1073         bool territoryMapDirty = false;
    1074         Grid<u8> dummyGrid2;
    1075         const Grid<u8>* territoryMap = &dummyGrid2;
    10761132        CmpPtr<ICmpTerritoryManager> cmpTerritoryManager(GetSystemEntity());
    10771133        if (cmpTerritoryManager && cmpTerritoryManager->NeedUpdate(&m_TerritoriesDirtyID))
    10781134        {
    1079             territoryMap = &cmpTerritoryManager->GetTerritoryGrid();
    1080             territoryMapDirty = true;
     1135            const Grid<u8>& territoryMap = cmpTerritoryManager->GetTerritoryGrid();
     1136            m_Worker.UpdateTerritoryMap(territoryMap);
    10811137        }
    10821138
    1083         LoadPathfinderClasses(state);
    1084         std::map<std::string, pass_class_t> nonPathfindingPassClassMasks, pathfindingPassClassMasks;
    1085         if (cmpPathfinder)
    1086             cmpPathfinder->GetPassabilityClasses(nonPathfindingPassClassMasks, pathfindingPassClassMasks);
     1139        m_Worker.StartComputation();
    10871140
    1088         m_Worker.StartComputation(scriptInterface.WriteStructuredClone(state),
    1089             *passabilityMap, dirtinessInformations,
    1090             *territoryMap, territoryMapDirty,
    1091             nonPathfindingPassClassMasks, pathfindingPassClassMasks);
    1092 
    10931141        m_JustDeserialized = false;
    10941142    }
    10951143