Управление памятью Directx 11

Я уже некоторое время изучаю Directx 11, но я все еще не понимаю, как Directx 11 управляет памятью. Например, если я создаю буфер вершин с помощью ID3D11Device::CreateBuffer, где хранится новый буфер? Я знаю, что он возвращает указатель на буфер, значит, он должен храниться в оперативной памяти процессора, верно? Однако я подумал, что это сделает ID3D11DeviceContext::IASetVertexBuffers очень медленным процессом, потому что ему придется копировать буфер из ОЗУ ЦП в ОЗУ ГП. Но если бы все буферы, созданные с помощью ID3D11Device:CreateBuffer, хранились в оперативной памяти графического процессора, разве оперативная память графического процессора не заполнялась бы очень быстро? В основном я хотел бы знать: когда я создаю буфер, где хранятся эти данные? В оперативной памяти процессора или в оперативной памяти графического процессора? Кроме того, что ID3D11DeviceContext::IASetVertexBuffers делает с буфером (копирует/устанавливает?).


person Sully Chen    schedule 17.10.2014    source источник


Ответы (1)


Общий ответ таков: «там, где хочет водитель». Для «ДИНАМИЧЕСКИХ» ресурсов они обычно помещаются в память, доступную как для ЦП, так и для графического процессора (на современных ПК она распределяется по шине PCIe). Для «СТАТИЧЕСКИХ» ресурсов они могут находиться в видеопамяти, доступной только для графического процессора, который копируется через окно «общей» памяти, или, если место ограничено, они помещаются в окно «общей» памяти. Цели рендеринга обычно также помещаются в видеопамять.

Для более глубокого изучения управления видеопамятью Direct3D ознакомьтесь с докладом «Почему ваша игра для Windows не запустится в 2 147 352 576?» которого больше нет в загрузках MSDN, но его можно найти в моем блог.

Если вам нужны подробные сведения об оборудовании, прочтите документацию автора драйверов. .

Вы также можете найти образец видеопамяти в образовательной галерее MSDN Code Gallery. .

person Chuck Walbourn    schedule 17.10.2014