Tiles fressen meine Leistung
Übersicht BlitzBasic Beginners-Corner
superSCBetreff: Tiles fressen meine Leistung |
Mo, Sep 12, 2011 0:11 Antworten mit Zitat |
|
---|---|---|
Guten Morgen, Tag oder Abend
(jenachdem wo du gerade bist und wann du gerade ließt) Ich hab mal wieder ein Problem mit einem Dim feld, oder eher den Tiles die es enthält. Naja, es ist zwar kein Fehler, jedoch ein sehr sehr großes Problem. Es geht darum dass, wenn ich mehr als die Hälfte des Bildschirms mit Tiles voll habe, wird mein Spiel um mindestens die Hälfte verlangsamt. Ich hab leider keine Ahnung woran das liegt, das Problem ist aufgetaucht nachdem ich einen hintergrund zeichnen lassen hab, jedoch nachdem ich das wundervolle Drawimagerect funktiönchen auskommentiert habe, blieb es dabei. Ich dachte dann es liege an den updates der Map jedoch bin ich dort auch nicht richtig gewesen. Also frage ich mal: Kennt ihr das Problem? Wisst ihr vieleicht woran es liegen könnte? Und wenn ja, WORAN ?!? mfg SSC |
||
XeresModerator |
Mo, Sep 12, 2011 0:19 Antworten mit Zitat |
|
---|---|---|
Was ist den "langsam" bei dir? Wie viele FPS hast du vorher/nachher?
Wie viel zeichnest du? Generell zeichnet man nur das, was auf dem Bildschirm ist - wenn deine Karte größer ist als der Bildschirm solltest du nur das zeichnen, was tatsächlich sichtbar ist. Benutze ggf. Millisecs um zu messen, wie viel Zeit bei welchen Funktionen drauf geht. Ansonsten gilt wie immer: Zu dem Code könnte man wesentlich mehr sagen. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
superSC |
Mo, Sep 12, 2011 0:29 Antworten mit Zitat |
|
---|---|---|
Ich Zeichne immer nur dass was auch auf dem Bildschirm ist, also alles was x>0/y>0 und x<graphX/y<graphY also (graphX= X größe des Fensters usw.).
Ich weis nicht so recht wie ich das mit Millisecs machen soll, werd es mir aber morgen nach der Schule mal ansehen. Und nun zu dem Problem, ich würde nur ungern meinen Gesamten Code hier veröffentlichen. MFG bis morgen SSC |
||
XeresModerator |
Mo, Sep 12, 2011 0:39 Antworten mit Zitat |
|
---|---|---|
So in der Art kannst du die Zeit für bestimmte Teile des Codes messen:
BlitzBasic: [AUSKLAPPEN] Local t = MilliSecs() Berechnest du die passenden Koordinaten für die Anzeige im voraus, oder gehst du trotzdem noch das ganze Array durch? |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Midimaster |
Mo, Sep 12, 2011 1:29 Antworten mit Zitat |
|
---|---|---|
Der Geschwindigkeitseinbruch trat ja nach Zeichnen des Hintergrundes auf. Möglicherweise wird versehentlich in der Hauptschleife immer wieder etwas geladen?
Gewöhne dir an in jeder Funktion und vor jedem zeitaufwändigem Arbeitsabschnitt eine Meldung mit DEBUGLOG ausgeben zu lassen. Dabei sieht man dann oft, das Teile des Codes immer wieder abgearbeitet werden, obwohl das nicht so geplant ist. BlitzBasic: [AUSKLAPPEN]
Natürlich musst du im BB-Menü "Programm - Debug-Enabled?" dazu aktivieren! Vielleicht liest du auch mal mein "Fehler suchen"-Tutorial.... https://www.blitzforum.de/foru...hp?t=33510 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Pokoyo |
Mo, Sep 12, 2011 18:51 Antworten mit Zitat |
|
---|---|---|
Hi,
die Darstellungsgeschwindigkeit hängt unter anderem auch von der Größe der Tiles ab. Je kleiner diese sind umso langsamer wirds. Sollte das dein Problem sein : Tiles vorm Anzeigen in einen Imagebuffer schreiben oder einfach größere tiles verwenden. Desweiteren besteht noch die Möglichkeit deine 3d hardware für die Tiles zu benutzen (B3D) hoffe konnte dir helfen, gruß poko |
||
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax| |
skey-z |
Mo, Sep 12, 2011 19:10 Antworten mit Zitat |
|
---|---|---|
Also selbst mit meiner alten Gurke mit IntelGMA onboard Grafikkarte hatte ich keine Probleme mit normalen 32²px Tilesets, auch wenn ich über die Karte hinaus gezeichnet habe.
Ich schätze mal eher, dass das Problem wo anders liegen wird, aber so lange er uns keinen Code zur Verfügung stellt, können wir nur raten und nciht wirklich helfen. Also entweder die wichtigen Programmteile mal hier rein schreiben, oder das Programm komplett ins Archiv hochladen. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
Pokoyo |
Mo, Sep 12, 2011 19:49 Antworten mit Zitat |
|
---|---|---|
skey-z hat Folgendes geschrieben: Also selbst mit meiner alten Gurke mit IntelGMA onboard Grafikkarte hatte ich keine Probleme mit normalen 32²px Tilesets, auch wenn ich über die Karte hinaus gezeichnet habe.
Bei einer Auflösung von 1920x1080 und 32px Tiles bekommst du sehr wohl Probleme, das sind dann nämlich schon über 2k kleine Bildchen die da angezeigt werden müssen. Aber hast schon Recht wir können ja nur Vermutungen anstellen. Er muss ja nicht den ganzen Code posten. Pseudo reicht unter Umständen. |
||
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax| |
skey-z |
Mo, Sep 12, 2011 20:03 Antworten mit Zitat |
|
---|---|---|
Hehe, diese Auflösung hätte meine alte Kiste gar nicht anzeigen können | ||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
superSC |
Mo, Sep 12, 2011 21:29 Antworten mit Zitat |
|
---|---|---|
Ok, mit dem Millisecs befehl habe ich eine nette kleine 38 beim Updaten der Map bekommen.
Des weiteren, ist es nur so langsam wenn ich über skype am telefonieren bin. Nun möchte ich den scheiß trotzdem mal optimieren, und deshalb hier mal mein update_Map() code: Code: [AUSKLAPPEN] Function update_map()
For y = 0 To Map_height-1 For x = 0 To Map_width-1 If x*32<(scrollx#*(-1))+graphX Then If x*32>(scrollx#*(-1))-48 Then If y*32<(scrolly#*(-1))+graphY Then If y*32>(scrolly#*(-1))-48 Then If map(x,y,5)<>0 Then DrawImage tilesetdark$,x*32+scrollx#,y*32+scrolly#,map(x,y,5) If map(x,y,0)<>0 Then DrawImage tileset$,x*32+scrollx#,y*32+scrolly#,map(x,y,0) If map(x,y,1)<>0 Then DrawImage entity$,x*32+scrollx#,y*32+scrollY#,map(x,y,1) If grid=1 Then Color 210,210,0 : Rect x*32+scrollx#,y*32+scrolly#,32,32,0 : Color 255,255,255 If trig=1 Then If map(x,y,2)<>0 Then DrawImage trigger$,x*32+scrollx#,y*32+scrollY#,map(x,y,2) EndIf EndIf EndIf EndIf If map(x,y,0)<>0 Then map(x,y,3)=1 map(x,y,4)=1 If mode<>4 Then If map(x,y,0)<>3 And map(x,y,0)<>9 And map(x,y,0)<>10 And map(x,y,0)<>4 Then map(x,y,5)=map(x,y,0) EndIf EndIf If map(x,y,3)<>2 Then If map(x,y,0)=9 Then map(x,y,3)=2 : map(x,y,4)=-5 If map(x,y,0)=10 Then map(x,y,3)=2 : map(x,y,4)=-5 If map(x,y,0)=11 Then map(x,y,3)=2 : map(x,y,4)=-5 If map(x,y,0)=3 Then map(x,y,3)=0 : map(x,y,4)=-5 If map(x,y,0)=4 Then map(x,y,3)=3 : map(x,y,4)=-5 EndIf Else map(x,y,3)=0 map(x,y,4)=-5 EndIf Next Next ;GRASS WÄCHST If grasstimer>=200 Then For y = 0 To Map_height-1 For x = 0 To Map_width-1 If x>0 And y>0 Then If x<map_width And y<map_height Then If map(x,y,0)=3 Then If map(x,y,4)=-5 If map(x,y+1,0)<>1 Then ;wenn unter grass nicht erde dann, map(x,y,0)=0 ; grass weg! EndIf If map(x+1,y+1,0)=1 Then If map(x+1,y,0)=0 Then map(x+1,y,0)=3 map(x+1,y,4)=-6 ElseIf map(x+1,y,0)=1 Then If map(x+1,y-1,0)=0 Then map(x+1,y-1,0)=3 map(x+1,y-1,4)=-6 EndIf EndIf ElseIf map(x+1,y+1,0)=0 Then If map(x+1,y+2,0)=1 Then If map(x+1,y+1,0)=0 Then map(x+1,y+1,0)=3 map(x+1,y+1,4)=-6 EndIf EndIf EndIf If map(x-1,y+1,0)=1 Then If map(x-1,y,0)=0 Then map(x-1,y,0)=3 map(x-1,y,4)=-6 ElseIf map(x-1,y,0)=1 Then If map(x-1,y-1,0)=0 Then map(x-1,y-1,0)=3 map(x-1,y-1,4)=-6 EndIf EndIf ElseIf map(x-1,y+1,0)=0 Then If map(x-1,y+2,0)=1 Then If map(x-1,y+1,0)=0 Then map(x-1,y+1,0)=3 map(x-1,y+1,4)=-6 EndIf EndIf EndIf EndIf EndIf EndIf EndIf Next Next grasstimer=0 EndIf ;WASSER FLIEßT If watertimer>=50 Then For y = 0 To Map_height-1 For x = 0 To Map_width-1 If map(x,y,0)=10 Then ;wenn normal Wasser If map(x,y,4)=-5 Then If map(x,y-1,0)=0 Then map(x,y,0)=9 ;Wasser wird zu Oberflächen wasser EndIf If map(x-1,y,0)=0 Or map(x-1,y,0)=3 Then map(x-1,y,0)=10 map(x-1,y,4)=-6 ElseIf map(x-1,y,0)=4 Then map(x-1,y,0)=5 EndIf If map(x+1,y,0)=0 Or map(x+1,y,0)=3 Then map(x+1,y,0)=10 map(x+1,y,4)=-6 ElseIf map(x+1,y,0)=4 Then map(x+1,y,0)=5 EndIf If map(x,y+1,0)=0 Or map(x,y+1,0)=3 Then map(x,y+1,0)=10 map(x,y+1,4)=-6 ElseIf map(x,y+1,0)=4 Then map(x,y+1,0)=5 EndIf EndIf EndIf If map(x,y,0)=9 Then If map(x,y,4)=-5 Then If map(x,y-1,0)<>0 Then map(x,y,0)=10 EndIf If map(x-1,y,0)=0 Or map(x-1,y,0)=3 Then map(x-1,y,0)=10 map(x-1,y,4)=-6 ElseIf map(x-1,y,0)=4 Then map(x-1,y,0)=5 EndIf If map(x+1,y,0)=0 Or map(x+1,y,0)=3 Then map(x+1,y,0)=10 map(x+1,y,4)=-6 ElseIf map(x+1,y,0)=4 Then map(x+1,y,0)=5 EndIf If map(x,y+1,0)=0 Or map(x,y+1,0)=3 Then map(x,y+1,0)=10 map(x,y+1,4)=-6 ElseIf map(x,y+1,0)=4 Then map(x,y+1,0)=5 EndIf EndIf EndIf Next Next watertimer=0 EndIf ;LAVA FLIEßT If lavatimer>=200 Then For y = 0 To Map_height-1 For x = 0 To Map_width-1 If map(x,y,0)=4 Then If map(x,y,4)=-5 Then If map(x+1,y,0)=0 Or map(x+1,y,0)=3 Then map(x+1,y,0)=4 map(x+1,y,4)=-6 EndIf If map(x-1,y,0)=0 Or map(x-1,y,0)=3 Then map(x-1,y,0)=4 map(x-1,y,4)=-6 EndIf If map(x,y+1,0)=0 Or map(x,y+1,0)=3 Then map(x,y+1,0)=4 map(x,y+1,4)=-6 EndIf EndIf EndIf Next Next lavatimer=0 EndIf watertimer=watertimer+1 grasstimer=grasstimer+1 lavatimer=lavatimer+1 End Function und jetzt lacht mich nicht aus xD Eigentlich geht das mit dem 1024x768 Bildschirmbreite und 32²px pro tile |
||
Pokoyo |
Mo, Sep 12, 2011 22:01 Antworten mit Zitat |
|
---|---|---|
hmmmm, bei einem 3 dimensionalen array ist es besser wenn man für die 3. dimension Konstanten anlegt um auch nach 2 tagen noch zu wissen was man da programmiert hat^^
Beispiel :Code: [AUSKLAPPEN] If map(x,y,0)=9 Then map(x,y,3)=2 : map(x,y,4)=-5 besser so : Code: [AUSKLAPPEN] If map(x,y,Tile_Typ)=9 Then map(x,y,Tile_Eigenschaft1)=2 : map(x,y,Tile_Eigenschaft2)=-5
Wenn man nun wüsste was da in deinen Feldern passiert könnte man vlt. was dazu sagen..... Ein paar Ausdrücke könnte man vorberechnen, daran wirds allerdings nicht liegen. Und warum sind deine Images Strings ? Code: [AUSKLAPPEN] tilesetdark$
All diese Abfragen kommen bei jedem Tile : Code: [AUSKLAPPEN] If x*32<(scrollx#*(-1))+graphX Then If x*32>(scrollx#*(-1))-48 Then If y*32<(scrolly#*(-1))+graphY Then If y*32>(scrolly#*(-1))-48 Then Die Pixelgenaue Position brauchst du nur einmal am anfang errechnen. danach hängst du die anderen Tiles einfach dran. Ob das allerdings die bremse ist ? mhmmm..... |
||
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax| |
Eingeproggt |
Mo, Sep 12, 2011 22:14 Antworten mit Zitat |
|
---|---|---|
Größter Optimierungstipp: DrawBlock statt DrawImage verwenden. Macht zumindest beim untersten Map-Layer keine Probleme und spart je nach Graphikkarte ordentlich Leistung.
Minimalere Optimierungsmöglichkeiten wären dann so Sachen wie Pokoyo angesprochen hat: y*32 zwischenspeichern, überlegen ob Abfragen "hervor gezogen" werden können... mfG, Christoph |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
XeresModerator |
Mo, Sep 12, 2011 22:36 Antworten mit Zitat |
|
---|---|---|
Das hier wird ein Problem sein:
Code: [AUSKLAPPEN] ;GRASS WÄCHST
If grasstimer>=200 Then For y = 0 To Map_height-1 For x = 0 To Map_width-1 If watertimer>=50 Then For y = 0 To Map_height-1 For x = 0 To Map_width-1 If lavatimer>=200 Then For y = 0 To Map_height-1 For x = 0 To Map_width-1 Du machst 3x soviel wie nötig - pack die Timer nochmal in die Schleifen und arbeite alle Änderungen in einem Rutsch ab. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
superSC |
Mo, Sep 12, 2011 22:43 Antworten mit Zitat |
|
---|---|---|
Das problem bei Drawblock ist dass es die Transparenz ignoriert.
Da ich aber Gras wachsen lasse, auf meinem wundervollen Dreck, und jenes wundervolle Gras nicht noch einen nicht so wundervollen pinken block beinhalten soll, funktioniert dass leider nicht so gut ^^ zu den sachen mit den string bildern, keine ahnung, ich hab das irgendwie schon immer so gemacht ^^ EDIT: stimmt, ich könnte die 3 timer in einen packen, dann müsste ich einfach nur mal mehr abfragen lassen. |
||
Eingeproggt |
Mo, Sep 12, 2011 22:52 Antworten mit Zitat |
|
---|---|---|
Ja, ignoriert Transparenz... aber das is doch zumindest bei den "untersten Bildern" wurscht... ich weiß ja nicht genau wie dein System ausschaut, aber sozusagen der Boden hat ja keine durchsichtigen Stellen, folglich brauchts da kein DrawImage. | ||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
Midimaster |
Mo, Sep 12, 2011 23:49 Antworten mit Zitat |
|
---|---|---|
38 msec pro Durchlauf sind noch keine Katastrophe. Vor allem würdest Du dass noch nicht "merken". Denn selbst dabei kommst Du noch auch 26 fps.
Ich hab mal Deinen Code mit dieser Test-Umgebung laufen lassen... BlitzBasic: [AUSKLAPPEN] Graphics 1024,768 Und selbst wenn man den Code so manipuliert, dass man immer überall alle möglichen Tiles zeichnen lässt kommt man nur auf 30 msec Zeitverbrauch für die Funktion (gemessen auf meinem ältesten Notebook mit 32MB Onboard-Grafikkarte). Die gesamte Zeit wird im oberen Teil mit den DrawImage verbraten. Als brauchst Du noch keine Optimierung für den unteren Teil der Funktion zu planen. Allerdings fühlt sich das Programm damit nicht "langsam" an! Beschreibe mal, wie sich das "langsam" bei Dir anfühlt, oder bemerkbar macht... Du schreibst... Zitat: ...wenn ich mehr als die Hälfte des Bildschirms mit Tiles voll habe,...
ist das so eine Art "Tile-Editor"? Oder warum gibt es Situationen, in denen nur die Hälfte des Bildschirms voller Tiles ist? Dann wäre noch eine wichtige Angabe, um welche Grafikkarte es sich handelt. Ich tippe eher auf eine Auslastung des Systems. Maile doch mal die Hauptschleife, also alles zwischen REPEAT und UNTIL. Benutzt Du einen CreateTimer()? Benutzt Du FLIP 0? |
||
superSC |
Mi, Sep 14, 2011 21:24 Antworten mit Zitat |
|
---|---|---|
Ok, es lag anscheinend daran, dass ich vieleicht ein paar programme zu viel laufen hatte, denn jedesmal wenn ich über skype am telefonieren bin, läuft es langsam, wenn ich nicht am telefonieren bin, läuft es perfekt.
Des weiteren: Ja es ist auch ein Editor, aber ich meinte es eher folgender masen, wenn ich den halben bildschirm mit Tiles bezeichnen lasse, fängt es an, ziemlich langsam zu laufen. Es verliert undgefähr auf einmal die hälfte an geschwindigkeit. @Eingeproggt, ich brauche die Transparenz weil ich z.B. bei den grass Tiles(welche wirklich NUR das grass beinhalten, und nicht z.B. wie bei Minecraft der dreck einfach zu grass geändert wird.) auch den hintergrund zwischen den einzelnen halmen sichtbar machen will,(falls ich es noch nicht erwähnt habe, ist es ein Jump'N'Run spiel, also von der Seite gesehen) und auch z.B. bei den Bäumen also bei den Blättern die transparenz haben möchte. Die grafikkarte: Ich habe eine Sapphire HD 6790 1GB GDDR5 PCI Express Ich hoffe mal dass ihr damit was anfangen könnt. mfg SSC |
||
PSY |
Mi, Sep 14, 2011 21:41 Antworten mit Zitat |
|
---|---|---|
Pokoyo hat Folgendes geschrieben: Bei einer Auflösung von 1920x1080 und 32px Tiles bekommst du sehr wohl Probleme, das sind dann nämlich schon über 2k kleine Bildchen die da angezeigt werden müssen. Aber hast schon Recht wir können ja nur Vermutungen anstellen. Er muss ja nicht den ganzen Code posten. Pseudo reicht unter Umständen. 2000 tiles sind nix. musst sie halt im imageram bewegen und den screen dann capturen. hab bei 1920x1080 und 32px tiles ne FPS rate von 2260 ^^ Code: [AUSKLAPPEN] Graphics 1920,1080,32
SetBuffer BackBuffer() Dim gfx(9) Local i%, x%, y%, xmap%=0, ymap%=0, im% ; 32x32er boxen erstellen + einfärben For i=0 To 9 Color Rnd(255), Rnd(255), Rnd(255) Rect 0,0,32,32,1 gfx(i)=CreateImage(32,32) GrabImage gfx(i),0,0 Next Color 255,255,255 ;speedfactor (anzahl pixel die gescrolled werden) Local speed%=2 Dim level(99,99) ; 100x100 screen Local back%=CreateImage(3200,3200) SetBuffer ImageBuffer(back) For x=0 To 99 For y=0 To 99 im=Rand(9) level(x,y)=im DrawImage gfx(im),x*32,y*32 Next Next SetBuffer BackBuffer() Repeat Cls If KeyDown(203) If xmap<0 And xmap>=-1280 xmap=xmap+speed EndIf EndIf If KeyDown(205) If xmap>-1280 And xmap<=0 xmap=xmap-speed EndIf EndIf If KeyDown(200) If ymap<0 And ymap>=-1280-speed ymap=ymap+speed EndIf EndIf If KeyDown(208) If ymap>-1280 And ymap<=0 ymap=ymap-speed EndIf EndIf DrawBlock back,xmap,ymap FPS_frames = FPS_frames + 1 If FPS_timer + 1000 < MilliSecs() FPS_fps = FPS_frames FPS_frames = 0 FPS_timer = MilliSecs() EndIf Text 70,40,FPS_fps Flip 0 Until KeyHit(1) End L8er, PSY |
||
PSY LABS Games
Coders don't die, they just gosub without return |
- Zuletzt bearbeitet von PSY am Do, Sep 15, 2011 6:27, insgesamt 2-mal bearbeitet
Midimaster |
Mi, Sep 14, 2011 22:05 Antworten mit Zitat |
|
---|---|---|
@psy...
genau! was ich sage... das kann umöglich an den Tiles liegen. Und schon gar nicht mit der Grafikkarte. Vielleicht stellt superSC ja mal doch noch die Main-Schleife rein....? Es wäre für alle dann viel leichter, als ewig so im Trüben rumzueiern. Also superSC!!! Bitte stell nun wirklich mal was rein, damit wir fundiert helfen können!!! |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group