Что я заметил:
- В моем приложении (нет DisposeCollector): приложение зависает, когда
вызов Dispose() вручную для большого числа буферов. - В проекте GitHub: Изначально приложение работало нормально с
DisposeCollector, но когда я удалил DisposeCollector и
вручную вызвал Dispose() в буферах (так же, как в моем
приложении), я смог воспроизвести проблему с памятью . Однако в проекте
GitHub память в итоге освободилась при следующей
перерисовке, и приложение не зависло. - В моем приложении с DisposeCollector: я попробовал добавить
DisposeCollector в мое приложение, но оно все равно зависает
хотя в примере с GitHub это помогает.
[*]Проблема возникает только при большом количестве буферов (около< руб />200 000). При обработке меньшего количества объектов проблема не возникает.
[*]Похоже, проблема специфична для графических процессоров NVIDIA. Я тестировал код на
разных видеокартах, и проблема возникает только на оборудовании NVIDIA
.
[*]Я пробовал использую NVIDIA Nsight для отладки, но, к сожалению, этот инструмент
не поддерживает Direct3D 11, поэтому мне не удалось получить дополнительную информацию.
Мой вопрос:
Почему мое приложение зависает при удалении буферов вручную, в то время как в модифицированном проекте GitHub (без DisposeCollector) память задерживается при освобождении, но не зависает? Может ли такое поведение быть специфичным для того, как SharpDX обрабатывает управление памятью на графических процессорах NVIDIA, или здесь дело в чем-то другом?
Начав с примера, который я нашел здесь, я отредактировал D3DApp.cs, добавив< /p>
switch (e.KeyCode)
{
// ...
case Keys.R:
skipRenderLoop = true;
for (var i = 0; i < quad.Length; i++)
{
var q = quad;
//RemoveAndDispose(ref q);
q.Dispose();
quad = null;
}
break;
case Keys.T:
skipRenderLoop = false;
break;
}
аналогично я также отредактировал цикл рендеринга следующим образом:
RenderLoop.Run(Window, () =>
{
if (skipRenderLoop) //
Подробнее здесь: https://stackoverflow.com/questions/790 ... on-freezes