Я немного экспериментировал и теперь могу вывести на экран около 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 миллионов примитивов на экране каждый раз (и они неизбежно должны передавать эти вершины, потому что ни один графический процессор не может удерживать так много). много данных) и при этом получить приличную частоту кадров более 100 кадров в секунду!
Я уверен, что мне все еще не хватает какого-то важного момента в процессе, но я просто не могу понять, что это такое. Есть предложения?
EDIT:
Это свободные квадраты, как в системе частиц. (Или, скорее, потому, что у каждого может быть своя текстура (текстуры взяты из подтекстов одного, поэтому не требуется обширного связывания;)))