Форум: "Игры";
Текущий архив: 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