Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 1 год назад.
У меня есть проект, в котором имеются классы: View, Scene, Item и Renderer. Тобишь у меня есть некая сцена, которую я отображаю во вью вместе с доступными в заданном пространстве итемами. Для прорисовки используется opengles, вызовы которого скрыты за методами класса Renderer, который управляет opengl программами, шейдерами а также отрисовывает текстуры.
Изначально все было построено так: View выясняет у Scene какие Item-s видны и передает ему уже сконфигурированный объект класса Renderer в метод render. В этом методе Item просто дергает нужный метод из Renderer (вроде renderRing). После всего этого буферы свапаются и мы видим изображение. Однако это не оптимально из-за того, что в на gpu каждый раз передаются данные, которые уже были переданы до этого (к тому каждый раз происходят вычисления, вроде триангуляции, что тоже плохо). Чтобы избежать этого я создал класс Cache который использует VAO для обращения к уже переданным на GPU данным. Теперь методы Renderer возвращают Cache который мы можем сохранить и использовать для рендеринга в дальнейшем. Но это оказалось плохой идеей: дело в том, что если мы имеем несколько View то Cache все равно будет создан только один раз (так как сцена все равно одна), а из-за этого во втором View картинка не может быть прорисована (так как там другой Renderer с другой программой.
Как правильно организовать класс Renderer исходя из вышеизложенного? Следует также учесть, что классы View и Item изначально абстрактные и количество наследников нам изначально не может быть известно (соответсвенно я не могу для Renderer сдесь применить визитера). Я полагаю, что необходимо хранить Cache не в итемах, а именно в Renderer (что позволит использовать несколько View), но не могу понять как это правильно организовать.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей