Jump to content



Welcome to KnowledgeSutra - Dear Guest , Please Register here to get Your own website. - Ask a Question / Express Opinion / Reply w/o Sign-Up!
- - - - -

Delphix And Fps


No replies to this topic

#1 kvarnerexpress

    Super Member

  • Kontributors
  • PipPipPipPipPipPipPipPipPip
  • 407 posts

Posted 06 October 2005 - 11:07 AM

I've recently acquired DelphiX and have gone through multiple tutorials on how to use it efficiently. However, through programming, I've come across code from a tutorial that was discontinued and I'd like to finish it for learning. The code's for an isometric tiling engine for a game, but the problem is that the FPS rate is EXTREMELY slow come rendering extremely large maps. It crawls at a rate of 5-7FPS, even on pretty powerful machines. (I'll include the code below.)

Now, the code itself draws out at each interval of the timer (which I know is a bad way to do things) but there are animated tiles (6 frames each tile), so I don't know any alternative method to bypass the drawing of unupdated tiles. I know that it should only redraw when it needs to, but this is for a game so it should be redrawing quite often.

I have looked elsewhere, but found no solutions and I have probed at the code for a few days now. Any suggestions/fixes/sample code would be nice.

Code:

unit uGame;

interface

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

const TileHeight=15;

type TTile = Record
               TileImage:Integer;
               Marked:Boolean;
             end;

type TTileMap = Record
                  Map:array[1..50,1..50]of TTile;
                end;

type
  TMainForm = class(TDXForm)
    DXDraw: TDXDraw;
    TileMaps: TDXImageList;
    DXTimer: TDXTimer;
    DXInput: TDXInput;
    Panel: TPanel;
    Markers: TDXImageList;
    procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
    procedure FormCreate(Sender: TObject);
    procedure DrawTiles(StartX,StartY:Integer);
    procedure CheckTiles(X,Y:Integer; var XTile, YTile: Integer);
    procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Frame:Integer;
  MainForm: TMainForm;
  Map:TTileMap;
  StartX,StartY:Integer;
  TileX,TileY:Integer;

implementation

{$R *.DFM}

procedure TMainForm.DrawTiles(StartX,StartY:Integer);
var PosX,PosY,LoopX,LoopY,XTile,YTile,NumOfTilesY,TileImage:Integer;
begin
  PosY:=0;
  PosX:=1;
  NumOfTilesY := 0;
  for LoopY := 1 to 49 do
  begin
    NumOfTilesY := NumOfTilesY + 1;
    XTile:=1;
    YTile:=LoopY;
    for LoopX := 1 to NumOfTilesY do
    begin
      TileImage:=Map.Map[XTile,YTile].TileImage;
      TileMaps.Items[TileImage].Draw(DXDraw.Surface,StartX+PosX+LoopX*64,StartY+LoopY*15,Frame);
      if Map.Map[XTile,YTile].Marked then
      begin
        //Markers.Items[0].Draw(DXDraw.Surface,StartX+PosX+LoopX*64,StartY+LoopY*15,0);
      end;
      XTile:=XTile+1;
      YTile:=YTile-1;
    end;

    PosX:=PosX-32;
    PosY:=PosY+15;
  end;
  for LoopY := 1 to 50 do
  begin
    XTile:=LoopY;
    YTile:=50;
    for LoopX := 1 to NumOfTilesY do
    begin
      TileImage:=Map.Map[XTile,YTile].TileImage;
      TileMaps.Items[TileImage].Draw(DXDraw.Surface,StartX+PosX+LoopX*64,StartY+PosY+LoopY*15,Frame);
      if Map.Map[XTile,YTile].Marked then
      begin
        //Markers.Items[0].Draw(DXDraw.Surface,StartX+PosX+LoopX*64,StartY+PosY+LoopY*15,0);
      end;
      XTile:=XTile+1;
      YTile:=YTile-1;
    end;
    NumOfTilesY:=NumOfTilesY-1;
    PosX:=PosX+32;
  end;

  // draw map marker here, above all tiles...
  //Markers.Items[0].Draw(DXDraw.Surface,StartX+PosX+LoopX*64,StartY+PosY+LoopY*15,0);
  
end;


procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);

begin
  if not DXDraw.CanDraw then Exit;
  DXDraw.Surface.Fill(0);
  Panel.Caption:='FPS: '+IntToStr(DXTimer.FrameRate) +' TileX: '+IntToStr(TileX) +' TileY: '+IntToStr(TileY);
  DrawTiles(StartX,StartY);
  DXDraw.Flip;
  DXInput.Update;
  { Check for mouse input here }
  If isLeft in DXInput.States then StartX:=StartX+16;
  If isRight in DXInput.States then StartX:=StartX-16;
  If isUp in DXInput.States then StartY:=StartY+8;
  If isDown in DXInput.States then StartY:=StartY-8;
  If (Frame=5) then
    Frame:=0
  else
    Frame:=Frame+1;

end;

procedure TMainForm.FormCreate(Sender: TObject);
var i,ii: integer;
begin
  Frame:=0;
  StartX:=0;
  StartY:=0;

  for i := 1 to 50 do
    for ii := 1 to 50 do
      Map.Map[i,ii].TileImage := Random(16); // 0-12

  DXTimer.Enabled:=True;
end;

procedure TMainForm.CheckTiles(X,Y:Integer; var XTile,YTile:Integer);
var LoopX,LoopY:Integer;
begin
  for LoopY := 1 to 50 do
  begin
    if (Y-((0.46875)*(X-StartX)+StartY+(LoopY*30))<15) and (Y-((0.46875)*(X-StartX)+StartY+(LoopY*30))>(-15)) then
    begin
      YTile:=LoopY;
    end;
  end;
  for LoopX := 1 to 50 do
  begin
    if (-(0.46875)*(X-StartX)+StartY+(LoopX*30)-Y<15) and ((-0.46875)*(X-StartX)+StartY+(LoopX*30)-Y>(-15)) then
    begin
      XTile:=LoopX;
    end;
  end;
end;

procedure TMainForm.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Map.Map[TileX,TileY].Marked:=False;
  CheckTiles(X-96,Y,TileX,TileY);
  Map.Map[TileX,TileY].Marked:=True;
end;

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = 27 then Application.Terminate();
end;

end.

Note: I've added the onKeyDown method for exiting. There used to be two buttons on the form, but that messed the control up when it came to scrolling with the keys.

Note2: If anyone knows how to scroll with the mouse, I'd really like to learn that.

Thanks to anyone that helps!
kvarnerexpress




Reply to this topic


This post will need approval from a moderator before this post is shown.

  


1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users