2017-01-17 4 views
0

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

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

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

ответ

1

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

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

Is it bad design to push the boundaries until receiving a glGetError:Out of memory and scale back from there?

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

Is my application a jerk because it's allocating huge chunks of VRAM, which may require swapping into GTT memory?

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

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

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

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

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

+0

Благодарим вас за понимание метрик того, как много текстур вам удалось надежно установить. Если есть хороший источник для большего количества аппаратных средств, это было бы здорово, но сейчас я возьму эти коэффициенты. – Balk

Смежные вопросы