Geschwindigkeitsfrage zur Tile-Engine

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Reborn

Betreff: Geschwindigkeitsfrage zur Tile-Engine

BeitragMi, Mai 14, 2008 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Abend!

Ich hab mein Tile-Editor-Projekt mal wieder aufgegriffen und es hat sich ein Problem aufgetan:

Ich hab neulich nämlich Clipping eingebaut, also dass nur die Tiles berechnet werden, die man auch auf dem Screen sieht. Das klappt glücklicherweise auch gut und die FPS bleiben, (fast) egal wie groß die Karte ist, bei 125. Sobald ich aber mein Raster einschalte, sinken die Frames auf 50-80. Und das auch, wenn ich keine Tiles eingezeichnet habe, also auch keine gezeichnet werden.

Ich frag mich jetzt woran das liegt. Das muss eigenltihc shcon immer so gewesen sein, ist mir nur bis jetzt noch nicht aufgefallen, da ich die FPS-Anzeige nicht von Anfang an hatte. Das Raster funktioniert folgendermaßen: es wird einfach pro Tile ein Bild eingezeichnet, dass nur zwei Linien beinhaltet, der Rest ist transparent. Im Endeffekt ergeben die zwei Linien pro Tile dann ein Raster. Nur warum brechen die FPS so radikal ein? Ich hab's jetzt auch mal in das Clipping eingebunden, dass also auch das Raster nur da berechnet wird, wo man es sieht, jedoch bringt das keinen FPS-Schub. Sehr seltsam.
Ich dachte, dass es daran liegt, dass die Tiles und das Raster zusammen zu viele Bilder aufeinmal sind, bei einer 20 x 15 Tiles großen Map wären das ja 600 Tiles. Aber wie gesagt spielt es ja keine Rolle, ob Tiles da sind oder nicht, sobald das Raster da ist, brechen die FPS ein. Dabei sollten gerade so fast ganz transparente Bilder doch keine große Herausforderung sein oder?

Viel Text für diese Kleinigkeit. Ich wüsste auch eine simple und effektive Lösung: Einfach das Tileset kopieren und so bearbeiten, dass bei jedem Tile ein Raster angezeigt wird, und wenn das Raster aktiviert ist, einfach das bearbeitete Tileset zeichnen, statt das normale. Das würde Resourcen einsparen, so hab ich's auch gemacht, als ich wollte, dass inaktive Layer abgedunkelt angezeigt werden: Einfach ein neues Tileset erstellt, was dunkler ist und das anstelle des normalen gezeichnet.

Dennoch interessiert mich brennend, wieso wegen dem Raster die FPS so einbrechen. Ich weiß allerdings auch nicht, welchen Code ich jetzt posten soll, das ist eher ein theoretisches Problem, der Code ist nämlich simpel. Eine For-Schleife, die die Map durchgeht, bzw. den Bereich, der sichtbar ist und dann pro Tile ein Rastertile zeichnet.

Danke fürs Lesen.

BladeRunner

Moderator

BeitragDo, Mai 15, 2008 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
wachst du das raster mit rect oder line?
line ist sehr langsam, aber auch die anderen Zeichenbefehle sind nur mässig schnell. Idealerweise machst Du dir ein image mit dem Raster und zeichnest das über die Tiles, das sollte weniger performance ziehen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Reborn

BeitragDo, Mai 15, 2008 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
wachst du das raster mit rect oder line?
line ist sehr langsam, aber auch die anderen Zeichenbefehle sind nur mässig schnell. Idealerweise machst Du dir ein image mit dem Raster und zeichnest das über die Tiles, das sollte weniger performance ziehen.

Rect hab ich früher mal benutzt, aber das ist wirklich extrem langsam. Meine Tile-Engine ist halt auf 32 x 32 px großen Tiles aufgebaut, das Raster besteht eben auch aus Tiles. Also ein 32 x 32 großes Bild, das 2 Striche enthält und somit, auf den Screen gepflastert, das Raster ergibt.
Keine Ahnung, warum das so heftig an der Performance knabbert, wenn ich die normalen Tiles einzeichne läuft alles weich. Das ergibt für mich gar keinen Sinn, dass das mit dem Raster langsamer sein soll, müsste eigentlich noch schneller sein, da ca. 90% des Rasterbildchens ohnehin nicht eingezeichnet wird, wegen der Transparenz.

Reborn

BeitragFr, Mai 16, 2008 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, der beste Fall ist eingetreten, ich hab die Lösung selber gefunden. Very Happy Allerdings brauch ich jemanden, der mir erklärt, warum meine erste Variante so langsam ist...

Also: Dass das Raster immer schon so FPS-fressend war, stimmt nicht. Ich war gestern wohl etwas übermüdet. Fakt ist, dass das erst aufgetreten ist, als ich das Clipping auch beim Raster verwenden wollte. Das sah folgendermaßen aus:

Code: [AUSKLAPPEN]

For x = mapx_start to mapx_ende
   For y = mapy_start to mapy_ende
      For z = 0 to 2
         Tiles werden gezeichnet bla
         If raster = 1 then Drawimage img_raster, x * tile_gr + scrollx, y * tile_gr + scrolly
      Next
   Next
Next


Das dürfte verständlich sein. Wenn ich das so mache sinken die FPS. Warum? Meine Vermutung ist, dass das daran liegt, dass halt immer wieder geprüft wird, ob raster = 1 ist. Bei meinem anderen Versuch stehen die For-Schleifen IN der If-Schleife (raster wird also nur einmal abgefragt) und dann klappt's einwandfrei.

Aber kostet das etwa soviel Leistung? Ich kann's mir nicht vorstellen, weil wenn die Tiles gezeichnet werden, laufen auch 2 Select-Schleifen durch. Gut, wie wir wissen, ist Select schneller als If. Aber ist das jetzt wirklich die Ursache des Problems? Wär auf jeden fall nicht so schön, ich würde das Raster- und Tilezeichnen gerne zusammenfassen, sonst hätte ich beide For-Schleifen-Wulste ja zweimal.

Smile

EDIT: Ok, wenn ich mir mein Code-Beispiel so ansehe, fällt es mir direkt auf: Ich zeichne das Raster drei mal, nämlich für jedes Layer einmal (For z = 0 to 2)... Embarassed
 

Dreamora

BeitragFr, Mai 16, 2008 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
das problem ist wohl eher der raster selbst, da damit alles doppelt gezeichnet wird ausser es wird ausser dem raster nix gezeichnet. Vor allem wird der raster für z = 0 bis 2 gezeichnet anstatt nur für ne aktuelle Ebene zb

die Raster abfrage kannst du einfach vor das erste "for" packen bzw. aussen rum. kann sich ja mitten drin net ändern also muss es auch net mitten rein Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Reborn

BeitragFr, Mai 16, 2008 1:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
das problem ist wohl eher der raster selbst, da damit alles doppelt gezeichnet wird

Jo, das dachte ich zuerst ja auch, aber ob nur das Raster oder Raster und Tiles zusammen gezeichnet wurden, machte ja keinen Unterschied. Das Problem war eher:
Zitat:
Vor allem wird der raster für z = 0 bis 2 gezeichnet anstatt nur für ne aktuelle Ebene zb

Hatte ich ein paar Minuten vorher auch rausgefunden, wenn du mein Edit betrachtest. Wink

Vielen Dank trotzdem!! Smile
 

Dreamora

BeitragFr, Mai 16, 2008 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
bei den IFs kannst du dennoch noch sparen. Ein IF vor die Schleifen reicht bzw. um die Schleifen, drinnen musst du net prüfen ob Raster = 1, da sich das net ändern kann in dem Codeblock (vorteil wenn dinge nur nach einander, net nebeneinander passieren können)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Reborn

BeitragFr, Mai 16, 2008 2:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
bei den IFs kannst du dennoch noch sparen. Ein IF vor die Schleifen reicht bzw. um die Schleifen, drinnen musst du net prüfen ob Raster = 1, da sich das net ändern kann in dem Codeblock (vorteil wenn dinge nur nach einander, net nebeneinander passieren können)

Jo, stimmt, das hätte ich jetzt fast vergessen! Smile

Aber wie stellst du dir das vor? Ich wollte sowohl die Tiles als auch das Raster ja in den selben For-Schleifen zeichnen lassen. Aber wenn ich einfach ein IF darum packe, würde das wieder darauf hinauslaufen, dass ich die For-Schleifen zwei mal hätte, da das Raster ja nicht permanent aktiviert ist. Oder versteh ich dich falsch?
 

Dreamora

BeitragFr, Mai 16, 2008 2:10
Antworten mit Zitat
Benutzer-Profile anzeigen
In dem Fall hast du natürlich recht, dann machts keinen sinn das IF aussen rum zu legen, dann ist es rein packen wohl sinnvoller.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

kriD

BeitragFr, Mai 16, 2008 8:27
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiß micht, ob dus getan hast, aber versuch auch möglichst nur einmal die beiden geschachtelten for-schleifen zu verwenden und da alles reinzupacken.. is viiiel schneller als mehrere dieser "hammer-schleifen"

MfG kriD
Wenn ich du wäre, wäre ich lieber ich!
 

Omenaton_2

BeitragFr, Mai 16, 2008 9:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte nur erwähnen, daß ich bei meinem Tile Engine auch das Problem hatte (und habe), daß wenn Gitternetz eingeblendet wird (bei mir ist das ein Image, der auf das Feld gelegt wird, kein Line oder sowas), die Performance stark einbricht. Das scheint einfach so zu sein. Du kannst bestimmt mit kleinen Optimierungen was rausholen, aber ich denke Raster Einblendung wird dein Spiel immer merklich bremsen.

Reborn

BeitragFr, Mai 16, 2008 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
kriD hat Folgendes geschrieben:
ich weiß micht, ob dus getan hast, aber versuch auch möglichst nur einmal die beiden geschachtelten for-schleifen zu verwenden und da alles reinzupacken.. is viiiel schneller als mehrere dieser "hammer-schleifen"

MfG kriD

Jop, das war ja von Anfang an der Plan... allein schon, weil der For-Schleifenblock 35 Zeilen lang ist und das wären im Endeffekt dann 70 Zeilen. Ich steh nicht so auf überlangen Code... Smile Klar, wenn es so schneller wär, würde ich nicht zögern, aber das ist es ja scheinbar nicht.
Zitat:
aber ich denke Raster Einblendung wird dein Spiel immer merklich bremsen.

Hm, nö! Smile Jetzt, wo ich den Fehler gefunden habe, läuft alles super. Ich verliere vielleicht 3-5 FPS oder so, wenn das Raster eingeblendet ist... Ich weiß ja nicht, ob deine Variante mit dem einen großen Image so viel langsamer ist... vielleicht solltest du auch mal probieren, das Raster aus einzelnen kleinen Teilen zusammenzusetzen (und dann natürlich Clipping einbauen).

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group