![]() |
|
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]()
|
|
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: нет Всего: 18 |
В Win-GUI для скорости можно насоздавать совместимых контекстов (массив, связный список), в которые поместить картинки (кадры), если не прибегать к использованию списка изображений, а потом Blt-ить их куда надо с достаточно приличной скоростью.
Если при использовании ДиректД для каждой картинки выделять "внешнюю" (не экранную, офф-скрин) поверхность (для картинок), то 1) скоро кончится видеопамять 2) как вообще происходит менеджмент "картиночной" памяти в ДД? Добавлено @ 21:00 Я говорю о том случае, когда нужно загрузить большое количество картинок сразу, и выводить их потом быстро. |
|||
|
||||
| CyberDemon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.10.2003 Где: Нижний Новгород Репутация: нет Всего: нет |
Решение данной проблемы есть, но я не полностью уверен, что утечь памяти не будет происходить вообще. Но то, что в меньшей степени - это точно. Вот пример:
Суть в том, что если ты создал какой-то объект, выделил на него память, то ее надо естественно удалить. Так вот, после того, как ты произвел побитовое копирование рисунка из одного контекста в другой, надо высвободить память, которая была выделена под этот рисунок. Это ты и делаешь с помошью функции DeleteObject(hBmp); Утечка памяти скорее всего до конца не устранится, но будет гораздо меньше... Возможно еще что-нить надо удалить, но я сам пока в этом разбираюсь. Это сообщение отредактировал(а) CyberDemon - 31.3.2006, 09:31 |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: нет Всего: 18 |
Я не об этом, хотя твой код почти верен:
А мой вопрос вот в чем: по правилам ДД, картинки должны загружаться не в совместимый контекст устройства, а специальные поверхности (surface), специально для того предназначенные. Я так понимаю, что эти поверхности храняться в видеопамяти. В моей игре, во время загрузки карты происходит загрузка около сотни различных текстур. Что делать, чтобы все это не вылезло за пределы доступной видеопамяти. |
|||
|
||||
| darkart |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 379 Регистрация: 9.11.2005 Репутация: 1 Всего: 31 |
Fixin,
Для создания внеэкранной поверхности используй флаги : 1) DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY - для размещения в видеопамяти. 2) DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY - для размещения в системной памяти. Узнать объем видеопамяти можно методом GetAvailableVidMem главного объекта DirectDraw. При нехватке видеопамяти, попытка создания поверхности в ней вызовет ошибку DDERR_OUTOFVIDEOMEMORY. Кстати зачем тебе около сотни разл. текстур? Ты их группировал? |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: нет Всего: 18 |
Карта насыщена текстурами, хотя и маленькими.
Что значит? |
|||
|
||||
| darkart |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 379 Регистрация: 9.11.2005 Репутация: 1 Всего: 31 |
Не нужно хранить все текстуры(тайлы я так понимаю) в собственных поверхностях, работа с мн-вом мелких поверхностей на мноооого медленнее чем с одной большой. При загрузке нужно разместить мелкие элементы на поверхности и затем вырезать нужный кусок. |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: нет Всего: 18 |
Ага, пасиба.
|
|||
|
||||
![]()
|
| Вы можете найти полезным что... | |
|
|
|
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |