Концепция
По сути, граф сцены - это не что иное, как двунаправленный ациклический граф, который служит для представления иерархически структурированного набора пространственных отношений.
Как отмечалось, в дикой природе двигатели, как отмечалось, имеют тенденцию включать другие полезности в граф сцены. Видите ли вы это как мясо или корова, вероятно, зависит от вашего опыта работы с двигателями и библиотеками.
Сохраняя это Легким
Я предпочитаю стиль Unity3D, в котором ваш узел графа сцены (который по своей сути является топологической, а не пространственно-топографической структурой) по своей сути включает пространственные параметры и функциональность. В моем движке мои узлы даже легче, чем Unity3D, где они наследуют много ненужных ненужных членов от суперклассов / реализованных интерфейсов: Вот что у меня есть - настолько легкое, насколько вы можете получить:
- члены родительского / дочернего указателя.
- Предварительно преобразовать элементы пространственных параметров: положение xyz, шаг, рыскание и крен.
- матрица преобразования; матрицы в иерархической цепочке могут очень быстро и легко размножаться, рекурсивно перемещаясь вверх / вниз по дереву, давая вам иерархические пространственные преобразования, которые являются основной особенностью графа сцены;
updateLocal()
метод , который обновляет только этот узел матрицы преобразования это
updateAll()
метод , который обновляет это и все дочерние узлы преобразования матриц
... Я также включил в свой класс узлов логику уравнений движения и, следовательно, элементы скорости / ускорения (линейные и угловые). Вы можете отказаться от этого и обрабатывать его в своем главном контроллере, если хотите. Но это все - действительно очень легкий. Помните, вы могли бы иметь это на тысячах сущностей. Так что, как вы и предлагали, держите это в руках.
Построение Иерархий
Что вы скажете о графе сцены, ссылающемся на другие графы сцены ... Я жду изюминку? Конечно, они делают. Это их основное использование. Вы можете добавить любой узел к любому другому узлу, и преобразования должны автоматически происходить в локальном пространстве нового преобразования. Все, что вы делаете, это меняете указатель, это не значит, что вы копируете данные! Изменяя указатель, вы получаете более глубокий граф сцены. Если использование Proxies делает вещи более эффективными, то конечно, но я никогда не видел в этом необходимости.
Избегайте рендеринга логики
Забудьте о рендеринге, когда будете писать класс узлов графа сцены, иначе вы все перепутаете сами. Все, что имеет значение, это то, что у вас есть модель данных - будь то граф сцены или нет, не имеет значения - и что какой-то рендер будет проверять эту модель данных и соответственно отображать объекты в мире, будь то в 1, 2 3 или 7 размеров. Идея, которую я делаю, заключается в следующем: не загрязняйте свой граф сцены логикой рендеринга. Граф сцены - это топология и топография, то есть связность и пространственные характеристики. Это истинное состояние симуляции и существует даже при отсутствии рендеринга (который может принимать любую форму под солнцем от вида от первого лица до статистического графика и текстового описания). Узлы не указывают на объекты, связанные с рендерингом - однако обратное вполне может быть верным. Также учтите это: Не каждый узел графа сцены во всем вашем дереве будет отображаться. Многие будут просто контейнерами. Так зачем вообще выделять память для указателя на объект рендера? Даже элемент указателя, который никогда не используется, все еще занимает память. Так что поменяйте направление указателя: связанный с рендерингом экземпляр ссылается на модель данных (которая может быть или включает ваш граф графа сцены), а НЕ наоборот. И если вам нужен простой способ пробежаться по списку контроллеров, но получить доступ к связанному представлению, используйте словарь / хеш-таблицу, которая приближается к O (1) времени доступа для чтения. Таким образом, нет никакого загрязнения, и вашей логике симуляции все равно, какие рендеры находятся на месте, что делает ваши дни и ночи кодирования Так зачем вообще выделять память для указателя на объект рендера? Даже элемент указателя, который никогда не используется, все еще занимает память. Так что поменяйте направление указателя: связанный с рендерингом экземпляр ссылается на модель данных (которая может быть или включает ваш граф графа сцены), а НЕ наоборот. И если вам нужен простой способ пробежаться по списку контроллеров, но получить доступ к связанному представлению, используйте словарь / хеш-таблицу, которая приближается к O (1) времени доступа для чтения. Таким образом, нет никакого загрязнения, и вашей логике симуляции все равно, какие рендеры находятся на месте, что делает ваши дни и ночи кодирования Так зачем вообще выделять память для указателя на объект рендера? Даже элемент указателя, который никогда не используется, все еще занимает память. Так что поменяйте направление указателя: связанный с рендерингом экземпляр ссылается на модель данных (которая может быть или включает ваш граф графа сцены), а НЕ наоборот. И если вам нужен простой способ пробежаться по списку контроллеров, но получить доступ к связанному представлению, используйте словарь / хеш-таблицу, которая приближается к O (1) времени доступа для чтения. Таким образом, нет никакого загрязнения, и вашей логике симуляции все равно, какие рендеры находятся на месте, что делает ваши дни и ночи кодирования И если вам нужен простой способ пробежаться по списку контроллеров, но получить доступ к связанному представлению, используйте словарь / хеш-таблицу, которая приближается к O (1) времени доступа для чтения. Таким образом, нет никакого загрязнения, и вашей логике симуляции все равно, какие рендеры находятся на месте, что делает ваши дни и ночи кодирования И если вам нужен простой способ пробежаться по списку контроллеров, но получить доступ к связанному представлению, используйте словарь / хеш-таблицу, которая приближается к O (1) времени доступа для чтения. Таким образом, нет никакого загрязнения, и вашей логике симуляции все равно, какие рендеры находятся на месте, что делает ваши дни и ночи кодированияМиры проще.
Что касается отбраковки, вернитесь к вышесказанному. Отбор интересующей области - это логическая концепция симуляции. То есть вы не обрабатываете мир за пределами этой (обычно коробочной, круглой или сферической) области. Это происходит в главном контроллере / игровом цикле, прежде чем происходит рендеринг. С другой стороны, отбраковка усеченного конуса чисто связана с визуализацией. Так что забудьте об отбраковке прямо сейчас. Это не имеет ничего общего с графами сцен, и, сосредоточившись на нем, вы будете скрывать истинную цель того, чего пытаетесь достичь.
Заключительная записка ...
Я чувствую, что вы пришли из Flash (особенно AS3), учитывая все детали рендеринга, включенные здесь. Да, парадигма Flash Stage / DisplayObject включает в себя всю логику рендеринга как часть графа сцены. Но Flash делает много предположений, которые вы не обязательно хотите делать. Для полноценного игрового движка лучше не смешивать их по причинам производительности, удобства и управления сложностью кода с помощью надлежащей SoC .
Renderable
с (который представляет собой интерфейс или абстрактный класс) внутренне этих основных объектов модели-контроллера. Хорошими примерами этого являются объекты или элементы пользовательского интерфейса. Таким образом, вы можете быстро получить доступ только к тем средствам визуализации, которые относятся к этому конкретному базовому объекту - без особенностей реализации, которые могли бы загрязнить класс сущности, а следовательно, и использование интерфейсов.Renderer
.