Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 16.05.2008, 08:49   #501
alexBlack
Профессионал
 
Регистрация: 12.10.2007
Адрес: -
Сообщений: 1,204
Репутация: 920
По умолчанию

Цитата:
первая же строка не устраивает Delphi. HeaderSize, BitsSize: Integer; в них GetDIBSizes поместит размеры заголовка и основных данных да?
должно быть Cardinal вместо integer. С какой-то версии Delphi поменялся тип параметров функции.

Цитата:
...просто написано обратным условием.
еще раз уточню. По-моему это разные условия. Поэтому я и спросил:

not ((MapPixel.R=0) And (MapPixel.G=0) And (MapPixel.B=0))

<>

(MapPixel.R>0) And (MapPixel.G>0) And (MapPixel.B>0)

например, для R=0,G=1,B=1 первое = true, второе - false
------------------------------------------------------------------
за пояснения спасибо
alexBlack вне форума   Ответить с цитированием
Старый 16.05.2008, 14:55   #502
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

Цитата:
Сообщение от alexBlack
Не нарушит логику, если будет другое условие :

"если ВСЕ компоненты = 0, то НЕ смешивать" ?
и If not ((MapPixel.R=0) And (MapPixel.G=0) And (MapPixel.B=0)) then СМЕШИВАТЬ - это разные условия.


"если ВСЕ компоненты = 0, то НЕ смешивать" - это If (MapPixel.R=0) And (MapPixel.G=0) And (MapPixel.B=0) then НЕ смешивать
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Старый 16.05.2008, 19:49   #503
mutabor
Телепат с дипломом
Профессионал
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
Репутация: 1570

icq: 401708834
По умолчанию

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

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

Этот принцип используется и в играх, и при сжатии видео. Насчет реализации не подскажу, но если удастся сэкономить на площади отрисовки, результат будет как говорится налицо )
mutabor вне форума   Ответить с цитированием
Старый 16.05.2008, 20:53   #504
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

Все учтено. Допустим тайловое поле нет смысла каждый раз отрисовывать по кускам, оно однажды "собранное" хранится в буфере и ассемблером перегоняется в DrawBuf в самом начале построения кадра. Остальные объекты все анимированные, ...все живое и "дышит". По-любому, в каждый момент времени все объекты меняют свой кадр анимации, тут ничего не поделаешь. Отрисовка в буфере после передачи заднего фона идет выборочно, т.е. только там где есть какой-либо объект, причем порядок соблюдается, какой объект за каким находится, можно персонажа проводить между двумя деревьями, все равно придется отрисовывать оба, если бы они были статичные, тогда конечно, только зону прохода персонажа и куски из текстур деревьев.
Потом, вывод множества мелких участков на экран будет медленнее чем экран целиком, ...а в данном случае, когда множество объектов, все движется, эффективнее окажется вывод целиком.
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 16.05.2008 в 20:57.
Beermonza вне форума   Ответить с цитированием
Старый 16.05.2008, 21:04   #505
mutabor
Телепат с дипломом
Профессионал
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
Репутация: 1570

icq: 401708834
По умолчанию

Цитата:
Потом, вывод множества мелких участков на экран будет медленнее чем экран целиком
А вот с этим я не согласен. Тут важна общая площадь. Причен разница будет действительно ощутимая.
Я про вывод уже на экран, не про буфер в памяти, буфер по степени нагрузки на процессор и рядом не стоит, там и смысла особого нет что-то улучшать.

Последний раз редактировалось mutabor; 16.05.2008 в 21:08.
mutabor вне форума   Ответить с цитированием
Старый 16.05.2008, 22:13   #506
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

mutabor, там же через BitBlt отрисовка в WMPaint:

BitBlt(DC,X,Y,X2,Y2,DrawBuf.Canvas.Handle ,0,0,SRCCOPY);
типа X,Y,X2,Y2 нужно как-то определить и будет отрисовка участка.

Теперь мысль ясна, ...нужно подумать.

alexBlack, что-то я по ходу туплю, ...вот это для текстуры на один кадр:

Т
М

TexPoint := Bits + (SH*2-1 - y_up ) * texLine + x_left*3;
MapPoint := Bits + (SH*2-1 -(y_up+SH)) * texLine + x_left*3;

...а если в текстуре "лента" из кадров, такие же с маской, но продолжают текстуру:

TTTTT
MMMM

тут я зашел в тупик, ...куда прописать сдвиг в SW*Номер кадра?
texLine теперь длиннее ширины одного кадра в 5 раз.
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Старый 16.05.2008, 22:43   #507
mutabor
Телепат с дипломом
Профессионал
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
Репутация: 1570

icq: 401708834
По умолчанию

Цитата:
BitBlt(DC,X,Y,X2,Y2,DrawBuf.Canvas. Handle,0,0,SRCCOPY);
типа X,Y,X2,Y2 нужно как-то определить и будет отрисовка участка.
Вот, вот, уловил мысль.
Сделай для пробы простой тест-имитацию (выведи кусочками некоторую часть буфера меньшую чем весь буфер и увидишь разницу).
В случае с BitBlt тут важны все шесть параметров
BitBlt(DC,X1,Y1,W,H,DrawBuf.Canvas.Handle,X2,Y2,SRCCOPY);
X1,Y1(куда ложить) должны совпадать с X2,Y2(откуда брать) буфер ведь такой же как и экран?
W,H - ширина и высота копируемой части (так вот кто ворует мои мегагерцы =)

Ход этот давно известен и используется в играх. Не знаю правда, есть ли где-то инфа по нему. Но я уверен это не проблема, мы и сами с усами )))
Кстати винда окна тоже экономно перерисовывает (InvalidateRect)

p/s. Я раньше интересовался mpeg4 кодеками, так там для пущего сжатия этот же принцип используется - ключевые кадры содеражщие полный кадр и за ключевым идет серия промежуточных только с изменениями, намного меньшие по размеру.

p/s.2 Конечно при скроллинге (если он есть) будет перерисовываться все, но в более статичных сценах отрисовка будет быстрее. Можно сделать условие если изменения превышают какой-то процент то все это пропустить и просто вывести буфер целиком.

Последний раз редактировалось mutabor; 16.05.2008 в 23:08.
mutabor вне форума   Ответить с цитированием
Старый 16.05.2008, 23:45   #508
alexBlack
Профессионал
 
Регистрация: 12.10.2007
Адрес: -
Сообщений: 1,204
Репутация: 920
По умолчанию

расчет смещений:
Вложения
Тип файла: doc формулы.doc (68.0 Кб, 35 просмотров)
alexBlack вне форума   Ответить с цитированием
Старый 17.05.2008, 15:27   #509
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

alexBlack, так и делал, только чуть изменил для скорости:
Код:
TexPoint := Bits + (SH*2-1 - y_up    ) * TexLine + (SW*TexKadr + x_left)*3;
MapPoint := Bits + (SH*2-1 -(y_up+SH)) * TexLine + (SW*TexKadr + x_left)*3;
...при этом выводилась меняющаяся размазня полупрозрачная. Потом нашел ошибку при загрузке картинки: TexLine:=TexW*3, ...TexW у меня искуственно содержит ширину одного кадра но не всей ширины текстуры. Заменил на: TexLine:=Tex.Width*3; ...и все заработало.

Без Pointer'ов и сдвигов через DWORD() работает на порядок быстрее! alexBlack, тебе низкий поклон!

Цитата:
Сообщение от mutabor
Вот, вот, уловил мысль.
Сделай для пробы простой тест-имитацию (выведи кусочками некоторую часть буфера меньшую чем весь буфер и увидишь разницу).
В случае с BitBlt тут важны все шесть параметров
BitBlt(DC,X1,Y1,W,H,DrawBuf.Canvas. Handle,X2,Y2,SRCCOPY);
X1,Y1(куда ложить) должны совпадать с X2,Y2(откуда брать) буфер ведь такой же как и экран?
W,H - ширина и высота копируемой части (так вот кто ворует мои мегагерцы =)

Ход этот давно известен и используется в играх. Не знаю правда, есть ли где-то инфа по нему. Но я уверен это не проблема, мы и сами с усами )))
Кстати винда окна тоже экономно перерисовывает (InvalidateRect)
Дядя с "усами" вот что решил предпринять. Можно пробежаться по по карте в буфере, и через BitBlt выводить на экран только области объектов, все это есть уже в памяти, нужно только сделать цикл. Задний фон пусть выводится только однократно весь целиком, а затем куски объектов. Буду пробовать.
За мысль респект!
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Старый 17.05.2008, 16:59   #510
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

Пока результаты такие:
7 объектов 250х270, занимают в разброс ~ 50% экрана
Вызов 7 раз BitBlt - 7% CPU
1 раз BitBlt всего буфера - 4% CPU

Делал так:

Код:
procedure TForm1.WMPaint(var Message: TWMPaint);
begin
   DC:=Message.DC;
   if DC=0 then DC:=BeginPaint(Handle,PS);
   try
     for dt:=0 to mapH do begin    // mapH высота карты в клетках 12х12
       for dz:=0 to mapW do begin  // mapW ширина карты в клетках 12х12
          if Map.Index>0 then begin // если больше 0, то там есть объект
              // выводим на экран часть буфера с объектом
              BitBlt(DC,
                      dz*24-TexDispX,
                      dt*12-TexDispY,
                      X_right-X_left,
                      Y_down-Y_up,
                      ZoneBitmap.Canvas.Handle,
                      24+dz*24-TexDispX,
                      12+dt*12-TexDispY,
                      SRCCOPY);
               end;
           end;
       end;        
   finally
      if Message.DC=0 then EndPaint(Handle,PS);
   end;
end;
Вроде все верно, ...что скажите?
__________________
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уроки по созданию игр для новичков... -=DeS=- Gamedev - cоздание игр: Unity, OpenGL, DirectX 750 14.11.2017 21:26
Музыка программистов - как вы относитесь к АРИИ? Весёлый Жека Свободное общение 46 10.10.2008 22:32
Конкурсы по созданию игр на Delphi mutabor Свободное общение 0 15.06.2007 12:40
Работа по созданию ПО remix Фриланс 3 22.04.2007 11:00


07:09.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.