OpenGL ES 2.0: эффективный рендеринг статических и динамических данных вершин

Я пишу игру для iOS/Android и ищу наиболее эффективный способ рендеринга данных вершин с помощью OpenGL ES 2.0. У меня есть два разных типа данных: динамические данные, которые меняют свои атрибуты в каждом кадре, например, игрок или анимированные фоновые объекты, и статические данные, такие как статический фон или ландшафт. Я много гуглил со вчерашнего дня, но не смог найти четкого и однозначного ответа на вопрос, что лучше всего было отображать такие данные.

В основном есть три варианта рендеринга таких данных (если я не пропущу ни одного. Если это так, не стесняйтесь меня поправлять.):

Только массивы вершин. Просто заполняйте свои вершины каждым кадром процессора (включая динамические данные).

Только объекты буфера вершин: Выделите VBO на графическом процессоре с помощью GL_DYNAMIC_DRAW, где хранятся как динамические, так и статические данные. Затем динамические данные обновляются каждый кадр через glBufferSubData.

Используйте оба варианта: статические данные сохраняются и обрабатываются с помощью VBO, а динамические данные обрабатываются с помощью массива вершин. С этой опцией нам нужно два прохода рендеринга, один для рендеринга VBO и один для рендеринга массива вершин.

Поскольку первый вариант не использует неизменность статических данных, а третий вариант требует двух проходов рендеринга, я предполагаю, что мне следует выбрать второй вариант. Однако я абсолютно не уверен в этом, и я надеюсь, что вы можете прояснить мое замешательство.


person Sven    schedule 11.09.2013    source источник
comment
Насколько я знаю, основная и видеопамять в телефонах физически одинаковы. Раньше я использовал только Android, но не видел разницы в скорости массива вершин (динамический) и VBO (буферизация/более статическая). Графика может быть очень неудобной и во многих случаях неинтуитивной, поэтому дополнительное время, потраченное на написание простых тестов, может окупиться. Если можете, заставьте GPU выполнять анимацию и изменение ваших данных :)   -  person jozxyqk    schedule 11.09.2013


Ответы (1)


Выделите два объекта буфера вершин. Один с подсказкой GL_DYNAMIC_DRAW, который будет часто обновляться. Выделите второй VBO для неизменяемых данных и используйте подсказку GL_STATIC_DRAW. Согласно документации API следует использовать GL_STATIC_DRAW для данных, которые "будут изменены один раз и использованы много раз"; именно то, что вам нужно.

Говоря о двух проходах рендеринга, здесь, вероятно, используется неправильное использование термина: то, что вы делаете, это визуализирует вашу сцену с помощью двух отдельных команд рисования. Поскольку команды рисования выполняются асинхронно, это не должно сказаться на производительности. С другой стороны, второй проход рендеринга — это когда вы рендерите всю сцену дважды (см., например, здесь) с другими настройками или когда вы применяете некоторые эффекты обработки изображений к результатам предыдущих проходов рендеринга.

person umlum    schedule 11.09.2013