Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление памятью (текстурами), в DD 
V
    Опции темы
Fixin
Дата 30.3.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



В Win-GUI для скорости можно насоздавать совместимых контекстов (массив, связный список), в которые поместить картинки (кадры), если не прибегать к использованию списка изображений, а потом Blt-ить их куда надо с достаточно приличной скоростью.
Если при использовании ДиректД для каждой картинки выделять "внешнюю" (не экранную, офф-скрин) поверхность (для картинок), то
1) скоро кончится видеопамять
2) как вообще происходит менеджмент "картиночной" памяти в ДД?
Добавлено @ 21:00
Я говорю о том случае, когда нужно загрузить большое количество картинок сразу, и выводить их потом быстро.
PM MAIL ICQ   Вверх
CyberDemon
Дата 31.3.2006, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 11.10.2003
Где: Нижний Новгород

Репутация: нет
Всего: нет



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

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);

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

Это сообщение отредактировал(а) CyberDemon - 31.3.2006, 09:31
PM MAIL ICQ   Вверх
Fixin
Дата 2.4.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



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

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), специально для того предназначенные. Я так понимаю, что эти поверхности храняться в видеопамяти. В моей игре, во время загрузки карты происходит загрузка около сотни различных текстур. Что делать, чтобы все это не вылезло за пределы доступной видеопамяти.

PM MAIL ICQ   Вверх
darkart
Дата 3.4.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 1
Всего: 31



Fixin,
Для создания внеэкранной поверхности используй флаги :
1) DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY - для размещения в видеопамяти.
2) DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY - для размещения в системной памяти.
Узнать объем видеопамяти можно методом GetAvailableVidMem главного объекта DirectDraw.
При нехватке видеопамяти, попытка создания поверхности в ней вызовет ошибку DDERR_OUTOFVIDEOMEMORY.
Кстати зачем тебе около сотни разл. текстур? Ты их группировал?



PM MAIL WWW ICQ Skype GTalk   Вверх
Fixin
Дата 3.4.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Цитата(darkart @ 3.4.2006, 11:50 Найти цитируемый пост)
зачем тебе около сотни разл. текстур?
Карта насыщена текстурами, хотя и маленькими.
Цитата(darkart @ 3.4.2006, 11:50 Найти цитируемый пост)
Ты их группировал?
Что значит?

PM MAIL ICQ   Вверх
darkart
Дата 3.4.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 1
Всего: 31



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

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

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


PM MAIL WWW ICQ Skype GTalk   Вверх
Fixin
Дата 3.4.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Ага, пасиба.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.