Почему мое 2D-приложение работает быстрее на встроенной видеокарте?
Я работаю над 2D-графическим приложением с OpenGL(например, QGIS). Недавно, когда я тестировал некоторые тесты, между двумя моими графическими картами была странная разница в производительности. Поэтому я сделал простой тест и нарисовал всего 1 миллион квадратов, используя VBO. Таким образом, есть 4 м вершины каждые 20 байтов, поэтому мой общий размер VBO составляет 80 МБ. И я рисую все с помощью одного вызова DrawElements. Когда я измерял время рендеринга на своем ноутбуке, который имеет 2 графические карты, он работал около 43 мс на Geforce и около 1 мс на интегрированной карте Intel. Но я ожидал быть быстрее на Geforce. Почему это так? Должен ли я отключить некоторые опции Opengl?
Моя системная спецификация: ASUS N53m со встроенной видеокартой и Geforce GT 610m
РЕДАКТИРОВАТЬ:
Я также тестировал на другой системе с AMD Radeon HD 5450, снова было около 44 мс. Вместо этого я также использовал одинарную точность, и она уменьшилась до 30 мс. Но все же встроенный графический процессор работает быстрее! Это определенно не проблема измерения, потому что я могу видеть отставание при увеличении / уменьшении.
1 ответ
Поведение во время выполнения различных реализаций OpenGL значительно отличается, как я обнаружил в своих экспериментах, касающихся методов рендеринга с малой задержкой для VR. В общем, единственный действительно надежный временной интервал для измерения, который дает согласованные результаты, - это межкадровое время между тем же шагом на чертеже. Т.е. измерять время от замены буфера до замены буфера (если вы хотите измерить производительность необработанного рисования, отключить V-Sync) или между тем же glClear
звонки.
Все остальное согласуется только в определенной реализации, но не между поставщиками (на момент тестирования у меня не было AMD GPU, поэтому у меня нет данных по этому вопросу). Несколько заметных угловых случаев, которые я обнаружил:
SwapBuffers
- NVidia: возвращается только после того, как буфер обмена был представлен. Это означает: либо ожидает V-Sync, либо возвращается только после замены буферов
- Intel/Linux/X11: всегда возвращается немедленно. V-Sync влияет на следующий вызов OpenGL, который воздействует на пиксели в еще не представленном буфере и не помещается в очередь команд. Следовательно, "очистка" области просмотра с помощью большого квадроцикла, скайбокса или использование метода глубинного пинг-понга (встречается только в очень старых приложениях) дает очень несовместимые интервалы кадров. glClear будет надежно блокироваться до V-Sync после замены
glFinish
- NVidia: фактически завершает рендеринг, как и ожидалось
- Intel/Linux/X11: рисование в задний буфер, действует как No-Op, рисование в передний буфер действует как финиш, за которым следует копия из вспомогательного заднего в передний буфер (странно); по сути, означает, что вы не можете сделать процесс рисования "видимым".
Мне еще предстоит проверить, что делает драйвер Intel, минуя X11 (используя KMS). Обратите внимание, что спецификация OpenGL оставляет на усмотрение реализации то, как и когда она делает определенные вещи, до тех пор, пока результат является согласованным и соответствует спецификации. И все наблюдаемое поведение совершенно соответствует.