1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-20 16:41:33 +00:00

Change priorities in World::searchPtr

Fixes performance bottleneck of scripts searching through all Containers in all active cells every frame. Can be observed near cell (2,-6)
This commit is contained in:
scrawl 2014-09-07 19:09:23 +02:00
parent adbc50366b
commit fe0c9ec9b7

View file

@ -578,13 +578,29 @@ namespace MWWorld
std::string lowerCaseName = Misc::StringUtils::lowerCase(name); std::string lowerCaseName = Misc::StringUtils::lowerCase(name);
// active cells for (Scene::CellStoreCollection::const_iterator iter (mWorldScene->getActiveCells().begin());
iter!=mWorldScene->getActiveCells().end(); ++iter)
{
// TODO: caching still doesn't work efficiently here (only works for the one CellStore that the reference is in)
CellStore* cellstore = *iter;
Ptr ptr = mCells.getPtr (lowerCaseName, *cellstore, false);
if (!ptr.isEmpty())
return ptr;
}
if (!activeOnly)
{
ret = mCells.getPtr (lowerCaseName);
if (!ret.isEmpty())
return ret;
}
for (Scene::CellStoreCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); for (Scene::CellStoreCollection::const_iterator iter (mWorldScene->getActiveCells().begin());
iter!=mWorldScene->getActiveCells().end(); ++iter) iter!=mWorldScene->getActiveCells().end(); ++iter)
{ {
CellStore* cellstore = *iter; CellStore* cellstore = *iter;
Ptr ptr = mCells.getPtr (lowerCaseName, *cellstore, true); Ptr ptr = cellstore->searchInContainer(lowerCaseName);
if (!ptr.isEmpty()) if (!ptr.isEmpty())
return ptr; return ptr;
} }
@ -592,14 +608,7 @@ namespace MWWorld
Ptr ptr = mPlayer->getPlayer().getClass() Ptr ptr = mPlayer->getPlayer().getClass()
.getContainerStore(mPlayer->getPlayer()).search(lowerCaseName); .getContainerStore(mPlayer->getPlayer()).search(lowerCaseName);
if (!ptr.isEmpty())
return ptr; return ptr;
if (!activeOnly)
{
ret = mCells.getPtr (lowerCaseName);
}
return ret;
} }
Ptr World::getPtr (const std::string& name, bool activeOnly) Ptr World::getPtr (const std::string& name, bool activeOnly)