Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

Прорисовка карты   Найти похожие ветки 

 
AbLaZe   (2004-03-27 20:26) [0]

Добрый вечер !!!
Я вот что хотел спросить ...
Я пишу игру на 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
В чем проблема ???

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


 
TButton ©   (2004-03-27 22:02) [1]

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


 
TButton ©   (2004-03-27 22:11) [2]

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


 
TButton ©   (2004-03-27 22:12) [3]

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

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
возможно вы не переставили интервал у таймера.


 
cyborg ©   (2004-03-27 22:15) [4]

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


 
TButton ©   (2004-03-27 22:28) [5]

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


 
cyborg ©   (2004-03-27 23:02) [6]


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

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


 
TButton ©   (2004-03-27 23:06) [7]

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


 
TButton ©   (2004-03-27 23:19) [8]

а вообще есть хитрый прием. создается массивчик типа
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);


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


 
Mihey ©   (2004-03-27 23:39) [9]

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

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

should be

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


 
TButton ©   (2004-03-27 23:42) [10]

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


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

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

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


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

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


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

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


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

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


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

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


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

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


 
cyborg ©   (2004-03-28 15:07) [17]

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

спрайт:=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;


 
cyborg ©   (2004-03-28 15:08) [18]

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


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

СПАСИБО !!!


 
AbLaZe   (2004-03-28 16:16) [20]

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


 
cyborg ©   (2004-03-28 16:26) [21]

1) Рисовать не по таймеру
2) выводить графику во вторичный буфер
3) писать хороший код


 
AbLaZe   (2004-03-28 16:28) [22]

А как это не по таймеру ???
И как выводить во вторичный буфер ???


 
AbLaZe   (2004-03-28 16:48) [23]

Ну ответьте мне please !!!!!!!!


 
AbLaZe   (2004-03-28 17:01) [24]

Я ВАС очень сильно прошу помогите мне написать этот кусок кода !
Мне надо чтобы рисовалась поверхность земли из маленьких спрайтиков (64*32) и по этой поверхности двигался человечек (но это я уже сделал !!!) Мне осталось только нарисовать поверхность большого размера, так, чтобы был scroll по карте, но у меня ЛАГИ
Когда я убираю прорисовку карты и оставляю только человечка то все OK !!!


 
AbLaZe   (2004-03-28 18:10) [25]

Тут есть кто-нить ???
Если вы не хотите отвечать так и скажите ...
Чего ВЫ молчите ???
Мне нужна помощь вы что не можете мне помочь ????


 
Kobik ©   (2004-03-28 18:57) [26]

Не надо ставить 8 бит. От этого сильные лаги доже в полноэкранном режиме. Чем тебе не нравятся 16 и 32?


 
TButton ©   (2004-03-28 19:06) [27]

да откуда там лаги!
приведи весь код, а то я никак не пойму почему у меня лагов нет.


 
AbLaZe   (2004-03-28 19:15) [28]


unit GameUnit;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DXDraws, DXClass, ExtCtrls, StdCtrls, DXInput;

type
 TGameForm = class(TForm)
   DXDraw1: TDXDraw;
   DXImageList1: TDXImageList;
   DXTimer1: TDXTimer;
   OptionsPanel: TPanel;
   SkillPanel: TPanel;
   CharPanel: TPanel;
   InvPanel: TPanel;
   OtherPanel: TPanel;
   CmdPanel: TPanel;
   Label1: TLabel;
   CmdText: TComboBox;
   CmdButton: TButton;
   SayTimer: TTimer;
   procedure DXDraw1Initialize(Sender: TObject);
   procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
   procedure DXDraw1Finalize(Sender: TObject);
   procedure CmdTextKeyPress(Sender: TObject; var Key: Char);
   procedure CmdButtonClick(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure SayTimerTimer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 GameForm: TGameForm;

implementation

{$R *.dfm}

Uses TypeUnit, NetUnit;

var CurBx, CurBy, Bx,By : integer;
say, Move : boolean;
MyText : String;
w,h : integer;
Land,hero : TPictureCollectionItem;

procedure TGameForm.DXDraw1Initialize(Sender: TObject);
begin
DxTimer1.Enabled:=true;
Bx:=150;
By:=150;
CurBx:=150;
CurBy:=150;
Move:=false;
say:=false;
w:=DxImageList1.Items.Find("Terrain").Width;
h:=DxImageList1.Items.Find("Terrain").Height;
Land:=DxImageList1.Items.Find("Terrain");
Hero:=DxImageList1.Items.Find("Bot");
end;

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
Land.Draw(DXDraw1.Surface,x,y,0);
x:=x+w;
end;
y:=y+h;
end;

y:=-16;
for n:=1 to 15 do begin
x:=-32;
for i:=1 to 10 do begin
Land.Draw(DXDraw1.Surface,x,y,0);
x:=x+w;
end;
y:=y+h;
end;

if Move=false then
Hero.Draw(DXDraw1.Surface,CurBx,CurBy,0) else
begin

if Bx>CurBx then
if CurBx < Bx then begin
CurBx:=CurBx+5;
if CurBx>Bx then CurBx:=Bx;
end;
if Bx<CurBx then
if CurBx > Bx then begin
CurBx:=CurBx-5;
if CurBx<Bx then CurBx:=Bx;
end;

if By>CurBy then
if CurBy < By then begin
CurBy:=CurBy+5;
if CurBy>By then CurBy:=By;
end;
if By<CurBy then
if CurBy > By then begin
CurBy:=CurBy-5;
if CurBy<By then CurBy:=By;
end;
Hero.Draw(DXDraw1.Surface,CurBx,CurBy,0);
end;
if (CurBx=Bx) and (CurBy=By) then Move:=false;

if say=true then begin
with DXDraw1.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Color := clRed;
Font.Size := 15;
Font.Name := "Monotype Corsiva";
Textout(CurBx, CurBy-20, MyText);
Release;
end;
end;

DXDraw1.Surface.Canvas.Release;
DXDraw1.Flip;

Gameform.Caption:=Inttostr(DXTimer1.FrameRate);
end;

procedure TGameForm.DXDraw1Finalize(Sender: TObject);
begin
DxTimer1.Enabled:=false;
end;

procedure TGameForm.CmdTextKeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 then CmdButton.Click;
end;

procedure TGameForm.CmdButtonClick(Sender: TObject);
begin
CmdText.Text:=Trim(CmdText.Text);
if CmdText.Text="выход" then close;
if Pos("сказать",CmdText.Text)=1 then
begin
MyText:=CmdText.Text;
Delete(MyText,Pos("сказать",MyText),7);
MyText:=trim(MyText);
Say:=true;
sayTimer.Enabled:=true;
end;
if CmdText.Text<>"" then CmdText.Items.Add(CmdText.Text);
CmdText.Text:="";
end;

procedure TGameForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Game.Connected=true then Disconnect;
end;

procedure TGameForm.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then begin
BX:=X;
By:=Y;
Move:=true;
end;
end;

procedure TGameForm.SayTimerTimer(Sender: TObject);
begin
say:=false;
SayTimer.Enabled:=false;
end;

end.


 
AbLaZe   (2004-03-28 19:43) [29]

Графон я держу сразу в DXImageList !!!


 
TButton ©   (2004-03-28 20:00) [30]

ну сделал я прорисовку, в точности как у тебя. 30-40ms занимает бэз лагов. странно. у тебя спрайты каких размеров? у меня 64х64 каждый.


 
AbLaZe   (2004-03-28 20:06) [31]

Спрайты - 64*32
Да я сам не понимаю в чем дело ??????????????????????????????
Может быть какие-нибудь настройки GeForce 5 FX 128 Mb надо поменять, чтобы перло ?????????????????????????
Потому что тут вот какие дела:
Скачал я с сайта http://nerosg.narod.ru/files_3.htm
файлик "gnev.exe" и запустил его на одном компе где карточка интегринная S3 Savage 32 Mb
Все класс !!!
Потом ту же игру запустил на моей тачке GeForce 5 FX 128 Mb
ЛАГИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИ !!!


 
TButton ©   (2004-03-28 20:09) [32]

значит гефорс - маздай, бери пример с меня RivaTNT M64 16Mb + 3D тормозитель и никаких тебе лагов =)


 
AbLaZe   (2004-03-28 20:22) [33]

это-та понятно но что Вы можете мне существенного посоветовать, всмысле как мне писать игрульку чтобы не лагало на гефорсе ???


 
TButton ©   (2004-03-28 20:33) [34]

нет.


 
cyborg ©   (2004-03-28 22:15) [35]

Выложи архив с исходником и графикой, посмотрю.


 
cyborg ©   (2004-03-28 22:17) [36]

Только всякие .~ddp .~dfm .~pas убирай.


 
TButton ©   (2004-03-28 22:18) [37]

=)


 
lyeh ©   (2004-03-29 02:50) [38]

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


 
GrayFace ©   (2004-04-06 14:30) [39]

TButton ©   (28.03.04 20:09) [32]
>значит гефорс - маздай, бери пример с меня RivaTNT M64 16Mb + 3D тормозитель и никаких тебе лагов =)

RivaTNT - тоже Windows(так переводится мастдай на английский). EGA forever!!


 
woolf/psycho ©   (2004-04-08 17:02) [40]

Ну, раз на то пошло Speccy Rulez 4ever! А ежели серьезно, не в первый раз встречаюсь с этой проблемой (в смысле с тормозами в оконном режиме).Долго я копался и вот чё выкопал DirectX после 7й версии не умеет работать с 2D графикой!!! А тем более в оконном. И все более-менее новые карты нормальной поддержки двумерной графики практически не имеют. У меня жесточайшие тормоза в MM VI на GF2 MX400. И это при том, что на старенькой ривке все летает... Кроме того было замечено, что DelphiX несколько неадекватно реагирует на оконные режимы. Точнее загадочно. На одинаковых видеокартах, но с разной конфигурацией системы выдаются абсолютно разные результаты. Разброс 30fps - 270 fps...

to AbLaZe  
Может, попробуй не

for i:=1 to 10 do begin
  Land.Draw(DXDraw1.Surface,x,y,0);


А чегонить в стиле:
 lnd:=xxxx;
 for i:=1 to 10 do begin
   DxImageList1.Items [lnd].Draw (DXDraw1.Surface,x,y,0);

Так вроде малость быстрее...



Страницы: 1 2 вся ветка

Текущий архив: 2004.07.25;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.031 c
9-1080912585
KA_
2004-04-02 17:29
2004.07.25
Сценарий игры - ругайте :)


4-1086870441
Лёха
2004-06-10 16:27
2004.07.25
RegNotifyChangeKeyValue, отслеживание реестра


14-1089121711
QuasiLamo
2004-07-06 17:48
2004.07.25
Избавиться от запаха часов


8-1084179857
Клавдия
2004-05-10 13:04
2004.07.25
как склеить в один wav файл последовательно несколько файлов?


3-1088409321
Aln
2004-06-28 11:55
2004.07.25
Изменить значение поля таблицы Access (компонент доступа ADO)