Я продолжаю сталкиваться с этой проблемой при создании игровых движков, где мои классы хотят выглядеть так:
interface Entity {
draw();
}
class World {
draw() {
for (e in entities)
e.draw();
}
}
Это просто псевдокод, чтобы примерно показать, как происходит рисование.Каждый подкласс сущности реализует свой собственный чертеж.Мир проходит через все сущности в произвольном порядке и говорит им рисовать себя один за другим.
Но с шейдерной графикой это может быть ужасно неэффективным или даже неосуществимым.Каждый тип сущности, вероятно, будет иметь свою собственную шейдерную программу.Чтобы свести к минимуму изменения программы, все сущности каждого конкретного типа должны быть нарисованы вместе .Простые типы объектов, такие как частицы, могут также захотеть объединить свои рисунки другими способами, например, использовать один большой массив вершин.И это становится действительно неуместным с наложением и таким, когда некоторые типы сущностей необходимо визуализировать в определенное время относительно других, или даже несколько раз для разных проходов.синглтон для каждого класса сущностей, который хранит список всех экземпляров и рисует их все сразу.Это не так уж и плохо, поскольку отделяет рисунок от логики игры.Но средство визуализации должно выяснить, какое подмножество объектов нужно нарисовать, и ему нужен доступ к нескольким различным частям графического конвейера.Вот где моя объектная модель имеет тенденцию запутываться, с большим количеством дублирующегося кода, жесткой связью и другими плохими вещами.
Поэтому мой вопрос: какова хорошая архитектура для этого вида игровой графики, которая эффективна?, универсальный и модульный?