button('hey')
вызывает функцию, а не устанавливает ее как обратный вызов.
Как примечание стороны:
"прямой режим" (glBegin/glEnd) не поддерживается в:
Поэтому, если Вы когда-нибудь планируете портировать свое приложение на мобильную платформу (например, iPhone), даже не привыкайте к нему.
я преподаю OpenGL в Университете, и слайд, объясняя glBegin/glEnd имеет большое красное поле вокруг этого с дополнительным полужирным, "НЕ ИСПОЛЬЗУЮТ" заголовок.
Используя массивы вершины всего две строки больше, и Вы сохраняете циклы с самого начала.
Существует много факторов к оптимизации 3D рендеринга. обычно существует 4 узких места:
Ваш тест дает скошенные результаты, потому что у Вас есть много ЦП (и шина), истратив пиксельная пропускная способность или вершина. VBOs используются для понижения ЦП (меньше вызовов API, параллельных передачам DMA ЦП). Так как Вы не являетесь зависящими от ЦП, они не дают Вам усиления. Это - оптимизация 101. В игре, например, ЦП становится драгоценным, поскольку он необходим для других вещей как AI и физика, не только для издания тонн вызовов API. Легко видеть, что запись данных вершины (3 плавания, например) непосредственно к указателю памяти намного быстрее, чем вызывание функции, которая пишет 3 плавания в память - по крайней мере Вы сохраняете циклы для вызова.
Могло бы быть несколько вещей, отсутствующих:
Это - произвольное предположение, но Ваш ноутбук карта могла бы пропускать этот вид операции вообще (т.е. эмулировать его).
Вы копирующий данные в память GPU (через glBufferData
(GL_ARRAY_BUFFER
или с GL_STATIC_DRAW
или с GL_DYNAMIC_DRAW
параметрический усилитель), или Вы используете указатель на основной (не GPU) массив в памяти? (который требует копирования его каждый кадр, и поэтому производительность является медленной)
, Вы передающий индексы как другой буфер, отправленный через glBufferData
и GL_ELEMENT_ARRAY_BUFFER
параметрические усилители?
, Если те три вещи сделаны, увеличение производительности является большим. Для Python (v/pyOpenGl) это приблизительно в 1000 раз быстрее на массивах, больше, чем пара 100 элементов, C++ до 5 раз быстрее, но на массивах 50k-10m вершины.
Вот мои результаты испытаний для C++ (Core2Duo/8600GTS):
pts vbo glb/e ratio
100 3900 3900 1.00
1k 3800 3200 1.18
10k 3600 2700 1.33
100k 1500 400 3.75
1m 213 49 4.34
10m 24 5 4.80
поэтому даже с вершинами на 10 м это был нормальный framerate, в то время как с glB/e это было вяло.
От чтения Красной книги я помню проход, который указал, что VBOs возможно быстрее в зависимости от аппаратных средств . Некоторые аппаратные средства оптимизируют тех, в то время как другие не делают. Возможно, что Ваши аппаратные средства не делают.
Принятие я помню это право мой учитель OpenGL, который известен в сообществе OpenGL, сказало, что они быстрее на статической геометрии, которая будет, представляют много времени на типичной игре, это будет стулом таблиц и маленькими статическими объектами.
14 млн точек / с - это не так уж много. Это подозрительно. можем ли мы увидеть полный код, выполняющий рисование, а также инициализацию? (сравните эти 14М / с с 240М / с (!), которые получает Слава Вишняков). Еще более подозрительно то, что он падает до 640K / s для 1K розыгрышей (по сравнению с его 3,8M / s, что в любом случае кажется ограниченным ~ 3800 SwapBuffers).
Я готов поспорить, что тест не измеряет то, что вы думаю, это меры.