Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.191 c
1-1089382208
MadGhost
2004-07-09 18:10
2004.07.25
Как сделать PREVIEW у TPrinter???


3-1088753741
white
2004-07-02 11:35
2004.07.25
Подскажите какой компонент поможет в решении следующей задачи.


4-1087288195
Cannabis2003
2004-06-15 12:29
2004.07.25
ASCII vs бинарники


1-1089450222
Pafnuty
2004-07-10 13:03
2004.07.25
Программно вставить текст в TRxRichEdit


14-1089207209
Алхимик
2004-07-07 17:33
2004.07.25
Опрос :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский