Zu Hardwarelastig?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

RazaR|619|

Betreff: Zu Hardwarelastig?

BeitragDi, Mai 06, 2008 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Hab mal n allgemeine Frage zur performance.
Also ich arbeitet derzeit an einem kleinen Geschicklichkeitsspiel, dass zwar grafisch nicht sonderlich aufwendig ist, jedoch aus einem Spielfeld mit 28x28 Feldern besteht, welche im extremfall alle mit einer Grafik gefüllt sind.
Wenn dies der Fall ist, geht bei meinem PC (Athlon 64 3200+,..., also nicht soooo alt) die Performance schon merkbar runter. (bei mir trotzdem bei weitem noch spielbar, aber bei älteren könnte es zum Problem werden)
Sind sicherlich nicht unbedingt wenig Grafiken, jedoch durchaus üblich wie ich finde.
Das einzigste was mir an Optimierungen eingefallen ist, ist wo nicht nötig auf Tranzparenzfarben zu verzichten (DrawBlock)

Wüsste mal gern was man da noch für Möglichkeiten hat, es weniger Hardwarelastig zu gestalten.


(Was ich mich z.B. frage ist, wie die Relationen beim Rechenaufwand sind, wenn man beispielsweise 4 Grafiken mit 20x20 Pixeln zeichnet im Vergleich zu einer, welche 80x80 Pixel sind.)

StepTiger

BeitragDi, Mai 06, 2008 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Also 28x28 Felder mit je einer Grafik sind im Normalfall noch sehr gut darstellbar.

Die Frage sollte wohl eher sein, was du in deinem Code falsch oder deoptimiert gemacht hast.

Zum Beispiel brauchst du nicht immer alle Grafiken, außerdem ist sowas mit einem Tileset wesentlich besser darstellbar.

Wenn du aber zum Beispiel 400x400er Grafiken nimmst oder sowas, dann brauchst du nicht immer alle zeichnen. Also denk mal daran. Außerdem verbrauchen die Grafiken eine Menge Speicher.

Wären es also zum Beispiel 28x28 400x400er Grafiken, dann würden die schon über 350MB Speicher brauchen. Schau mal, was du da an Grafiken noch einsparen kannst.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

The Shark

BeitragDi, Mai 06, 2008 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine große Grafik zu zeichnen ist meines Wisssens bexser als viele Kleine. Siehe zB Tilemaps.

StepTiger

BeitragDi, Mai 06, 2008 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine große Grafik zu zeichnen ist immer langsamer.
Allein, weil die außerhalb des Bildschirms liegenden Punkte mitberechnet werden.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

RazaR|619|

BeitragDi, Mai 06, 2008 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
also es sind 20x20 Pixel Grafiken, die sich in keinem Fall überschneiden, das heißt ich kann so einfach nichts weglassen. Was ich überlegte ist, Grafiken welche sich beispielsweise während des Spiels nicht mehr ändern in ein neues Image zu schreiben und diese somit immer als EIN Image zu zeichnen, welches dann über das gesamte Spielfeld geht und lediglich die freien Stellen mit den anderen zu versehen. Deswegen fragte ich ob das weniger Rechenzeit benötigt, als das Spielfeld komplett einzeln mit den kleinen 20x20 PixelGrafiken zu füllen.
Ich hoffte da noch bessere Lösungen zu finden, da im Worstcase auch sämtliche auf dem Spielfeld befindliche Objekte noch während dem Spiel Position ändern und sich verändern.


(Damit man sich das vll mal vorstellen kann, es handelt sich um ein Spiel, indem man Objekte durch geschicktes schieben mit einer Spielfigur an eine bestimmte Stelle bewegen muss. Dementsprechend gibt es Mauern und Abgründe(nicht beweglich) und z.B. Kisten und Spieler (beweglich).

D2006

Administrator

BeitragMi, Mai 07, 2008 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst da eindeutig was falsch. Zeig mal den Code, der die Grafiken in der Hauptschleife auf den Bildschirm zaubert.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

Dreamora

BeitragMi, Mai 07, 2008 8:55
Antworten mit Zitat
Benutzer-Profile anzeigen
naja wenn er wirklich 28x28 verschiedene bilder hat, dann würd das schon erklären warums einbricht, zumindest wenns 2D durch 3D ist. In letzterem musst du dringend darauf achten die Surfacezahl niedrig zu halten, du kannst net ma rasch für den Untergrund 600 Surfaces verheizen.

Im 2D Fall ist es von bedeutung was du für ne Grafikkarte hast. Je neuer desto weniger Leistung hast du im 2D Fall.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

RazaR|619|

BeitragMi, Mai 07, 2008 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also mein Quellcode sieht so aus:
Hab in nem Feld durch n 2- bzw. 3stellige Zahlen gespeichert, was für Objekte sich an entsprechender Stelle befinden.
Die erste gibt an was für ein Objekt (Mauer, Kiste, etc.), die zweite was für eine Grafik genau.

Code: [AUSKLAPPEN]

;Bg zeichnen
DrawBlock bg_game,0,0
DrawBlock ground,240,160

;Objekte zeichnen
For J = 0 To 27
  For I = 0 To 27   
    If objects(I,J) > 0 Then
      If Left$(Str$(objects(I,J)),1) <> 2 And Left$(Str$(objects(I,J)),1) <> 3 And  Left$(Str$(objects(I,J)),1) <> 8 Then
        DrawImage levelset(Left$(Str$(objects(I,J)),1),Mid$(Str$(objects(I,J)),2,1)),(I*20)+240,(J*20)+160      
      Else If Left$(Str$(objects(I,J)),1) = 2
        If Mid$(Str$(objects(I,J)),3,1) = 1 Then DrawImage levelset(Left$(Str$(objects(I,J)),1),Mid$(Str$(objects(I,J)),2,1)),(I*20)+240,(J*20)+160      
      EndIf
    EndIf
  Next
Next

; Spieler zeichnen
DrawImage levelset(3,direction-1),(player_x*20)+240+slide_x,(player_y*20)+160+slide_y   


(Hab n paar If- bedingungen rausgelassen, damits nicht zu lang wird, aber so ist es aufgebaut)
 

Dreamora

BeitragMi, Mai 07, 2008 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
args

3 Möglichkeiten:

1. Speicher die 3 variablen ab bevor du damit rumhantiert in 3 variablen
2. nimm types statt nem 3 stelligen string
3. nimm ne bank und pokebyte / peekbyte

Ich persönlich empfehle 2 oder 3, 1 ist nach wie vor schrott wegen den auslesebefehlen, speziell da 3 das alles auch macht nur mit nem einzigen schritt.
2 hat den vorteil das du später mehr als nur 7 möglichkeiten hast und es einfach erweitern kannst um weitere eigenschaften wenn du das mal willst
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

RazaR|619|

BeitragMi, Mai 07, 2008 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Dementsprechend liegt die Hohe Rechzeit nicht am zeichnen selbst sondern dem umwandeln der Variablen?

Ok wie gesagt, da fehlte mir das Hintergrund wissen.
Danke

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group