Насколько хорошо драйверы opengl обрабатывают большие массивы текстур в ограниченной VRAM

Мой игровой движок пытается выделить большие массивы текстур, чтобы можно было объединить большую часть (если не все) его отрисовки. Этот массив может стать достаточно большим, который не может быть выделен, и в этот момент я бы (непрерывно) разделял массив текстур пополам.

Это плохой дизайн раздвинуть границы до получения glGetError:Out of memory и свернуть оттуда?

Является ли мое приложение дрянным, потому что оно выделяет огромные порции VRAM, что может потребовать загрузки в память GTT? Например, менее ли идеально для графического драйвера манипулировать несколькими большими массивами текстур, а не множеством отдельных текстур при работе с другими операциями ОС?

1

Решение

Трудно оценить, насколько хорошо драйверы обрабатывают большие массивы текстур. Поведение разных водителей может сильно различаться.

Использование массива текстур может повысить производительность за счет уменьшения количества вызовов отрисовки, что не должно быть главной целью. На мобильных платформах несколько важно уменьшить количество звонков, и даже несколько десятков из них не являются проблемой. Я не уверен в ваших проблемах и в том, что именно вы пытаетесь оптимизировать, но я бы порекомендовал использовать инструменты профилирования от производителя GPU, прежде чем проводить какую-либо оптимизацию.

Разве это плохой дизайн, чтобы раздвинуть границы до получения glGetError: Недостаточно памяти и уменьшить масштаб оттуда?

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

Является ли мое приложение дрянным, потому что оно выделяет огромные порции VRAM, что может потребовать загрузки в память GTT?

Невозможно проверить, были ли данные перенесены в GTT или нет (если драйвер вообще поддерживает GTT). Драйвер обрабатывает его самостоятельно, и к нему нет доступа из API OpenGL. Возможно, вам придется использовать такие инструменты профилирования, как Nsight, если вы используете графический процессор от NVidia.

Однако, если вы планируете иметь один гигантский массив текстур, он должен вписываться в VRAM в целом, он не может быть частично в VRAM и в GTT. Я бы не рекомендовал полагаться на GTT вообще.

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

Несмотря на то, что массивы текстур и 3dtexture концептуально различаются, на аппаратном уровне они работают очень схожим образом, разница в том, что первая использует фильтрацию в двух измерениях, а вторая — в трех измерениях.

Некоторое время я играл с большими 3d текстурами. Я провел эксперименты с GeForce 1070 (он имеет 6 ГБ), и он очень хорошо обрабатывает текстуры ~ 1 ГБ. Самая большая текстура, которую мне удалось загрузить, была около 3 ГБ (2048x2048x7 **), но часто выдает ошибку. Несмотря на то, что у него должно быть большое количество свободной видеопамяти, которая бы соответствовала текстуре, он может не выделить такой большой кусок по разным причинам. Поэтому я бы не рекомендовал размещать текстуры, которые сопоставимы с общим размером VRAM, если это не является абсолютно необходимым.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]