Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2011, 01:52   #1
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию directdraw функция blt

Добрый день

как можно функцией Blt() рендерить маленькую (спрайтовую) поверхность на большую (бэкбуфер) в полный размер последнего, так, чтобы изображение не растягивалось, а копировалось? т.е. увидеть на экране не один растянутый спрайт, а множество того же размера. если это возможно, конечно
sashonk вне форума Ответить с цитированием
Старый 25.11.2011, 07:00   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Делай в цикле.
Ищи "Замостить изображение", "Заливка картинкой"
Kostia вне форума Ответить с цитированием
Старый 25.11.2011, 19:51   #3
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

поискал, толком ничего не нашел. видимо придется делать внеэкранную поверхность и на нее заливать картинку. В цикле!
тогда в догонку еще вопрос. Я слышал, что типичный размер поверхности должен быть кратен 8. в своем приложении я создавал различные поверхности, в т.ч. с произвольными шириной и высотой. Когда я определяю размер поверхности через вызов ddsurface->Lock(), в структуре DDSURFACEDESC содержатся те же значения ширины и высоты, что и были заданы. Это обман драйвера (т.е. реальные размеры пов-ти не такие, как возвращает вызов Lock) или размеры действительно такие, какими их задали при создании пов-ти? отражается ли как-то на скорости блиттинга тот факт, что пов-ть кратна или не кратна 8?
sashonk вне форума Ответить с цитированием
Старый 25.11.2011, 22:11   #4
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Цитата:
видимо придется делать внеэкранную поверхность и на нее заливать картинку. В цикле!
можешь Primary + BackBuffer(n) with Flip(), рисовать в BackBuffer затем Flip.
либо как ты хотел Primary + Offscreеn и Blt. Рисуешь все в Offscreеn, ее блитиш на первичную.


Цитата:
Я слышал, что типичный размер поверхности должен быть кратен 8
где ты такое слышал? ни помню что бы было такое ограничение. было ограничение для размерности текстур , - линейные размеры текстуры кратные степени 2-ки и то для 3д.

Цитата:
размеры действительно такие, какими их задали при создании пов-ти
да.

Цитата:
отражается ли как-то на скорости блиттинга тот факт, что пов-ть кратна или не кратна 8?
чем меньше поверхность тем быстрее она прорисуется на другую (оффскрин на первичную, к примеру, ровно как и спрайты на оффскрин или в бакбуффер).
Warn вне форума Ответить с цитированием
Старый 13.12.2011, 10:37   #5
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

есть проблема! большое кол-во спрайтов блиттится медленно, поэтому в тех
местах карты, где объектов много, ощутимы притормозы. Как посоветовали бы улучшить быстродействие?
sashonk вне форума Ответить с цитированием
Старый 13.12.2011, 11:13   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

много, это сколько? Неужели over 1000 штук?
Kostia вне форума Ответить с цитированием
Старый 13.12.2011, 12:14   #7
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

спрайты точно в видео памяти сидят?
Код:
...ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN or DDSCAPS_VIDEOMEMORY;
Warn вне форума Ответить с цитированием
Старый 13.12.2011, 23:53   #8
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

все верно, спрайты в видеопамяти. не 1000, но штук 300-400 может быть
sashonk вне форума Ответить с цитированием
Старый 16.12.2011, 07:02   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Возможно
1. Текстуры слишком большие
2. Может вы во время процесса игры подгружаете дополнительные ресурсы с жесткого диска
3. 300-400 многовато, хотя если куча маленьких картинок ~ 16*16, то должно быть норм

Как оптимизировать
1. Сокращайте число спрайтов
2. Уменьшайте размеры текстур
3. Тестируйте и ищите в каком месте ваша программа работает медленнее всего и пытайтесь оптимизировать.
4. Переходите на Direct3D или OpenGL, но лучше попытаться оптимизировать то что имеется.
Kostia вне форума Ответить с цитированием
Старый 16.12.2011, 09:40   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Спрайты должны быть все в единичном экземпляре (храниться в любом подобии ресурсного менеджера), если у вас карта местности, разумно разбить на слои, которые в разной степени забуфферизовать. Например грузим местность, рисуем буфер карты из тайлов, а потом в каждой итерации не всю карту перерисовываем, а именно буфер. Слои неподвижных объектов тоже можно забуфферизовать. Слои подвижных объектов лучше перерисовывать с фоном по такой схеме - рисуем кусок фона (выстригаем из буфера карты и если надо из буферов остальных слоев) на месте подвижного объекта(по старым координатам), рисуем подвижный объект на новых координатах.
Насчет карты ещё такой совет - хранить буфер карты (особенно большой карты - накладно, да и на выстригании из него для текущей итерации прорисовки куска карты на экране может быть накладно ) - могу посоветовать создать буфер именно соизмеримым с размером экрана, а при скролле карты сдвигать буфер (сам относительно себя) на н клеток и дорисовывать недостающие клетки.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
directdraw не рисует... ros.pro Мультимедиа в Delphi 5 01.06.2011 19:58
Проблемы с DirectDraw в VC++ Копоть Артём Помощь студентам 4 21.05.2011 23:36
Помогите с directdraw BuT@JL Общие вопросы Delphi 5 22.08.2009 18:33
Assembler и DirectDraw Д'якон Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 23.10.2008 08:59
DirectDraw Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 29 15.04.2008 22:35