webForumDet fria alternativet

2 fps

4 svar · 301 visningar · startad av Alpha II

Alpha IIMedlem sedan maj 20002 579 inlägg
#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;
Alpha IIMedlem sedan maj 20002 579 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....

WiNNeMedlem sedan maj 2000195 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

Alpha IIMedlem sedan maj 20002 579 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...)...

Alpha IIMedlem sedan maj 20002 579 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?

Genererad på 388 ms · cache AV · v20260730165559-full.f96bc7eb