У меня есть такая древовидная структура: у модели есть корень Node, и каждый Node имеет любое количество дочерних узлов, а также любое количество мешей.
В моем приложении затрачивается время, затрачиваемое на перемещение этого дерева и выполнение вычислений, таких как просмотр frustrum culling и выполнение матричных умножений. В настоящее время он наивно реализован, где каждый Node имеет векторы дочерних узлов и сеток, и дерево рекурсивно перемещается. Это очень медленно.
Я смотрел на ориентированный на данные дизайн, и мне нравится идея, что он очень удобен для кеширования. Я думал о чем-то вроде этого:
struct Mesh
{
// misc data
MeshID mMeshID;
}
// probably needs more information?
struct Node
{
// begin and end index into Models 'mNodes'
uint32_t mChildrenBegin;
uint32_t mChildrenEnd;
// as above but for meshes
uint32_t mMeshesBegin;
uint32_t mMeshesEnd;
}
struct Model
{
std::vector<Node> mNodes;
std::vector<Mesh> mMeshes;
}
Теперь мне нужно пройти дерево, чтобы получить список видимых сеток. На каждом node я должен проверить, отображается ли Node. Следующие ветки:
- Видно Node. Все дочерние узлы и сетки под ним также видны. Не углубляйтесь в эту ветку. Проверьте другие узлы на той же глубине.
- Node не отображается. Никакие дочерние узлы или сетки на этом Node или ниже него не будут видны. Не углубляйтесь в эту ветку. Проверьте другие узлы на той же глубине.
- Node частично виден. Некоторые узлы и/или некоторые сетки видны. Должно идти глубже в иерархию.
Дерево статично. Когда модель загружается в приложение, дерево никогда не изменяется. Поэтому почему-то я должен использовать эту информацию для получения эффективной структуры.
Я озадачен тем, как это сделать.
Несколько вопросов;
- Как мне компоновать узлы в памяти? Является ли корень Node первым индексом? Добавлены ли другие узлы на основе глубины?
- Как выполнить итерацию дерева без использования рекурсии? Я не хочу посещать каждый Node, если я действительно не обязан. Например, если Node на глубине = 2 не видно, все его ячейки и дочерние элементы (и их ячейки) не должны проверяться, но полностью пропускаются.