Потрясающий динамический буфер вершин Direct3D9 Сбой блокировки / сбой после блокировки на Intel GMA X3100
Для начала я довольно опытный графический программист, но, как известно, все делают ошибки. К сожалению, кодовая база слишком велика, чтобы начать бросать здесь разумные фрагменты, и воссоздание всей ситуации в изолированной базе CPP/ кодовой базы - слишком сложный заказ - на что, извините, не хватает времени. Я сделаю все возможное, чтобы объяснить.
Кстати, я, конечно, предоставлю конкретные кусочки кода, если кому-то интересно, как я справляюсь с этим или с этим!
Как и для всех ресурсов в пуле D3DPOOL_DEFAULT, когда у вас отнят контекст устройства, вам рано или поздно придется сбросить ресурсы. Я создал механизм для обработки этого для всех соответствующих ресурсов, которые работали в течение многих лет; но этот факт ничего, несмотря на то, что я, конечно, проверил, подтвердил и усомнился в любом предположении, так как эта ошибка обнаружилась.
Что происходит следующим образом: у меня довольно большой динамический буфер вершин, точный размер 18874368 байт. Этот буфер блокируется (и полностью удаляется с использованием флага D3DLOCK_DISCARD) каждый кадр до создания динамической геометрии (isosurface-related, fyi) для него. Это работает нормально, пока, конечно, я не начну сбрасывать. Это может занять 1 раз, это может занять 2 или 5 перезагрузок, чтобы вызвать ошибку, которая вызывает нарушение доступа либо к указателю, возвращенному операцией Lock() на обновленном ресурсе, либо к простому сбою - относительно некоторого аналогичный адрес, но без смещения, которое он прикрепил к нему в первом случае, потому что в этом случае мы где-то наполовину пишем - за исключением вызова dll Lock() D3D9.
Я проверил это на другом оборудовании, обновил драйверы GMA X3100 (используя MacBook с BootCamp) до последних версий, но я не могу воспроизвести его на любом другом компьютере, и я не могу понять, что здесь не так. Я попытался воспроизвести аналогичную ситуацию с похожим буфером (у меня есть большой блокнот того же типа, который я заполнил квадраторами), и после определенного количества байтов он начал вести себя аналогичным образом.
Я не прошу решения здесь, но мне очень интересно, есть ли здесь другие разработчики, которые боролись с тем же противником, или, может быть, те, кто может указать мне в каком-то проницательном направлении, возможно, задать некоторые вопросы, которые могут пролить свет на что я могу или не могу пропустить.
Спасибо и любые исправления приветствуются.
- Нильс
PS - Мой друг поднял правильную точку зрения, что это огромный буфер для встроенной видеопамяти, и он по крайней мере двойной или тройной буферизуется из-за своей динамической природы. С другой стороны, выходные данные отладки (отладочная DLL-библиотека D3D9 + макс. Выходные данные предупреждений) остаются без ответа.
PS 2 - Если бы он был протестирован на большем количестве машин и все еще работает - это, вероятно, дело обстоятельств: огромный динамический, внутренне двойной / тройной буферный буфер, не так много памяти и драйверов, которые не жалуются, когда они должны..
PS 3 - Только что сказали (должен был знать), что Lock and Unlock делают полную копию 18MB - это тоже не слишком умно, но все же:) (Я использую эту более разумную стратегию для универсального динамического VB/ средства визуализации / СРК).
Если у кого-то нет лучшего предложения; Я все еще хотел бы услышать это:)