Почему у меня заканчивается память в D3DPOOL_DEFAULT?

При попытке использовать рендеринга D3D9 моей компании и выделения всего в D3DPOOL_MANAGED У меня закончится память в 32-битном пространстве процесса .

Я попытался использовать наш рендерер D3D9Ex и выделил в D3DPOOL_DEFAULT, но это дает мне ошибку 0x8876017C (D3DERR_OUTOFVIDEOMEMORY).

Я не понимаю, что это значит. Это подразумевает, что драйвер ничего не сможет сделать в D3DPOOL_DEFAULT?

У меня есть 2,5 ГБ пространства AGP и 4 ГБ памяти устройства, и все мои приложения сетки и текстуры всего 2,4 ГБ на диске. Я использую только половину из них в любой момент времени. Есть ли какой-то скрытый предел, на который я натыкаюсь?

5 голосов | спросил Jonathan Mee 30 MonEurope/Moscow2013-12-30T19:07:04+04:00Europe/Moscow12bEurope/MoscowMon, 30 Dec 2013 19:07:04 +0400 2013, 19:07:04

2 ответа


4

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

Если у вас есть отдельные ресурсы (например, текстуры), которые слишком велики, вам придется подумать о способах их разбивки или реорганизации, чтобы у вас не было одиночных, монолитных, гигабайтных текстур, плавающих вокруг.

Что касается фона или why , вы получите эту ошибку:

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

Использование D3DPOOL_DEFAULT для ресурса означает, что этот ресурс будет размещен на основе набора критериев использования, которые вы указываете при создании ресурса , в наиболее подходящем пуле памяти. Обычно это видеопамять. API будет not управлять чем-либо в пуле по умолчанию, как это было бы с пулом D3D_MANAGED (если устройство потеряно, вы должны освободить и повторно создать ресурсы пула по умолчанию), если это то, о чем вам интересно.

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

  • размер текстуры или любых других данных буфера на диске (и даже в системной ОЗУ) не обязательно равен размеру ресурса, когда он попадает на графическую карту. Данные могут быть реорганизованы и изменены, чтобы повысить производительность. К сожалению, очень сложно получить D3D, чтобы дать вам хорошую статистику о потреблении и сбое памяти на GPU.

  • драйвер может подразделять память GPU в ведра для различных целей («это много» для текстурной памяти, «столько» для буферов вершин). Вы не обязательно получаете полный спектр физического GPU RAM, чтобы делать все, что хотите, поэтому не следует писать против этого предположения.

  • Direct3D может логически разделить его память; что даже если ресурс пула по умолчанию не размещен на графическом процессоре, D3D сохраняет сторону процессора D3DPOOL_MANAGED и D3DPOOL_DEFAULT.

  • предыдущие два момента приведут к фрагментации памяти, что означает, что даже если для удовлетворения запроса достаточно свободного свободного ОЗУ, чтобы он мог удовлетворить запрос, он может не быть смежным в пределах одного логического пула, и, следовательно, запрос должен быть отказано. На самом деле это может произойти даже в пределах одного пула памяти (как и на стороне процессора), что приводит к неудачному распределению.

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

Потому что трудно заставить D3D рассказать вам полезные вещи о сбоях в использовании памяти GPU, вам, вероятно, придется принять худшее и принять более широкий подход к решению проблемы (как описано в начале).

ответил Josh 30 MonEurope/Moscow2013-12-30T19:38:51+04:00Europe/Moscow12bEurope/MoscowMon, 30 Dec 2013 19:38:51 +0400 2013, 19:38:51
1

Ваше адресное пространство процесса на самом деле будет значительно меньше, чем вы думаете; для 32-разрядной программы (и это верно даже в 64-разрядной Windows) это 2 ГБ, поэтому ваши 2,4 ГБ ресурсов значительно переполнится.

Один из способов работы с этим - использовать специальные переключатели запуска в параметрах boot.ini (XP или ниже) или bcdedit (Vista или выше), что увеличивает вас до 3 ГБ для распределения пользовательского режима, но за счет сокращения ядра режим распределения до 1 ГБ. Даже если это сработает для вас, все пользователи вашей программы также должны будут сделать то же самое, что является требованием, которое вы не должны навязывать им.

Вам нужно посмотреть на это 2,4 ГБ ресурсов и задать себе несколько вопросов.

Во-первых, действительно ли вам нужно все 2,4 ГБ загружать одновременно? Большинство игр не загружают сразу все ресурсы; помимо обременительных требований к памяти, это занимает слишком много времени. Вот почему игры часто делятся на «карты», и для каждой карты вы загружаете только ресурсы, необходимые этой карте. Когда игрок переходит на другую карту, вы выгружаете ресурсы из предыдущего и загружаете ресурсы для нового.

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

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

ответил Maximus Minimus 30 MonEurope/Moscow2013-12-30T21:08:47+04:00Europe/Moscow12bEurope/MoscowMon, 30 Dec 2013 21:08:47 +0400 2013, 21:08:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132