From 7290ce81c04de5bbda719d02612d79b764017f76 Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 29 Oct 2023 13:38:20 +0100 Subject: [PATCH] Avoid allocating std::vector for a single element --- apps/openmw/mwworld/cellpreloader.cpp | 12 ++++++------ apps/openmw/mwworld/cellpreloader.hpp | 3 ++- apps/openmw/mwworld/scene.cpp | 9 ++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/openmw/mwworld/cellpreloader.cpp b/apps/openmw/mwworld/cellpreloader.cpp index 4357f8ba57..2881471b25 100644 --- a/apps/openmw/mwworld/cellpreloader.cpp +++ b/apps/openmw/mwworld/cellpreloader.cpp @@ -165,12 +165,12 @@ namespace MWWorld class TerrainPreloadItem : public SceneUtil::WorkItem { public: - TerrainPreloadItem(const std::vector>& views, Terrain::World* world, - const std::vector& preloadPositions) + explicit TerrainPreloadItem(const std::vector>& views, Terrain::World* world, + std::span preloadPositions) : mAbort(false) , mTerrainViews(views) , mWorld(world) - , mPreloadPositions(preloadPositions) + , mPreloadPositions(preloadPositions.begin(), preloadPositions.end()) { } @@ -380,10 +380,10 @@ namespace MWWorld mTerrainPreloadItem->abort(); mTerrainPreloadItem->waitTillDone(); } - setTerrainPreloadPositions(std::vector()); + setTerrainPreloadPositions({}); } - void CellPreloader::setTerrainPreloadPositions(const std::vector& positions) + void CellPreloader::setTerrainPreloadPositions(std::span positions) { if (positions.empty()) { @@ -404,7 +404,7 @@ namespace MWWorld mTerrainViews.emplace_back(mTerrain->createView()); } - mTerrainPreloadPositions = positions; + mTerrainPreloadPositions.assign(positions.begin(), positions.end()); if (!positions.empty()) { mTerrainPreloadItem = new TerrainPreloadItem(mTerrainViews, mTerrain, positions); diff --git a/apps/openmw/mwworld/cellpreloader.hpp b/apps/openmw/mwworld/cellpreloader.hpp index f8b5c87c39..405ba96a2e 100644 --- a/apps/openmw/mwworld/cellpreloader.hpp +++ b/apps/openmw/mwworld/cellpreloader.hpp @@ -8,6 +8,7 @@ #include #include +#include namespace osg { @@ -77,7 +78,7 @@ namespace MWWorld void setWorkQueue(osg::ref_ptr workQueue); - void setTerrainPreloadPositions(const std::vector& positions); + void setTerrainPreloadPositions(std::span positions); void syncTerrainLoad(Loading::Listener& listener); void abortTerrainPreloadExcept(const PositionCellGrid* exceptPos); diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index c918e2d78e..202b500fdd 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -1232,10 +1232,9 @@ namespace MWWorld void Scene::preloadTerrain(const osg::Vec3f& pos, ESM::RefId worldspace, bool sync) { ESM::ExteriorCellLocation cellPos = ESM::positionToExteriorCellLocation(pos.x(), pos.y(), worldspace); - std::vector vec; - vec.emplace_back(pos, gridCenterToBounds({ cellPos.mX, cellPos.mY })); - mPreloader->abortTerrainPreloadExcept(vec.data()); - mPreloader->setTerrainPreloadPositions(vec); + const PositionCellGrid position{ pos, gridCenterToBounds({ cellPos.mX, cellPos.mY }) }; + mPreloader->abortTerrainPreloadExcept(&position); + mPreloader->setTerrainPreloadPositions(std::span(&position, 1)); if (!sync) return; @@ -1249,7 +1248,7 @@ namespace MWWorld void Scene::reloadTerrain() { - mPreloader->setTerrainPreloadPositions(std::vector()); + mPreloader->setTerrainPreloadPositions({}); } struct ListFastTravelDestinationsVisitor