Утечки памяти в C++ при рендеринге мешей

Я планирую создать игровой движок на C++ и DirectX 9. Так что я просто тестирую возможности Direct3D. Моя проблема в том, что когда я визуализирую объекты с функциями Direct3DX (текст, текстуры, сетки), использование памяти приложением продолжает расти, а производительность моего ПК падает. Когда у меня есть только очищенная сцена без какого-либо рендеринга, использование памяти остается около 4 МБ, но когда я добавляю текст или сетки (даже с предопределенными функциями рисования сетки, например, D3DXCreateBox, D3DXCreateTeapot), возникает проблема, упомянутая выше. Может ли кто-нибудь помочь мне исправить это? ПРИМЕЧАНИЕ. Когда я не выполняю рендеринг в цикле, использование памяти остается на уровне 9 МБ, но, конечно, все остается статичным.


person Community    schedule 21.11.2012    source источник
comment
Как вы измеряете использование памяти? Диспетчер задач FYI практически бесполезен для этой цели. Кроме того, существует бесчисленное множество способов утечки памяти. Мы не сможем вам помочь, если вы не предоставите нам краткий, автономный, правильный (компилируемый) пример.   -  person In silico    schedule 22.11.2012
comment
Образец кода? Я не использовал DirectX, но из того, что вы говорите, должна быть необходимость очистить сцену перед повторным рендерингом...   -  person nonsensickle    schedule 22.11.2012
comment
Не используйте указатели. Не используйте new.   -  person Kerrek SB    schedule 22.11.2012
comment
@KerrekSB С DirectX вам нужно использовать указатели, потому что графические ресурсы являются объектами с подсчетом ссылок. Хотя, конечно, лучше использовать интеллектуальные указатели, чем необработанные указатели (но только если вам нужна сильная ссылка).   -  person    schedule 22.11.2012
comment
@ user1775315: В этом случае создайте надежную, разумную оболочку (что-то вот так например) и использовать это, я бы сказал.   -  person Kerrek SB    schedule 22.11.2012
comment
@KerrekSB API Direct3D уже совершенно надежен и вменяем. Графические ресурсы по своей сути не подлежат копированию, поэтому вам нужен другой механизм владения. И навязчивый подсчет ссылок (способ COM) лучше, чем ненавязчивый подсчет ссылок (способ shared_ptr).   -  person    schedule 22.11.2012


Ответы (1)


Вызываете ли вы IUnknown::Release для указателей интерфейса D3D, когда закончите их использовать? Использование класса интеллектуальных указателей, например класса ATL CComPtr помогает избежать этих проблем.

person Community    schedule 21.11.2012