OpenGL (ES 2.0) Представления VBO в архитектуре общей памяти
Я разработчик настольных систем, и я начинаю изучать мир мобильных устройств.
Чтобы избежать недоразумений или приветственных, но тривиальных ответов, я могу смиренно сказать, что я хорошо осведомлен о механизмах GL и GL | ES.
Короткий вопрос: если мы используем GL | ES 2.0 в архитектуре с общей памятью, какой смысл использовать VBO в отношении массивов на стороне клиента?
Подробнее:
-
Буферы Vertex - это сырые фрагменты памяти, драйвер никоим образом не может оптимизировать что-либо, потому что шаблон доступа зависит от: 1) того, как приложение настраивает макет вершинных данных, 2) как вершинный шейдер потребляет содержимое буфера и 3) у нас может быть множество вершинных шейдеров, работающих по-разному, и по-разному подбирать один и тот же буфер.
-
Выравнивание: отдельное хранилище VBO может начинаться с адресов, которые оптимальны для базовой системы GL; что, если я просто заставляю (например, уважать оптимальные методы выравнивания) распределений на стороне клиента на эти границы?
-
Архитектуры на основе плитки на основе рендеринга или немедленного режима не должны вступать в игру: по моему мнению, это не связано с моим вопросом (т.е. доступом к памяти).
Я понимаю, что использование VBOs может привести к тому, что ваш код будет работать быстрее/быстрее в будущих платформах/аппаратных средствах без его модификации, но это не в центре внимания этого вопроса.
Кроме того, я также понимаю, что использование VBO в архитектуре общей памяти удваивает использование памяти (если вам по какой-то причине нужно хранить данные вершин в вашем распоряжении), и это стоит вам memcpy данных.
Как и в чередующихся массивах вершин, использование VBO имеет отличную "шумиху" в форумах разработчиков /blogs/official _technotes без каких-либо данных, поддерживающих эти утверждения (т.е. эталонные тесты).
- Возможно ли использование VBO на архитектурах разделяемой памяти?
- Работают ли серверы на стороне клиента?
- Что вы думаете/знаете об этом?
Ответы
Ответ 1
Я могу сообщить, что использование VBOs для хранения данных вершин на устройствах Android дало мне нулевое улучшение производительности. Пробовал его на графических процессорах Adreno, Mali400 и PowerVR. Однако мы используем VBOs, считая, что это наилучшая практика для OpenGL ES.
Вы можете найти заметки об этом в нашей статье статье (абзац объектов буфера вершин).
Ответ 2
В соответствии с этим отчетом, даже поддерживая постоянную SMA, это зависит как от реализации OpenGL (некоторые работы VBO тайно выполняются на процессоре), так и от размера VBOs:
http://sarofax.wordpress.com/2011/07/10/vbo-vertex-buffer-object-limitations-on-ios-devices/
Ответ 3
Я расскажу вам, что я знаю о платформе iOS.
VBO действительно улучшает вашу производительность.
- VBO отлично, если у вас есть статическая геометрия - после копирования, никаких дополнительных накладных расходов при каждом вызове ничьей. CA будет копировать ваши данные из клиентской памяти в "память gpu" каждый drawcall. Это может привести к переделке данных, если вы забыли об этом.
- VBO может быть сопоставлен с gpu vie glMapBuffer - это асинхронная операция, то есть почти не имеет накладных расходов, но вы должны помнить - при сопоставлении\распаковывании вашего буфера лучше использовать его 2 кадра после операции unmap - во избежание синхронизации
- Инженеры Apple заявляют, что VBO будет иметь лучшую производительность, чем CA на оборудовании SGX, даже если вы будете повторно загружать его в каждый кадр - я не знаю деталей.
- VBO - лучшая практика. CA устарели. Лучше идти в ногу с современными тенденциями и максимально использовать кросс-платформу.