Когда VBOs быстрее, чем “простые” примитивы OpenGL (glBegin ())?

button('hey') вызывает функцию, а не устанавливает ее как обратный вызов.

36
задан shoosh 12 January 2009 в 03:28
поделиться

6 ответов

Как примечание стороны:
"прямой режим" (glBegin/glEnd) не поддерживается в:

  • OpenGLES.
  • OpenGL 3.x.
  • Поэтому, если Вы когда-нибудь планируете портировать свое приложение на мобильную платформу (например, iPhone), даже не привыкайте к нему.

    я преподаю OpenGL в Университете, и слайд, объясняя glBegin/glEnd имеет большое красное поле вокруг этого с дополнительным полужирным, "НЕ ИСПОЛЬЗУЮТ" заголовок.

    Используя массивы вершины всего две строки больше, и Вы сохраняете циклы с самого начала.

    4
    ответ дан Andreas 8 August 2019 в 17:13
    поделиться

    Существует много факторов к оптимизации 3D рендеринга. обычно существует 4 узких места:

    • ЦП (создающий вершины, вызовы APU, все остальное)
    • Шина (CPU<-> передача GPU)
    • Вершина (вершинный шейдер по выполнению конвейера стандартных функций)
    • Пиксель (заливка, выполнение программы построения теней фрагмента и rops)

    Ваш тест дает скошенные результаты, потому что у Вас есть много ЦП (и шина), истратив пиксельная пропускная способность или вершина. VBOs используются для понижения ЦП (меньше вызовов API, параллельных передачам DMA ЦП). Так как Вы не являетесь зависящими от ЦП, они не дают Вам усиления. Это - оптимизация 101. В игре, например, ЦП становится драгоценным, поскольку он необходим для других вещей как AI и физика, не только для издания тонн вызовов API. Легко видеть, что запись данных вершины (3 плавания, например) непосредственно к указателю памяти намного быстрее, чем вызывание функции, которая пишет 3 плавания в память - по крайней мере Вы сохраняете циклы для вызова.

    27
    ответ дан Colonel Thirty Two 10 October 2019 в 11:06
    поделиться

    Могло бы быть несколько вещей, отсутствующих:

    1. Это - произвольное предположение, но Ваш ноутбук карта могла бы пропускать этот вид операции вообще (т.е. эмулировать его).

    2. Вы копирующий данные в память GPU (через glBufferData (GL_ARRAY_BUFFER или с GL_STATIC_DRAW или с GL_DYNAMIC_DRAW параметрический усилитель), или Вы используете указатель на основной (не GPU) массив в памяти? (который требует копирования его каждый кадр, и поэтому производительность является медленной)

    3. , Вы передающий индексы как другой буфер, отправленный через 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 это было вяло.

    10
    ответ дан Lol4t0 10 October 2019 в 11:06
    поделиться

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

    2
    ответ дан Will Mc 10 October 2019 в 11:06
    поделиться

    Принятие я помню это право мой учитель OpenGL, который известен в сообществе OpenGL, сказало, что они быстрее на статической геометрии, которая будет, представляют много времени на типичной игре, это будет стулом таблиц и маленькими статическими объектами.

    -1
    ответ дан steve9164 10 October 2019 в 11:06
    поделиться

    14 млн точек / с - это не так уж много. Это подозрительно. можем ли мы увидеть полный код, выполняющий рисование, а также инициализацию? (сравните эти 14М / с с 240М / с (!), которые получает Слава Вишняков). Еще более подозрительно то, что он падает до 640K / s для 1K розыгрышей (по сравнению с его 3,8M / s, что в любом случае кажется ограниченным ~ 3800 SwapBuffers).

    Я готов поспорить, что тест не измеряет то, что вы думаю, это меры.

    1
    ответ дан 27 November 2019 в 06:14
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: