Стоит много памяти при создании нескольких вершин и индексных буферов - PullRequest
0 голосов
/ 08 сентября 2010

Я встретил очень странную проблему.Когда я создаю несколько очень простых VertexBuffer и IndexBuffer в D3D, потребление памяти, сообщаемое из TaskManager, огромно.

Я создал 60000 буфер индексов с помощью метода D3D CreateIndexBuffer.Каждый индексный буфер содержит 6 индексов (int), которые представляют два треугольника.Итак, один индексный буфер будет занимать 24 байта.И общее потребление памяти будет 24 * 60000 = 1 440 000.Но диспетчер задач показывает увеличение памяти приложения на 300 МБ!

Я не знаю, как D3D9 внутренне распределял память, но эта проблема возникает и в D3D10.Это из-за фрагментации памяти?

Это под x86 | версия bebug, и d3d - версия выпуска, windows 7.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

60000 индексных буферов? Почему бы просто не создать 1 большой индексный буфер? Переключение всех этих индексных буферов само по себе будет медленным.

По причине: с каждым созданным вами индексным буфером будут накладные расходы (различный бит информации об отслеживании и биты информации, которые драйвер будет использовать для его оптимизации), и 5 КБ памяти мне кажется вполне разумным для этих накладных расходов , 5K * 60000 - это примерно 300 мегабайт ...

0 голосов
/ 13 сентября 2010

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

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

Как упоминалось ранее, другая проблема заключается в том, что у вас есть 60000каждый буфер индексов хранит 6 индексов для хранения 2 треугольников.Вы можете использовать 4 индекса в треугольнике веер или полосу треугольника.Кроме того, я не совсем уверен, почему вам нужно 600000 наборов из них.Фактически, вы можете иметь один индексный буфер и индексировать его, как бы странно это ни звучало.Вы можете поручить Direct3D использовать, скажем, 6 индексов, начиная с 6 * n-го индекса, для рисования n -ой пары треугольников.

Я отвлекся, хотя это не является предметом вашего вопроса.

...