Типичная стратегия рендеринга для многих и разнообразных сложных объектов в DirectX? - PullRequest
9 голосов
/ 21 июня 2011

Я учу DirectX.Он предоставляет огромную свободу в том, как что-то делать, но, по-видимому, разные состояния работают по-разному, и он дает мало рекомендаций относительно того, какими могут быть эффективные модели использования.

При использовании Directx обычно приходится менять местами.в кучу новых данных несколько раз на каждом рендере?

Самый очевидный и, вероятно, действительно неэффективный способ его использования будет выглядеть следующим образом.

Stragety 1

На каждомrender

  1. Загрузить все для модели 0 (включая текстуры) и визуализировать ее (IASetVertexBuffers, VSSetShader, PSSetShader, PSSetShaderResources, PSSetConstantBuffers, VSSetConstantBuffers, Draw)

    * 10181019 *

    Загрузить все для модели 1 (включая текстуры) и визуализировать ее (IASetVertexBuffers, VSSetShader, PSSetShader, PSSetShaderResources, PSSetConstantBuffers, VSSetConstantBuffers, Draw)

  2. и т. Д.

Я предполагаю, что вы можете сделать это более эффективно частично, если самые большие вещи, которые нужно загрузить, имеют выделенные слоты, например, если текстура для модели 0 действительно сложна, не перезагружайте ее на каждом шагеПросто загрузите его в слот 1 и оставьте там.Конечно, поскольку я не уверен, сколько регистров в DX11 определенно должно быть каждого типа, это сложно (может кто-нибудь указать на это на документацию?)

Stragety 2

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

Только один раз

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

На каждом отдельном рендере

  1. Загрузить все, что еще не существует для модели 0, используя слоты, которые вы выделили для загрузки и рендерингаit (IASetVertexBuffers, VSSetShader, PSSetShader, PSSetShaderResources, PSSetConstantBuffers, VSSetConstantBuffers, Draw)

  2. Загрузить все, что еще не существует для модели 1, используя слоты, которые вы откладываете для загрузки в VSSet, и использовать его для загрузки VTSet, PSSetShader, PSSetShaderResources, PSSetConstantBuffers, VSSetConstantBuffers, Draw)

  3. и т.д ...

Стратегия 3 Понятия не имею, но все вышесказанное, вероятно, совершенно неверно, потому что я действительно новичок в этом.

Каковы стандартные стратегии эффективного рендеринга на DirectX (в частности, DX11), чтобы сделать его максимально эффективным?

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

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

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

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

Как правило, вы получите более высокий прирост производительности за счет более общих изменений алгоритма, выходящих за рамки этого вопроса.Некоторыми примерами может быть уменьшение количества полигонов для удаленных объектов и запросов окклюзии.Популярная верная фраза: «Самые быстрые полигоны - это те, которые вы не рисуете».Вот несколько быстрых ссылок:

http://msdn.microsoft.com/en-us/library/bb147263%28v=vs.85%29.aspx

http://www.gamasutra.com/view/feature/3243/optimizing_direct3d_applications_.php

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter06.html

1 голос
/ 22 июня 2011

Другие ответы являются лучшими ответами на вопрос как таковой, но, безусловно, самая важная вещь, которую я нашел с тех пор, как спросил, была эта дискуссия на gamedev.net , в которой некоторые игры с большим названием профилируются для изменения состояния и отрисовки вызовов.

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

...