Производительность glBufferSubData ужасна на iOS? - PullRequest
5 голосов
/ 13 июня 2011

Я не совсем понимаю, почему этот код работает медленно для GPU на iOS, этот код прекрасно работает на Windows без каких-либо проблем.

По сути, я делаю то, что у меня есть одна большая динамическая вершинабуфер (GL_STREAM_DRAW), и я пытаюсь обновить только его части, части, которые в одном кадре не должны перекрываться, поэтому они не должны вызывать сбросы, и ЦПУ не нужно ждать завершения работы графического процессора, но это явно неВ случае, если у меня на iPhone 4 примерно 10 кадров в секунду, даже при рисовании от 10 до 20 треугольников ... тогда как на моем компьютере более 400 кадров в секунду с тем же кодом ...

Как вы можетеПосмотрите на трассировку, я снова использую тот же буфер, но я проверяю, чтобы обновленные части не перекрывались ... что я могу сделать для улучшения производительности?

Index   Trace
695 glBindBuffer(GL_ARRAY_BUFFER, 1u)
696 glBufferSubData(GL_ARRAY_BUFFER, 144l, 144l, 0x0453d090)
697 glBlendFunc(GL_SRC_ALPHA, GL_ZERO)
698 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
699 glActiveTexture(GL_TEXTURE0)
700 glBindTexture(GL_TEXTURE_2D, 12u)
701 glUseProgram(12ul)
702 glUniform4fv(uniform_000000001cd24950_12_0, 1, {0.0500000f, 0.0000000f, 0.0000000f, 0.0000000f})
703 glUniform4fv(uniform_000000001cd24950_12_1, 1, {0.0000000f, 0.0333333f, 0.0000000f, 0.0000000f})
704 glUniform4fv(uniform_000000001cd24950_12_2, 1, {0.0000000f, 0.0000000f, -0.0010010f, 0.0000000f})
705 glUniform4fv(uniform_000000001cd24950_12_3, 1, {-0.0000000f, 0.6333333f, -0.0010010f, 1.0000000f})
706 glDrawArrays(GL_TRIANGLES, 6, 6)
707 glBindBuffer(GL_ARRAY_BUFFER, 1u)
708 glBufferSubData(GL_ARRAY_BUFFER, 288l, 144l, 0x0453d120)

1 Ответ

5 голосов
/ 13 июня 2011

Я думаю, что драйвер iOS просто недостаточно умен, чтобы увидеть, что обновленные диапазоны (в glBufferSubData) не перекрываются с текущими обработанными. Я даже не уверен, достаточно ли умен ваш драйвер для ПК (может быть, общая производительность вашего ПК скрывает это). Это зависит от драйвера, как он синхронизируется и оптимизирует ли он это.

Одним из решений этой проблемы может быть расширение ARB_map_buffer_range, которое может дать явные подсказки драйверу. Но я не уверен, поддерживается ли это в ES. В противном случае вы не сможете разделить буфер на несколько маленьких.

...