| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Управление памятью (текстурами) |
| Автор: Fixin 30.3.2006, 20:57 |
| В Win-GUI для скорости можно насоздавать совместимых контекстов (массив, связный список), в которые поместить картинки (кадры), если не прибегать к использованию списка изображений, а потом Blt-ить их куда надо с достаточно приличной скоростью. Если при использовании ДиректД для каждой картинки выделять "внешнюю" (не экранную, офф-скрин) поверхность (для картинок), то 1) скоро кончится видеопамять 2) как вообще происходит менеджмент "картиночной" памяти в ДД? Добавлено @ 21:00 Я говорю о том случае, когда нужно загрузить большое количество картинок сразу, и выводить их потом быстро. |
| Автор: CyberDemon 31.3.2006, 09:30 | ||
Решение данной проблемы есть, но я не полностью уверен, что утечь памяти не будет происходить вообще. Но то, что в меньшей степени - это точно. Вот пример:
Суть в том, что если ты создал какой-то объект, выделил на него память, то ее надо естественно удалить. Так вот, после того, как ты произвел побитовое копирование рисунка из одного контекста в другой, надо высвободить память, которая была выделена под этот рисунок. Это ты и делаешь с помошью функции DeleteObject(hBmp); Утечка памяти скорее всего до конца не устранится, но будет гораздо меньше... Возможно еще что-нить надо удалить, но я сам пока в этом разбираюсь. |
| Автор: Fixin 2.4.2006, 13:32 | ||
Я не об этом, хотя твой код почти верен:
А мой вопрос вот в чем: по правилам ДД, картинки должны загружаться не в совместимый контекст устройства, а специальные поверхности (surface), специально для того предназначенные. Я так понимаю, что эти поверхности храняться в видеопамяти. В моей игре, во время загрузки карты происходит загрузка около сотни различных текстур. Что делать, чтобы все это не вылезло за пределы доступной видеопамяти. |
| Автор: darkart 3.4.2006, 11:50 |
| Fixin, Для создания внеэкранной поверхности используй флаги : 1) DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY - для размещения в видеопамяти. 2) DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY - для размещения в системной памяти. Узнать объем видеопамяти можно методом GetAvailableVidMem главного объекта DirectDraw. При нехватке видеопамяти, попытка создания поверхности в ней вызовет ошибку DDERR_OUTOFVIDEOMEMORY. Кстати зачем тебе около сотни разл. текстур? Ты их группировал? |
| Автор: Fixin 3.4.2006, 18:42 |
| Карта насыщена текстурами, хотя и маленькими. Что значит? |
| Автор: darkart 3.4.2006, 19:19 |
| Не нужно хранить все текстуры(тайлы я так понимаю) в собственных поверхностях, работа с мн-вом мелких поверхностей на мноооого медленнее чем с одной большой. При загрузке нужно разместить мелкие элементы на поверхности и затем вырезать нужный кусок. |
| Автор: Fixin 3.4.2006, 19:32 |
| Ага, пасиба. |