Повышают ли VBO производительность, даже если все данные часто меняются - PullRequest
1 голос
/ 21 июля 2011

Я делаю двухмерную пошаговую RTS-игру с плитками 32x32 (400-500 плиток на кадр).Я мог бы использовать VBO для этого, но мне, возможно, придется менять почти все данные VBO в каждом кадре, так как фон прокручивается, и видимые плитки будут меняться каждый раз, когда карта прокручивается.Будет ли использование VBO, а не клиентских массивов вершин, по-прежнему приносить выигрыш в производительности?Также, если вы используете VBO, какой формат данных наиболее эффективен (float, или int16, или ...)?

Ответы [ 2 ]

8 голосов
/ 21 июля 2011

Если вы просто прокручиваете, вы можете использовать вершинный шейдер, чтобы манипулировать положением, а не обновлять сами вершины. Передайте значение 'прокрутки' как форму для вашего фона и просто добавьте это значение к значению x (или y, или что-либо применимо к вашему случаю) каждой вершины.

Обновление:

Если вы собираетесь часто модифицировать VBO, вы можете сообщить об этом водителю, используя параметр usage glBufferData. На этой странице есть хорошее описание того, как это работает: http://www.opengl.org/wiki/Vertex_Buffer_Object, в разделе Доступ к VBO. В вашем случае, похоже, вы должны указать от GL_DYNAMIC_DRAW до glBufferData, чтобы драйвер поместил ваш VBO в лучшее место в памяти для вашего приложения.

2 голосов
/ 22 июля 2011

Обычный подход заключается в перемещении камеры и выполнении отбраковки вместо обновления содержимого VBO. Для отбраковки двухмерной игры будет использоваться простой алгоритм пересечения прямоугольников, который вам в любом случае понадобится для выбора юнитов в игре. В качестве бонуса, манипулирование камерой позволит оценивать камеру и увеличивать и уменьшать масштаб. Также вы можете объединить несколько плиток (4, 9 или 16) в один VBO.

Я бы настоятельно рекомендовал не писать логику, чтобы перемещать плитки вместо камеры. Это займет у вас больше времени, будет больше ошибок и будет менее гибким.

Формат будет зависеть от того, какие данные вы храните в VBO. Если есть сомнения, просто используйте uint8 для цвета и float32 для всего остального. Хотя для двумерной игры ваши VBO или массив вершин будут очень маленькими по сравнению с 3d-приложениями, поэтому маловероятно, что VBO что-то изменит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...