Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прорисовка карты [Delphi, Windows]


Страницы:   1 2

AbLaZe ©   (2004-03-27 20:26:00) 

Добрый вечер !!!
Я вот что хотел спросить ...
Я пишу игру на DelphiX и создаю карту уровня следующим способом ...

procedure TGameForm.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var i,n : integer;
x,y : integer;
begin
if DXDraw1.CanDraw=false then exit;
DXDraw1.Surface.Fill(0);

y:=0;
for n:=1 to 15 do begin
x:=0;
for i:=1 to 10 do begin
DxImageList1.Items.Find('Terrain').Draw(DXDraw1.Surface,x,y,0);
x:=x+DxImageList1.Items.Find('Terrain').Width;
end;
y:=y+DxImageList1.Items.Find('Terrain').Height;
end;

y:=-16;
for n:=1 to 15 do begin
x:=-32;
for i:=1 to 10 do begin
DxImageList1.Items.Find('Terrain').Draw(DXDraw1.Surface,x,y,0);
x:=x+DxImageList1.Items.Find('Terrain').Width;
end;
y:=y+DxImageList1.Items.Find('Terrain').Height;
end;

Потом рисую человечка и двигаю его по опр. закону
Так вот у меня после этого ЛАГИ страшные ...
Машина у меня очень мощная P4 2400 512 DDR 128 GeForce FX
Если я убираю прорисовку карты и оставляю только человечка, то все OK
В чем проблема ???

Если я что-то делаю не так, то подскажите мне как правильно прорисовывать карту местности, ведь она у меня будет больших размеров ...


AbLaZe   (2004-03-28 16:16:00) [21]

Я все сделал как вы сказали, т.е. насчет поиска !!!
Но все равно 4-5 FPS !!!
А когда делаю в опциях DXDraw FullScreen и ставлю 8 бит, то все 100 FPS !!!
Но я не хочу FullScreen и 8 бит я хочу оконное приложение как ULTIMA ONLINE !!!
Кто-нить знает способ как это сделать !!!


AbLaZe   (2004-03-28 15:38:00) [22]

СПАСИБО !!!


cyborg   (2004-03-28 15:08:00) [23]

[15] AbLaZe   (28.03.04 14:30)
Может.


cyborg   (2004-03-28 15:07:00) [24]

Делай поиск один раз

спрайт:=DxImageList1.Items.Find('Terrain');
Ширина:=спрайт.Width;
Высота:=спрайт.Height;

y:=0;
for n:=1 to 15 do
begin
  x:=0;
  for i:=1 to 10 do
  begin
    спрайт.Draw(DXDraw1.Surface,x,y,0);
    x:=x+Ширина;
  end;
  y:=y+высота;
end;


AbLaZe   (2004-03-28 14:53:00) [25]

НУ помогите мне пожалуйста !!!
Я вас очень прошу ...


AbLaZe   (2004-03-28 14:30:00) [26]

Да, кстати, у меня игрушка не полноэкранная а в окне как Ultima
От этого может зависеть FPS ???


AbLaZe   (2004-03-28 14:29:00) [27]

А вы не могли бы мне помочь найти способ быстрее прорисовывать спрайты ???


cyborg   (2004-03-28 14:21:00) [28]

не выводится, а ищется.


AbLaZe   (2004-03-28 14:05:00) [29]

Спрайты у меня 64*32, т.е изометрия !!!
Вы вот тут насчитали сколько раз выводится спрайт
(10*15)+(10*15)+15+(10*15)+(10*15)+15=630
а как же его можно меньше выводить ведь мне надо выводить поверхность земли маленькими спрайтиками !!!


Mihey   (2004-03-28 00:09:00) [30]

> -1, согласен. просто посчитал это очевидным и не стал указывать явно.

Я ещё раз прошу прощения. Чтобы понять меня лучше, нужно исправить опечатку в слове "большая", т.е. "больная".


TButton   (2004-03-27 23:42:00) [31]

-1, согласен. просто посчитал это очевидным и не стал указывать явно.


Mihey   (2004-03-27 23:39:00) [32]

Не сочтите за придирку. Только что погорел на коде, так что большая тема...

> sprites: array[0..<количество спрайтов>] of Integer;

should be

> sprites: array[0..<количество спрайтов-1>] of Integer;


TButton   (2004-03-27 23:19:00) [33]

а вообще есть хитрый прием. создается массивчик типа
sprites: array[0..<количество спрайтов>] of Integer;
и константы

const
 SP_TERRAIN=0;
 SP_MAN=1;
 SP_GUN=3;
 SP_HUT=4;

далее, в onCreate заполняем массив

...
sprites[SP_TERRAIN]:=DxImageList.Items.IndexOf('Terrain');
<и т.д.>
...

ну и соответственно в програме вызываем уже
DxImageList1.Items.sprites[SP_TERRAIN].Draw(DXDraw1.Surface,x,y,0);


очень удобно при большом количестве спрайтов.


TButton   (2004-03-27 23:06:00) [34]

имхо, зависит от количества элементов в списке и позиции искомого. в таком случае наиболее часто используемые нужно просто размещать в начале списка.


cyborg   (2004-03-27 23:02:00) [35]


> но я не думаю что это сильно увеличит быстродействие

Да уж, 1 поиск по строке или 630 совсем небольшая разница.


TButton   (2004-03-27 22:28:00) [36]

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


cyborg   (2004-03-27 22:15:00) [37]

Считаем сколько раз вызывается Find('Terrain')
(10*15)+(10*15)+15+(10*15)+(10*15)+15=630
И отчего же "Так вот у меня после этого ЛАГИ страшные "?
И это только 20 строчек кода.


TButton   (2004-03-27 22:12:00) [38]

я попробовал ваш код

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var
 i,n : integer;
 x,y : integer;
begin
 if DXDraw1.CanDraw=false then exit;
 DXDraw1.Surface.Fill(0);

 y:=0;
 for n:=1 to 15 do
 begin
   x:=0;
   for i:=1 to 10 do
   begin
     DxImageList1.Items.Find('Terrain').Draw(DXDraw1.Surface,x,y,0);
     x:=x+DxImageList1.Items.Find('Terrain').Width;
   end;
   y:=y+DxImageList1.Items.Find('Terrain').Height;
 end;

 y:=-16;
 for n:=1 to 15 do
 begin
   x:=-32;
   for i:=1 to 10 do
   begin
     DxImageList1.Items.Find('Terrain').Draw(DXDraw1.Surface,x,y,0);
     x:=x+DxImageList1.Items.Find('Terrain').Width;
   end;
   y:=y+DxImageList1.Items.Find('Terrain').Height;
 end;

 DxDraw1.Surface.Canvas.Release;
 DxDraw1.Flip;
 Caption:=Format('fps: %d',[DxTimer1.FrameRate]);
end;


стабильно выдает 40-50 fps
возможно вы не переставили интервал у таймера.


TButton   (2004-03-27 22:11:00) [39]

и тем не менее...
у вас какая-то странная организация цикла прорисовки карты. не уверен что из-за этого у вас лаги, но лучши ширину спрайта выдернуть один раз. кстати, какие у спрайта размеры?


TButton   (2004-03-27 22:02:00) [40]

молодой человек, вы как думаете, тег CODE он для чего вообще нужен? вы думаете легко под утро разбирать неформатированый код?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо