![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прорисовка карты [Delphi, Windows]
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 он для чего вообще нужен? вы думаете легко под утро разбирать неформатированый код?