Seite 1 von 3

Performanceproblem wenn sich zwei Sprites überlappen?

Verfasst: 30.07.2009 20:52
von pureanfänger
Hallo Pureboarduser,
ich habe folgendes Problem:

Ich möchte einige Spielbrettfelder über ein Hintergrund Sprite darstellen.
Wenn ich das mache, brechen die FPS von ca. 60 auf 35 ein.

Zur Veranschaulichung ein Screenshot
Bild

Ich habe also vor, auf dem roten Hintergrundsprite diese grauen Felder darzustellen.

1. Versuch:
Ich habe das rote Hintergrundsprite (720x720) alleine dargestellt. = ca. 60 FPS

2. Versuch:
Ich habe die Felder alleine dargestellt. = ca. 60 FPS

3. Versuch:
Ich habe das rote Hintergrundsprite (720x720) darüber die Felder dargestellt. = ca. 35 FPS

Ich hoffe ihr habt eine Idee wie ich das Problem lösen kann. :D

Re: Performanceproblem wenn sich zwei Sprites überlappen?

Verfasst: 30.07.2009 20:59
von DrShrek
pureanfänger hat geschrieben:Ich hoffe ihr habt eine Idee wie ich das Problem lösen kann. :D
Klar!
Ohne Source haben wir sogar sehr viel Ideen.
Mit Source möglicherweise aber eine Beispiel-Lösung Deines Problems.

Verfasst: 30.07.2009 21:11
von Kaeru Gaman
ja, da musst du wirklich was total verbuxelt haben...

weil man auf einem Hintergrundsprite locker drei dutzend Detailsprites darstellen kann,
alle in Transparent, ohne dass die FpS unter zwei- drei-hundert fallen.

Verfasst: 30.07.2009 21:43
von pureanfänger
weil man auf einem Hintergrundsprite locker drei dutzend Detailsprites darstellen kann,
alle in Transparent, ohne dass die FpS unter zwei- drei-hundert fallen.
du hast mir da gerade einen super Zipp gegeben.
Du hast recht mit deiner Aussage, es liegt nicht an den Spielfeldsprites auf dem Hintergrund, sonder an der masse von großen Sprites die ich dargestellt habe.

Bsp: Waldsprite: 400px x 400px 32 Bit Farbtiefe und 300 Pix/Zoll Auflösung.

Wenn ich eines der anderen Sprites nicht darstellen lasse, steigen die FPS wieder auf normale Werte.

Mir scheint, ich sollte mal meine Grafiken überarbeiten und die Hochauflösende Qualität ein wenig reduzieren.

Verfasst: 31.07.2009 17:33
von The_Dark_Zim-.-
Normal dürfte das purebasic bzw. dem pc ziehmlich latte sein wie viele details deine sprites haben ;) daran wird es nicht liegen...
Warum schreibst du uns nicht einfach den quellcode ?


Gruß Zim

Verfasst: 31.07.2009 17:43
von Kaeru Gaman
...aber eine große Menge Transparenz würde schon was ausmachen - aber nicht in dem Maße.

> Waldsprite: 400px x 400px 32 Bit Farbtiefe und 300 Pix/Zoll Auflösung.

also, wenn du eine Tile hast, sollte die nur 32x32 oder 64x64 sein, bzw. was du da hast 88x76 (?)

und wie gesagt, wenn man es halbwegs richtig macht, kann PB tausende von Sprites darstellen bei 60FpS.

dein Drop auf 35 kann bedeuten, dass du bei den meisten Frames minimal länger brauchst als 16._6 ms, und diese deshalb doppelt darstellen musst.
wenn dein Monitor auf 60Hz läuft, hast du nunmal nur die Wahl zwischen 60 und 30 FpS.

Verfasst: 31.07.2009 17:53
von Kurzer
Jepp, das Problem hatte ich auch mal mit ner alten Grafikkarte.
Wenn da das Sprite nicht quadratisch und von den Ausmaßen eine Zweiterpotenz war, dann ging das richtig langsam vonsatten.

Versuch mal Deine Sprites quadratisch zu machen und auf x^2 Ausmaß zu bringen.
Selbst wenn der Inhalt nicht quadratisch ist - mach das Sprite trotzdem quadratisch. Die vermeintlich überschüssige Fläche ist ja eh durchsichtig.

Bei mir hat das geholfen.

Verfasst: 31.07.2009 17:56
von Kaeru Gaman
wau.. auch bei 2D sprites, nich nur bei Sprite3D? O_O"

Verfasst: 31.07.2009 18:00
von The_Dark_Zim-.-
Hier das geht auch mit viel details ;) (gut nur 800*600 aber da wird sich auch bei 1600*1200 nix tun)

Code: Alles auswählen

InitSprite()
InitKeyboard()

OpenScreen(800,600,32,"Sprite's")

LoadSprite(0,"hintergrund.bmp")
LoadSprite(1,"felder.bmp")

TimeDelay.l=100 
MasterTimer.l=GetTickCount_() 

Repeat
 
 ClearScreen($000000)
 DisplaySprite(0,0,0)
 DisplaySprite(1,10,10)
 DisplaySprite(1,10,180)
 DisplaySprite(1,10,350)
 DisplaySprite(1,220,10)
 DisplaySprite(1,220,180)
 DisplaySprite(1,220,350) 
 DisplaySprite(1,430,10)
 DisplaySprite(1,430,180)
 DisplaySprite(1,430,350) 
 
   TimeDelay=GetTickCount_()-MasterTimer 
  MasterTimer=GetTickCount_() 
  FrameRate.f=1000/TimeDelay
 
 StartDrawing(ScreenOutput())
 DrawText(700,20,Str(framerate.f))
 StopDrawing()
 
 FlipBuffers(#PB_Screen_WaitSynchronization)
 ExamineKeyboard()
 Delay(15)
Until KeyboardPushed (#PB_Key_Escape)
und hier die pic's :
http://dc117.2shared.com/download/69310 ... 9-d02246a4
http://dc117.2shared.com/download/69310 ... 1-abb3d87c

Gruß Zim

Verfasst: 31.07.2009 18:09
von Moskito
Hallo

Ein Delay von 15 könnte etwas knapp werden. Vorrausgesetzt, Windows kehrt auch pünktlich zurück, blieben gerade noch 1.6 Millisekunden zur Darstellung und dem synchronisierten Flip. Probiere mal kleinere Werte für das Delay aus.