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

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

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


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

Цитата:
первая же строка не устраивает 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, 13:55   #502
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от 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, 18:49   #503
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

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

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

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

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

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

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

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

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, 21:43   #507
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
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 в 22:08.
mutabor вне форума Ответить с цитированием
Старый 16.05.2008, 22:45   #508
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

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

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, 15:59   #510
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Пока результаты такие:
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 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840