Сообщить об использовании памяти Direct3D - PullRequest
1 голос
/ 09 января 2009

У меня есть приложение Direct3D 9, и я хотел бы контролировать использование памяти. Существует ли инструмент, позволяющий узнать, сколько системной и видеопамяти используется Direct3D? В идеале, он также сообщал бы, сколько выделено для текстур, буферов вершин, индексных буферов ...

Ответы [ 2 ]

7 голосов
/ 09 января 2009

Вы можете использовать старый интерфейс DirectDraw для запроса общей и доступной памяти.

Полученные таким образом числа ненадежны, хотя .

Свободная память может измениться в любой момент, и доступная память часто учитывает AGP-память (которая строго не является видеопамятью). Вы можете использовать числа, чтобы сделать правильное предположение о стандартном разрешении текстур и уровне детализации вашего приложения / игры, но это все.

Вы можете задаться вопросом, почему нет способа получить лучшие цифры, ведь отследить использование ресурсов сложно.

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

Есть также много других ресурсов. Все они создаются и управляются драйвером Direct3D, чтобы сделать рендеринг максимально быстрым. Среди прочих есть иерархические структуры ускорения z-буфера, предварительно скомпилированные списки команд (например, данные, необходимые для визуализации чего-либо в формате, понятном для GPU). Драйвер также может заранее ставить в очередь команды рендеринга для нескольких кадров, чтобы выровнять частоту кадров и увеличить параллельность между графическим процессором и процессором.

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

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

Если вам нужно больше места, чем доступно, это не проблема. Драйвер переместит данные между системной памятью, AGP-памятью и видео-памятью. На практике вам никогда не придется беспокоиться о том, что вам не хватает видеопамяти. Конечно, когда вам понадобится больше видеопамяти, чем доступно, производительность пострадает, но это жизнь: -)

2 голосов
/ 04 мая 2009

Два предложения:

Вы можете вызывать GetAvailableTextureMem в разное время, чтобы получить (приблизительную) оценку общего прогресса использования памяти.

Предполагая, что вы разрабатываете на nVidia, PerfHUD включает графическое представление использованной памяти AGP / VID (отдельно).

Вы, вероятно, не сможете получить хорошую чистую матрицу потребителей памяти (буферы вершин и т. Д.) В зависимости от местоположения памяти (AGP, VID, система), как -

(1) драйвер обладает большой свободой при передаче ресурсов между типами памяти, и

(2) фактическое разнообразие потребителей памяти намного больше, чем у открытых интерфейсов D3D.

...