С D3D, мне нужно вызвать релиз, прежде чем я выйду из процесса? - PullRequest
2 голосов
/ 26 мая 2011

Учебник, который я беру для direct3d, говорит:

"... По сути, если вы создаете Direct3D, но никогда не закрываете его, он просто будет работать в фоновом режиме компьютера до следующей перезагрузки, даже после закрытия самой программы. Плохо. много ресурсов в вашей игре. Освободив эти два интерфейса, вы можете все снять с крючка и позволить Windows забрать свою память ». ( ссылка )

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

Например, если моя программа дает сбой или я просто нажимаю «Стоп» во время отладки… Ресурсы все еще зависают? И в других играх, использующих DirectX, я часто закрываю их, убивая процесс.

Будут ли ресурсы бесплатными для операционной системы, если я выйду из процесса и не вызову device-> Release?

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Проще говоря, нет.Это неправда.Когда ваш процесс завершается, все ваши ресурсы DirectX будут освобождены, и никакая графическая карта или системная память не будут вытекать.

1 голос
/ 26 мая 2011

Хотя это правда, что связанные с процессами ресурсы, такие как память, потоки, дескрипторы и т. Д. Будут возвращены, напомним, что D3D также использует память и ресурсы на видеооборудовании. В зависимости от конкретной реализации, если вы не сообщите D3D, что вы закрываете , вы можете не очистить все это при выходе из процесса.

Я видел некоторые очень интересные артефакты рендеринга, возникающие в программном обеспечении с использованием интерфейса Managed DX9, который не удалось очистить, пока не был сделан вызов EvictManagedResources . Эти артефакты возникли в автоматизированном тестовом наборе, и да - они сохранялись между отдельными вызовами одного и того же процесса (как маленькие прямоугольники мусора на дисплее / кадровом буфере).

Правильно закодированное приложение может по-прежнему соответствующим образом реагировать на внутренние исключения и / или запрос на завершение процесса (WM_QUERYENDSESSION и т. Д.) И выполнять эту очистку.

...