Я немного поэкспериментировал и теперь могу отобразить около 3 миллионов GL_QUADS на экране, используя
glDrawArrays(GL_QUADS, 0, nVertexCount);
Я также использую множественную буферизацию, циклически перебирая 18 объектов буфера вершин по 1 миллиону вершин каждый. Каждая позиция вершины вычисляется с использованием сжатых данных, хранящихся в куче, и простого вычисления. я использую
ptr = (float*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
и
glUnmapBuffer(GL_ARRAY_BUFFER);
для записи каждой отдельной вершины в объекты буфера каждый кадр. Когда буферный объект заполнен, я отключаю его, вызываю glDrawArrays, связываю и сопоставляю следующий VBO для потоковой передачи дополнительных данных вершин. Когда все 18 будут использованы, я логически привязываю первый и начинаю заново.
По моему опыту, использование отображения VBO почти в два раза быстрее, чем использование массивов кучи для данных вершин. Откуда я знаю? Потому что, поскольку я рендерю 3 миллиона GL_QUADS, частота кадров значительно ниже 30 кадров в секунду. Я просто могу своими глазами наблюдать, как частота кадров удваивается для VBO.
Я также заметил, что вызов glDrawArrays дважды подряд для каждого заполненного объекта буфера вершин (что приводит к рендерингу в два раза большего количества четырехугольников, но одно усилие для потоковой передачи данных вершин) лишь незначительно медленнее, чем рендеринг только один раз. Поэтому я предполагаю, что основным узким местом является потоковая передача данных вершин в объекты буфера вершин (двуядерный процессор с частотой 2 ГГц занят этим на 60%!!).
Прямо сейчас каждая вершина занимает 3 числа с плавающей запятой плюс 2 числа с плавающей запятой для координат текстуры. (всего 20 байт). Думаю, я мог бы сократить это количество до 3 GL_SHORT плюс 2 GL_SHORT для координат текстуры. с использованием матриц перевода (всего 5 байт), но это ускорило бы только в 4 раза. (И каким-то образом sizeof(GL_SHORT) дает 4 в моей системе, так что я тоже не уверен в этом.)
Во всяком случае, есть игры, которые уже довольно старые, но отображают на экране гораздо больше 3 миллионов примитивов в каждом кадре (и им неизбежно приходится стримить эти вершины, потому что ни один GPU не может хранить столько данных) и при этом получить приличную частоту кадров более 100 кадров в секунду!
Я уверен, что мне все еще не хватает какого-то важного момента в процессе, но я просто не могу понять, что это такое. Какие-либо предложения?
РЕДАКТИРОВАТЬ: Это свободные квадроциклы, как в системе частиц. (Или, скорее, потому, что на каждой из них может оказаться другая текстура (текстуры берутся из подтекстур одной, поэтому нет обширной привязки ;)))