Лажа в работе с памятью - Release()
От: RioRioRio  
Дата: 11.08.11 17:13
Оценка:
Всем доброго времени суток.

Я новичок в этом деле, и соответственно, у меня новичковский вопрос.

Пишу небольшую игру, постигаю секреты DirectX. Всё получается, всё превосходно. Но вот нюанс: при динамическом заполнении поверхностей (звуковых или графических, всё равно) приходится для корректности и вычищать из под них память. Так вот, Release(), отнаследованный от IUnknown, память не вычищает (память смотрю в Task Manager), хотя макрос FAILED показывает, что выполняется Release() прекрасно.

Перерыл весь код — у меня ошибки нет. Проверил в дебаг-режиме: реально после выполнения Release() размер памяти не уменьшается.

Но каково было моё удивление, когда я просто свернул программу — и количество памяти уменьшилось до реального размера (то ли кэш чистится, то ли файл подкачки — не знаю).

Вопрос в следующем: что я не так понимаю? Или если я понимаю правильно: как выполнить такую очистку, которая автоматом выполняется при сворачивании окна?
Re: Лажа в работе с памятью - Release()
От: Vicul  
Дата: 12.08.11 05:55
Оценка:
RRR>Пишу небольшую игру, постигаю секреты DirectX. Всё получается, всё превосходно. Но вот нюанс: при динамическом заполнении поверхностей (звуковых или графических, всё равно) приходится для корректности и вычищать из под них память. Так вот, Release(), отнаследованный от IUnknown, память не вычищает (память смотрю в Task Manager), хотя макрос FAILED показывает, что выполняется Release() прекрасно.

А ты уверен, что там не гадит DirectX или сам там, что то не очистил в его библиотеке?
Re: Лажа в работе с памятью - Release()
От: Jolly Roger  
Дата: 12.08.11 07:10
Оценка:
Здравствуйте, RioRioRio, Вы писали:

RRR> (память смотрю в Task Manager)


Если Вы имеете в виду столбец "Память", то это не то, что нужно смотреть. Прочитайте в справке диспетчера о столбцах, а также поищите на форуме по ключу "working set". Вообще, диспетчер можно использовать только для самой грубой оценки работы с памятью, так как у практически всех приложений есть собственные менеджеры памяти, работу которых диспетчер отразить не может.
"Нормальные герои всегда идут в обход!"
Re[2]: Лажа в работе с памятью - Release()
От: RioRioRio  
Дата: 12.08.11 17:05
Оценка:
Здравствуйте, Vicul, Вы писали:

V>А ты уверен, что там не гадит DirectX или сам там, что то не очистил в его библиотеке?


Уверен, когда писал по сто раз проверял, да и как обнаружил проблему — тоже всё перелопатил. Не происходит очистка после выполнения Release() — это видно по диспетчеру задач.

Что характерно, временные поверхности прекрасно удаляются и не оставляют за собой следов — посредством этой-же функции Release().
Re[2]: Лажа в работе с памятью - Release()
От: RioRioRio  
Дата: 12.08.11 17:16
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Если Вы имеете в виду столбец "Память", то это не то, что нужно смотреть. Прочитайте в справке диспетчера о столбцах, а также поищите на форуме по ключу "working set". Вообще, диспетчер можно использовать только для самой грубой оценки работы с памятью, так как у практически всех приложений есть собственные менеджеры памяти, работу которых диспетчер отразить не может.


Сегодня пробился весь день — ещё раз убедился, что мусор остаётся после отработки Release(). Не знаю, что делать
Re[3]: Лажа в работе с памятью - Release()
От: Jolly Roger  
Дата: 12.08.11 17:50
Оценка:
Здравствуйте, RioRioRio, Вы писали:

RRR>Здравствуйте, Jolly Roger, Вы писали:


JR>>Если Вы имеете в виду столбец "Память", то это не то, что нужно смотреть. Прочитайте в справке диспетчера о столбцах, а также поищите на форуме по ключу "working set". Вообще, диспетчер можно использовать только для самой грубой оценки работы с памятью, так как у практически всех приложений есть собственные менеджеры памяти, работу которых диспетчер отразить не может.


RRR>Сегодня пробился весь день — ещё раз убедился, что мусор остаётся после отработки Release(). Не знаю, что делать


Предоставленной Вами информации недостаточноЮ чтобы Вам поверить, уж не обессудьте
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.