Geschwindigkeitsfrage zur Tile-Engine
Übersicht

![]() |
RebornBetreff: Geschwindigkeitsfrage zur Tile-Engine |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, der beste Fall ist eingetreten, ich hab die Lösung selber gefunden. ![]() 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. ![]() 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)... ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Reborn |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() Vielen Dank trotzdem!! ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... ![]() Zitat: aber ich denke Raster Einblendung wird dein Spiel immer merklich bremsen.
Hm, nö! ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group