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.

Вы можете найти заметки об этом в нашей статье статье (абзац объектов буфера вершин).

Ответ 3

Я расскажу вам, что я знаю о платформе iOS. VBO действительно улучшает вашу производительность.

  • VBO отлично, если у вас есть статическая геометрия - после копирования, никаких дополнительных накладных расходов при каждом вызове ничьей. CA будет копировать ваши данные из клиентской памяти в "память gpu" каждый drawcall. Это может привести к переделке данных, если вы забыли об этом.
  • VBO может быть сопоставлен с gpu vie glMapBuffer - это асинхронная операция, то есть почти не имеет накладных расходов, но вы должны помнить - при сопоставлении\распаковывании вашего буфера лучше использовать его 2 кадра после операции unmap - во избежание синхронизации
  • Инженеры Apple заявляют, что VBO будет иметь лучшую производительность, чем CA на оборудовании SGX, даже если вы будете повторно загружать его в каждый кадр - я не знаю деталей.
  • VBO - лучшая практика. CA устарели. Лучше идти в ногу с современными тенденциями и максимально использовать кросс-платформу.