Я новичок в этом деле, и соответственно, у меня новичковский вопрос.
Пишу небольшую игру, постигаю секреты DirectX. Всё получается, всё превосходно. Но вот нюанс: при динамическом заполнении поверхностей (звуковых или графических, всё равно) приходится для корректности и вычищать из под них память. Так вот, Release(), отнаследованный от IUnknown, память не вычищает (память смотрю в Task Manager), хотя макрос FAILED показывает, что выполняется Release() прекрасно.
Перерыл весь код — у меня ошибки нет. Проверил в дебаг-режиме: реально после выполнения Release() размер памяти не уменьшается.
Но каково было моё удивление, когда я просто свернул программу — и количество памяти уменьшилось до реального размера (то ли кэш чистится, то ли файл подкачки — не знаю).
Вопрос в следующем: что я не так понимаю? Или если я понимаю правильно: как выполнить такую очистку, которая автоматом выполняется при сворачивании окна?
RRR>Пишу небольшую игру, постигаю секреты DirectX. Всё получается, всё превосходно. Но вот нюанс: при динамическом заполнении поверхностей (звуковых или графических, всё равно) приходится для корректности и вычищать из под них память. Так вот, Release(), отнаследованный от IUnknown, память не вычищает (память смотрю в Task Manager), хотя макрос FAILED показывает, что выполняется Release() прекрасно.
А ты уверен, что там не гадит DirectX или сам там, что то не очистил в его библиотеке?
Здравствуйте, RioRioRio, Вы писали:
RRR> (память смотрю в Task Manager)
Если Вы имеете в виду столбец "Память", то это не то, что нужно смотреть. Прочитайте в справке диспетчера о столбцах, а также поищите на форуме по ключу "working set". Вообще, диспетчер можно использовать только для самой грубой оценки работы с памятью, так как у практически всех приложений есть собственные менеджеры памяти, работу которых диспетчер отразить не может.
Здравствуйте, Vicul, Вы писали:
V>А ты уверен, что там не гадит DirectX или сам там, что то не очистил в его библиотеке?
Уверен, когда писал по сто раз проверял, да и как обнаружил проблему — тоже всё перелопатил. Не происходит очистка после выполнения Release() — это видно по диспетчеру задач.
Что характерно, временные поверхности прекрасно удаляются и не оставляют за собой следов — посредством этой-же функции Release().
Здравствуйте, Jolly Roger, Вы писали:
JR>Если Вы имеете в виду столбец "Память", то это не то, что нужно смотреть. Прочитайте в справке диспетчера о столбцах, а также поищите на форуме по ключу "working set". Вообще, диспетчер можно использовать только для самой грубой оценки работы с памятью, так как у практически всех приложений есть собственные менеджеры памяти, работу которых диспетчер отразить не может.
Сегодня пробился весь день — ещё раз убедился, что мусор остаётся после отработки Release(). Не знаю, что делать
Здравствуйте, RioRioRio, Вы писали:
RRR>Здравствуйте, Jolly Roger, Вы писали:
JR>>Если Вы имеете в виду столбец "Память", то это не то, что нужно смотреть. Прочитайте в справке диспетчера о столбцах, а также поищите на форуме по ключу "working set". Вообще, диспетчер можно использовать только для самой грубой оценки работы с памятью, так как у практически всех приложений есть собственные менеджеры памяти, работу которых диспетчер отразить не может.
RRR>Сегодня пробился весь день — ещё раз убедился, что мусор остаётся после отработки Release(). Не знаю, что делать
Предоставленной Вами информации недостаточноЮ чтобы Вам поверить, уж не обессудьте