Все игровые объекты в одном списке или нескольких списках по типу?
Обычно ли видеоигры пытаются сохранить один список сущностей и обновить их в соответствии с их типом? Или, как это начинает казаться более удобным, сохранить каждый тип в своем собственном списке или, по крайней мере, обобщить и иметь несколько разных списков?
В моем конкретном примере у меня есть один список со всеми типами, введенными в него, и я проверяю их на тип, оперируя ими по мере необходимости. Тот же список выполняется через физический движок и механизм рендеринга. Теперь я начинаю добавлять типы, которые должны реагировать с другими такого же типа в одном направлении и с игроком в другом.
Например, тип "враг" должен проверять столкновение с другими "врагами", чтобы избежать укладки (2D-игра), в то же время необходимо проверять игрока на столкновение. Если бы все враги были в одном списке, это было бы намного проще.
Больше всего на свете я ищу лучшую практику. Я понимаю, что каждая игра отличается, и один размер не подходит всем, но должна быть какая-то общая мудрость.
2 ответа:
Насколько я знаю, обычно в игре используется несколько списков для нескольких целей, например, они используют какую-то объектную иерархию, чтобы легко отслеживать все позиции объектов, а с другой стороны, они сохраняют одни и те же указатели в линейном массиве для всех физических вещей, которые им нужно сделать. Я имею в виду, что нет никакого ограничения, сколько раз вы можете иметь рефрен к объекту, и указатель обычно имеет очень небольшую стоимость (4 байта за один), так что пока вы можете отслеживать все указатели на некоторый экземпляр Я думаю, что лучше всего сделать несколько списков из них для разных целей. в вашем примере для управления сценой я бы предпочел некоторую древовидную (родительско-дочернюю) структуру данных, это очень помогает, когда вы можете установить позиции объектов относительно и создать несколько списков коллайдеров и коллидий для тестов столкновений в физическом движке все снова с теми же указателями, используемыми в диспетчере сцен.
Для коллизий использование только списков быстро съест производительность из-за экспоненциального характера проверки каждого нового объекта против всех существующих объектов.
Чтобы все шло гладко, обычно существует метод обнаружения столкновений на широкой фазе, позволяющий сравнивать только объекты, находящиеся в разумной близости друг от друга.
Два распространенных метода в 2D-играх для этого-сетки и квадратичные деревья.
Вот довольно хорошее объяснение четырех деревьев, написанных для код ActionScript: http://lab.polygonal.de/2007/09/09/quadtree-demonstration/
Этот форум дает хорошее объяснение относительных достоинств квадратичных деревьев против сеток.
Но использование любого из них значительно ускорит цикл столкновения по сравнению с простым сравнением списков.