Skeleton: Improve skeleton copy performance (O(n²) => O(n))
This commit is contained in:
parent
9e56592211
commit
4a55d40aec
|
|
@ -216,23 +216,17 @@ namespace Nz
|
||||||
m_impl->jointMapUpdated = skeleton.m_impl->jointMapUpdated;
|
m_impl->jointMapUpdated = skeleton.m_impl->jointMapUpdated;
|
||||||
m_impl->joints = skeleton.m_impl->joints;
|
m_impl->joints = skeleton.m_impl->joints;
|
||||||
|
|
||||||
// Code crade mais son optimisation demanderait de stocker jointCount*sizeof(std::size_t) en plus
|
// Restore parent hierarchy
|
||||||
// Ce qui, pour juste une copie qui ne se fera que rarement, ne vaut pas le coup
|
const Joint* firstJoint = skeleton.m_impl->joints.data();
|
||||||
// L'éternel trade-off mémoire/calculs ..
|
|
||||||
std::size_t jointCount = skeleton.m_impl->joints.size();
|
std::size_t jointCount = skeleton.m_impl->joints.size();
|
||||||
for (std::size_t i = 0; i < jointCount; ++i)
|
for (std::size_t i = 0; i < jointCount; ++i)
|
||||||
{
|
{
|
||||||
const Node* parent = skeleton.m_impl->joints[i].GetParent();
|
const Node* parent = skeleton.m_impl->joints[i].GetParent();
|
||||||
if (parent)
|
if (parent)
|
||||||
{
|
{
|
||||||
for (std::size_t j = 0; j < i; ++j) // Le parent se trouve forcément avant nous
|
std::size_t parentIndex = SafeCast<std::size_t>(firstJoint - parent);
|
||||||
{
|
m_impl->joints[i].SetParent(m_impl->joints[parentIndex]);
|
||||||
if (parent == &skeleton.m_impl->joints[j]) // A-t-on trouvé le parent ?
|
|
||||||
{
|
|
||||||
m_impl->joints[i].SetParent(m_impl->joints[j]); // Oui, tout ça pour ça
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue