1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-28 22:09:42 +00:00

Avoid allocating std::vector for a single element

This commit is contained in:
elsid 2023-10-29 13:38:20 +01:00
parent ac891a5eb1
commit 7290ce81c0
No known key found for this signature in database
GPG key ID: 4DE04C198CBA7625
3 changed files with 12 additions and 12 deletions

View file

@ -165,12 +165,12 @@ namespace MWWorld
class TerrainPreloadItem : public SceneUtil::WorkItem class TerrainPreloadItem : public SceneUtil::WorkItem
{ {
public: public:
TerrainPreloadItem(const std::vector<osg::ref_ptr<Terrain::View>>& views, Terrain::World* world, explicit TerrainPreloadItem(const std::vector<osg::ref_ptr<Terrain::View>>& views, Terrain::World* world,
const std::vector<PositionCellGrid>& preloadPositions) std::span<const PositionCellGrid> preloadPositions)
: mAbort(false) : mAbort(false)
, mTerrainViews(views) , mTerrainViews(views)
, mWorld(world) , mWorld(world)
, mPreloadPositions(preloadPositions) , mPreloadPositions(preloadPositions.begin(), preloadPositions.end())
{ {
} }
@ -380,10 +380,10 @@ namespace MWWorld
mTerrainPreloadItem->abort(); mTerrainPreloadItem->abort();
mTerrainPreloadItem->waitTillDone(); mTerrainPreloadItem->waitTillDone();
} }
setTerrainPreloadPositions(std::vector<PositionCellGrid>()); setTerrainPreloadPositions({});
} }
void CellPreloader::setTerrainPreloadPositions(const std::vector<PositionCellGrid>& positions) void CellPreloader::setTerrainPreloadPositions(std::span<const PositionCellGrid> positions)
{ {
if (positions.empty()) if (positions.empty())
{ {
@ -404,7 +404,7 @@ namespace MWWorld
mTerrainViews.emplace_back(mTerrain->createView()); mTerrainViews.emplace_back(mTerrain->createView());
} }
mTerrainPreloadPositions = positions; mTerrainPreloadPositions.assign(positions.begin(), positions.end());
if (!positions.empty()) if (!positions.empty())
{ {
mTerrainPreloadItem = new TerrainPreloadItem(mTerrainViews, mTerrain, positions); mTerrainPreloadItem = new TerrainPreloadItem(mTerrainViews, mTerrain, positions);

View file

@ -8,6 +8,7 @@
#include <osg/ref_ptr> #include <osg/ref_ptr>
#include <map> #include <map>
#include <span>
namespace osg namespace osg
{ {
@ -77,7 +78,7 @@ namespace MWWorld
void setWorkQueue(osg::ref_ptr<SceneUtil::WorkQueue> workQueue); void setWorkQueue(osg::ref_ptr<SceneUtil::WorkQueue> workQueue);
void setTerrainPreloadPositions(const std::vector<PositionCellGrid>& positions); void setTerrainPreloadPositions(std::span<const PositionCellGrid> positions);
void syncTerrainLoad(Loading::Listener& listener); void syncTerrainLoad(Loading::Listener& listener);
void abortTerrainPreloadExcept(const PositionCellGrid* exceptPos); void abortTerrainPreloadExcept(const PositionCellGrid* exceptPos);

View file

@ -1232,10 +1232,9 @@ namespace MWWorld
void Scene::preloadTerrain(const osg::Vec3f& pos, ESM::RefId worldspace, bool sync) void Scene::preloadTerrain(const osg::Vec3f& pos, ESM::RefId worldspace, bool sync)
{ {
ESM::ExteriorCellLocation cellPos = ESM::positionToExteriorCellLocation(pos.x(), pos.y(), worldspace); ESM::ExteriorCellLocation cellPos = ESM::positionToExteriorCellLocation(pos.x(), pos.y(), worldspace);
std::vector<PositionCellGrid> vec; const PositionCellGrid position{ pos, gridCenterToBounds({ cellPos.mX, cellPos.mY }) };
vec.emplace_back(pos, gridCenterToBounds({ cellPos.mX, cellPos.mY })); mPreloader->abortTerrainPreloadExcept(&position);
mPreloader->abortTerrainPreloadExcept(vec.data()); mPreloader->setTerrainPreloadPositions(std::span(&position, 1));
mPreloader->setTerrainPreloadPositions(vec);
if (!sync) if (!sync)
return; return;
@ -1249,7 +1248,7 @@ namespace MWWorld
void Scene::reloadTerrain() void Scene::reloadTerrain()
{ {
mPreloader->setTerrainPreloadPositions(std::vector<PositionCellGrid>()); mPreloader->setTerrainPreloadPositions({});
} }
struct ListFastTravelDestinationsVisitor struct ListFastTravelDestinationsVisitor