webForumDet fria alternativet

2 fps

Programmering

4 svar · 303 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Håller på med en is engine lelr vad det nu heter.. Den är inte klar än och jag försöker fixa lite smoothscrolling nu.. problemet är att garfiken ritas i 2 fps, hur får jag det snabbare?

procedure TMainForm.Draw();
var
  x:     integer;
  y:     integer;
  plotX: integer;
  plotY: integer;
  image: tbitmap;
begin
image := TBitMap.Create;
image.Transparent := true;

  for y := 0 to YCOUNT do begin
    for x := 0 to XCOUNT do begin

      plotX := ( x*TITLEWIDTH+(y AND 1)*(TITLEWIDTH div 2) ) + worldX * TITLEWIDTH;
      plotY := ( y*( TITLEHEIGHT div 2 + 1 ) ) + worldY *TITLEHEIGHT;

      case map[x,y] of
        clLime: image.LoadFromFile('grass.bmp');
        clRed: image.LoadFromFile('lava.bmp');
        clBlue: image.LoadFromFile('water.bmp');
      else
        image.LoadFromFile('grass.bmp');
      end;

      DXDraw.Surface.Canvas.Draw(plotX,plotY,image);

    end;
end;
Medlem sedan maj 20002 993 inlägg
#2

Precis när jag skrev inlägget kom jag på att det inte var så smart att ladda om grafiken på rutorna hela tiden och gjorde så här istället:

procedure TMainForm.Draw();
var
  x:     integer;
  y:     integer;
  plotX: integer;
  plotY: integer;
  grass, lava, water: tbitmap;
begin
grass := TBitMap.Create;
lava := TBitMap.Create;
water := TBitMap.Create;
grass.Transparent := true;
lava.Transparent := true;
water.Transparent := true;
grass.LoadFromFile('grass.bmp');
lava.LoadFromFile('lava.bmp');
water.LoadFromFile('water.bmp');

  for y := 0 to YCOUNT do begin
    for x := 0 to XCOUNT do begin

      plotX := ( x*TITLEWIDTH+(y AND 1)*(TITLEWIDTH div 2) ) + worldX * TITLEWIDTH;
      plotY := ( y*( TITLEHEIGHT div 2 + 1 ) ) + worldY *TITLEHEIGHT;

      case map[x,y] of
        clLime: DXDraw.Surface.Canvas.Draw(plotX,plotY,grass);
        clRed: DXDraw.Surface.Canvas.Draw(plotX,plotY,lava);
        clBlue: DXDraw.Surface.Canvas.Draw(plotX,plotY,water);
      else
        DXDraw.Surface.Canvas.Draw(plotX,plotY,grass);
      end;

    end;
end;

end;

Nu ritas grafiken i 7-8 fps... men fortfarande alldeles för segt....

Medlem sedan maj 2000192 inlägg
#3

Varför skapar du nya grass,lava och water object varje gång draw anropas. De laddas ju nu varje gång och det gör det onödigt långsamt...

Lägg

grass := TBitMap.Create;
lava := TBitMap.Create;
water := TBitMap.Create;
grass.Transparent := true;
lava.Transparent := true;
water.Transparent := true;
grass.LoadFromFile('grass.bmp');
lava.LoadFromFile('lava.bmp');
water.LoadFromFile('water.bmp')

i nån annan procedur istället och gör
grass, lava, water: tbitmap;
i Class deklarationen för TMainForm.

borde gå lite snabbare

Medlem sedan maj 20002 993 inlägg
#4

Frågan är varför jag överhuvudtaget anväbder tbitmaps som jag ritade på surface canvas.
Skapade en TPictureCollection (tror de heter så) och ritade upp bilderna direkt på surface och vips 25-30 fps.

Den allra högsta fps fick jag genom att skapa nya surfaces till titles bilderna som jag sedan ritade med blit...

Funderar lite på vad skillnaden är mellan att rita på surface och sedan använda flip() och att använda blit() och fastblit (eller om det var blt...)...

Medlem sedan maj 20002 993 inlägg
#5

Det ska ju bli ett title baserat spel som kanske märks.. Jag sket i att använda "iso titles" (sneda rutor) och använder nu vanliga fyrkantiga - mycket enklare.

Problemet är ju att kanterna bli jävligt fula. På http://www.gamedev.net/reference/articles/article934.asp står det lite hur man kan göra... men jag fattar ändå inte hur jag ska göra.. Nån som kan hjälpa mig?

263 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)