Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Управление памятью (текстурами)


Автор: Fixin 30.3.2006, 20:57
В Win-GUI для скорости можно насоздавать совместимых контекстов (массив, связный список), в которые поместить картинки (кадры), если не прибегать к использованию списка изображений, а потом Blt-ить их куда надо с достаточно приличной скоростью.
Если при использовании ДиректД для каждой картинки выделять "внешнюю" (не экранную, офф-скрин) поверхность (для картинок), то
1) скоро кончится видеопамять
2) как вообще происходит менеджмент "картиночной" памяти в ДД?
Добавлено @ 21:00
Я говорю о том случае, когда нужно загрузить большое количество картинок сразу, и выводить их потом быстро.

Автор: CyberDemon 31.3.2006, 09:30
Решение данной проблемы есть, но я не полностью уверен, что утечь памяти не будет происходить вообще. Но то, что в меньшей степени - это точно. Вот пример:
Код

void InsertBitmap(int xScreen, int yScreen, int WidthScreen, int HeightScreen,
                  int xImage, int yImage, int WidthImage, int HeightImage,
                  HMODULE* dll, UINT idBitmap)
{
    HDC hDC, hDCcomp;
    HBITMAP hBmp;
    hBmp = LoadBitmap(*dll, MAKEINTRESOURCE(idBitmap));
    lpSecondSurface->GetDC(&hDC);
    hDCcomp = CreateCompatibleDC(hDC);
    SelectObject(hDCcomp, hBmp);
    StretchBlt(hDC, xScreen, yScreen, WidthScreen, HeightScreen, hDCcomp,
        xImage, yImage, WidthImage, HeightImage, SRCCOPY);
    DeleteObject(hBmp);
    DeleteDC(hDCcomp);
    lpSecondSurface->ReleaseDC(hDC);
}


Суть в том, что если ты создал какой-то объект, выделил на него память, то ее надо естественно удалить. Так вот, после того, как ты произвел побитовое копирование рисунка из одного контекста в другой, надо высвободить память, которая была выделена под этот рисунок. Это ты и делаешь с помошью функции DeleteObject(hBmp);

Утечка памяти скорее всего до конца не устранится, но будет гораздо меньше... Возможно еще что-нить надо удалить, но я сам пока в этом разбираюсь.

Автор: Fixin 2.4.2006, 13:32
Я не об этом, хотя твой код почти верен:
Код

void InsertBitmap(int xScreen, int yScreen, int WidthScreen, int HeightScreen,    
                  int xImage, int yImage, int WidthImage, int HeightImage,    
                  HMODULE* dll, UINT idBitmap)    
{    
    HDC hDC, hDCcomp;    
    HBITMAP hBmp;    
    hBmp = LoadBitmap(*dll, MAKEINTRESOURCE(idBitmap));    
    lpSecondSurface->GetDC(&hDC);    
    hDCcomp = CreateCompatibleDC(hDC);    
    HBITMAP hOldBitmap = SelectObject(hDCcomp, hBmp);    //изменения тут
    StretchBlt(hDC, xScreen, yScreen, WidthScreen, HeightScreen, hDCcomp,    
        xImage, yImage, WidthImage, HeightImage, SRCCOPY);    
    SelectObject(hDCcomp, hOldBitmap); // и тут
    DeleteObject(hBmp);    
    DeleteDC(hDCcomp);    
    lpSecondSurface->ReleaseDC(hDC);    
}
Теперь все по всем законам.


А мой вопрос вот в чем: по правилам ДД, картинки должны загружаться не в совместимый контекст устройства, а специальные поверхности (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, 11:50 Найти цитируемый пост)
зачем тебе около сотни разл. текстур?
Карта насыщена текстурами, хотя и маленькими.
Цитата(darkart @ 3.4.2006, 11:50 Найти цитируемый пост)
Ты их группировал?
Что значит?

Автор: darkart 3.4.2006, 19:19
Цитата(Fixin @ 3.4.2006, 19:42 Найти цитируемый пост)
Карта насыщена текстурами, хотя и маленькими.

Не нужно хранить все текстуры(тайлы я так понимаю) в собственных поверхностях, работа с мн-вом мелких поверхностей на мноооого медленнее чем с одной большой.
Цитата(Fixin @ 3.4.2006, 19:42 Найти цитируемый пост)
Что значит?

При загрузке нужно разместить мелкие элементы на поверхности и затем вырезать нужный кусок.


Автор: Fixin 3.4.2006, 19:32
Ага, пасиба.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)