Типы устройств и требования к обработке вершин (Direct3D 9)
Производительность операций обработки вершин, включая преобразование и освещение, в значительной степени зависит от того, где находится буфер вершин в памяти и какой тип используемого устройства отрисовки. Приложения управляют выделением памяти для буферов вершин при их создании. Если установлен флаг памяти D3DPOOL_SYSTEMMEM, буфер вершин создается в системной памяти. При использовании флага памяти D3DPOOL_DEFAULT драйвер устройства определяет, где лучше всего выделить память для буфера вершин, которую часто называют оптимальной памятью для драйвера. Оптимальная для драйвера память может быть локальной видеопамяти, нелокальной видеопамяти или системной памяти.
Задание константы D3DUSAGE_SOFTWAREPROCESSING с помощью IDirect3DDevice9::CreateVertexBuffer включает программную обработку вершин в данных буфера вершин. Этот флаг необходим для программной обработки вершин в смешанном режиме. Флаг не может использоваться для аппаратного режима обработки вершин. Буферы вершин, используемые при программной обработке вершин, включают следующее:
- Все входные потоки для IDirect3DDevice9::P rocessVertices.
- Все входные потоки для IDirect3DDevice9::D rawPrimitive и IDirect3DDevice9::D rawIndexedPrimitive.
Причины, используемые для определения оптимального расположения памяти (системы или драйвера) для буферов вершин, такие же, как и для текстур. Обработка вершин, включая преобразование и освещение, в оборудовании лучше всего работает, когда буферы вершин выделены в памяти, оптимальной для драйвера, в то время как программная обработка вершин лучше всего работает с буферами вершин, выделенными в системной памяти. Для текстур аппаратная растеризация лучше всего работает, когда текстуры выделяются в оптимальной для драйвера памяти, в то время как программная растеризация лучше всего работает с текстурами системной памяти.
Microsoft Direct3D 9 поддерживает автономную обработку вершин без отрисовки примитивов с помощью метода IDirect3DDevice9::P rocessVertices . Эта автономная обработка вершин всегда выполняется в программном обеспечении на процессоре узла. По этой причине буферы вершин, используемые в качестве источников, заданных с IDirect3Device9::SetStreamSource , должны создаваться с флагом D3DUSAGE_SOFTWAREPROCESSING. Функциональные возможности IDirect3DDevice9::P rocessVertices идентичны функциям методов IDirect3DDevice9::D rawPrimitive и IDirect3DDevice9::D rawIndexedPrimitive при использовании программной обработки вершин.
Если приложение выполняет собственную обработку вершин и передает преобразованные, освещенные и обрезанные вершины методам отрисовки, то приложение может напрямую записывать вершины в буфер вершин, выделенный в оптимальной для драйвера памяти. Этот метод предотвращает избыточную операцию копирования на более позднем этапе. Обратите внимание, что этот метод будет работать неправильно, если приложение считывает данные из буфера вершин, так как операции чтения, выполняемые узлом из оптимальной для драйвера памяти, могут выполняться очень медленно. Таким образом, если приложению необходимо считывать данные во время обработки или записывать данные в буфер с ошибками, лучше использовать буфер вершин системной памяти.
При использовании функций обработки вершин Direct3D (путем передачи нетрансформированных вершин в методы отрисовки буфера вершин) обработка может выполняться в аппаратном или программном обеспечении в зависимости от типа устройства и флагов создания устройства. Рекомендуется выделять буферы вершин в пуле D3DPOOL_DEFAULT для обеспечения оптимальной производительности практически во всех случаях. Если устройство использует аппаратную обработку вершин, существует ряд дополнительных оптимизаций, которые можно выполнить на основе флагов D3DUSAGE_DYNAMIC и D3DUSAGE_WRITEONLY. Дополнительные сведения об использовании этих флагов см. в разделе IDirect3DDevice9::CreateVertexBuffer.
Связанные темы