Performanceproblem wenn sich zwei Sprites überlappen?

Anfängerfragen zum Programmieren mit PureBasic.
pureanfänger
Beiträge: 74
Registriert: 29.03.2008 15:22

Performanceproblem wenn sich zwei Sprites überlappen?

Beitrag 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
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Performanceproblem wenn sich zwei Sprites überlappen?

Beitrag 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.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
pureanfänger
Beiträge: 74
Registriert: 29.03.2008 15:22

Beitrag 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.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Beitrag 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
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wau.. auch bei 2D sprites, nich nur bei Sprite3D? O_O"
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Beitrag 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
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
Moskito
Beiträge: 182
Registriert: 18.01.2006 23:01
Kontaktdaten:

Beitrag 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.
Antworten