Каковы возможные причины сбоя IDirect3DVertexBuffer9 :: Lock? - PullRequest
1 голос
/ 05 мая 2010

В некоторых сообщениях об ошибках я часто видел следующее поведение: IDirect3DVertexBuffer9 :: Ошибка блокировки, возвращенный код ошибки - D3DERR_NOTAVAILABLE.

Как только это происходит, довольно часто (но не всегда) за ним следуют сбой CreateTexture или CreateVertexBuffer с ошибкой D3DERR_OUTOFVIDEOMEMORY.

Каковы возможные причины сбоя блокировки буфера вершин? Возможно ли исчерпано адресное пространство виртуальной памяти или как?

Ответы [ 3 ]

1 голос
/ 20 мая 2010

Основано на ответе DIRECTXDEV Чака Уолборна из Microsoft, помимо «вне адресного пространства», другая причина может быть «вне пула страниц».

Кроме того, в Windows XP это может означать, что вы достигли пределов памяти ядра выгружаемого пула. Обычно это происходит, когда вы создаете много ресурсов Direct3D (текстуры и т. Д.)

Мы действительно создаем много ресурсов Direct3D.

0 голосов
/ 19 мая 2010

Поднятый вопрос о нехватке памяти действителен. Нам нужны некоторые детали о вызове Lock (), чтобы убедиться, что , но , например, если он находится в пуле DEFAULT и если он динамический (флаг D3DLOCK_DISCARD передан), вполне возможно, что ваш драйвер попытается найти неиспользуемый кусок памяти, который нужно вернуть (потому что он внутренне удваивает или утраивает буферы), и завершается неудачно, потому что, как вы вскоре обнаружите, видеопамять исчерпана.

0 голосов
/ 05 мая 2010

Это то, что я опубликовал в DirectXDev:;)

Вы проверили, сколько памяти у вас приложение использует? (Обязательно выберите столбец Виртуальная память в Диспетчер задач!). Мое предположение будет проблемы, связанные с фрагментацией памяти заставляя вас, как вы предлагаете, бежать вне адресного пространства.

Однако это может быть ошибка драйвера ...

Предоставляет ли среда отладки какую-либо полезную информацию?

Редактировать: Единственное, о чем я могу думать, это то, что память диафрагмы закончилась. Я не знаю, как это работает с PCIExpress, но на AGP вы можете установить размер диафрагмы. Я не знаю, как проверить, если он полон, однако. Я подозреваю, что ошибка, которую вы видите, сообщает, что она полная. Вы делаете много блокировок с флагом Discard? Если это так, то возможно, что они создают тонны новых выделений в апертуре и приводят к тому, что вам не хватает памяти там. Это чисто догадка, однако.

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

Во всяком случае ... это только предположение!

...