Codeoptimierung

Previous topic - Next topic

BumbleBee

Hi
Ich hab jetzt mal was zusammengestellt zur Codeoptimierung.
Nicht nur wegen der Übersicht im Code, sondern um noch das eine oder andere Prozent Speed aus seinem Rechner rauszuholen.
GLBasic ist schnell, aber eben nur wenn man auch richtig programmiert

1.Wo immer es geht Ganzzahlen (INTEGER) anstelle von Fließkommazahlen (Floats)     verwenden.
2.Strings sind am langsamsten.
3.Bei Select Case sollten die wahrscheinlichsten Fälle immer oben stehen.
4.Viele IF's sollten durch SELECT CASE ersetzt werden.
5.Viele GOTO's vermeiden
***********************************************************************************

            Bei Grafiken kann man natürlich am meisten rausholen.

1.Je höher die Auflösung desto langsamer der Aufbau. (Das weiß ja wohl jeder)
2.Kollisionsabfrage (Einer der Speedkiller Nr.1);)
 
  Bei 2D Spielen lieber Rechteck oder Kreiskollision als Pixelkollision.
  Sollte ein Spiel auf Tiles aufgebaut sein (z.B. Pacman), braucht man immer
  nur die Nachbarfelder der Figur prüfen.

  Bei 3D Spielen auf Kollisionsabfrage auf Polygonebene verzichten
   
Und die Kollision immer nur abfragen wenn es auch wahrscheinlich zu einer Kollision kommen kann. Also z.B. wenn sich die Figur in einem bestimmten Gebiet auf dem Spielfeld befindet, oder sich die Figur in einer bestimmten Entfernung zu einem Objekt (Haus,Gegner) befindet.
z.B.
   IF Distance < 50 THEN Prüfe_auf_Kollision
Und nicht bei jedem Schleifendurchgang alles auf alles prüfen. Der Prozessor wird es einem danken.;)

3.Nur die Teile zeichnen, die man auch sieht oder sehen will  (X_CULLMODE)
 
Das ist jetzt nur ein ganz geringer Teil von dem was man machen kann.
Wer von euch hat noch ein paar Tips und Tricks parat?
Gernot, du weißt doch worauf man achten sollte. Jeder Tip kann da hilfreich sein.
Wir wissen bestimmt noch nicht alles.

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Kitty Hello

Auf x86 Prozessoren sind Integer genauso schnell wie Gleitkommazahlen.
Goto ist der schnellste Weg von A nach B. Leider zu kosten der Übersichtlichkeit. ;)

Jetzt mal paar aus der Trickkiste:
- Bei 3D Kollisionen prüft GLBasic intern zuerst ob die "Hüllkugeln" der Objekte sich überhaput treffen. Bitte hier nichts optimieren, sonst ist es doppelt.
- Bei SPRCOLL macht GLBasic vorher intern einen BOXCOLL
- Will man den Abstand von 2 Objekten haben, macht man:
  dist = SQR(dx*dx + dy*dy + dz*dz)
  wobei dx, dy die Abstände in X/Y Richtung sind, also Punkt1.x - Punkt2.x
  (dz bei 2D weglassen)
  Jetzt der Test:
  IF dist < minimum_dist THEN ...
  Schneller:
  dist2 = dx*dx + dy*dy + dz*dz
  minimum_dist2 = minimum_dist*minimum_dist
  IF dist2 < minimum_dist2 THEN ...
  Das spart die Wurzel!
- GLBasic erkennt selbst, ob Objekte gezeichnet werden müssen oder nicht sichtbar sind
- Speicher alloziieren und freigebenkostet Zeit!
  Intern bemüht sich GLBasic möglichst wenig neu zu alloziieren oder schon im Voraus mehr Platz zu machen. Man kann aber helfen, indem man z.B. die Feldgrößen möglichst vorher schon weiß und einen Wert: max_anzahl speichert, so dass man nicht jedesmal REDIM aufrufen muss, wenn man z.B. einen Schuss hinzufügt.

- Wenn möglich sollte man Strings (a$) mit BYREF übergeben. Achtug: Dadurch kann man den String aussen ändern. Der String muss aber nicht kopiert werden, denn das kostet Zeit.

- X_CULMODE 1, wann immer möglich.
- In 3D versuchen echte Lichter zu vermeiden. Besonders bei mehreren Lichtern gehen Grafikkarten gerne in die Knie.


Mehr fällt mir auch gerade nicht ein. Ich habe versucht solche Sachen in GLBasic intern schon zu berücksichtigen, wo's geht.

Vampire

Quote from: GernotFrisch- Wenn möglich sollte man Strings (a$) mit BYREF übergeben. Achtug: Dadurch kann man den String aussen ändern.
versteh ich nicht.
was kann ich mir unter "aussen" vorstellen?

Quote- In 3D versuchen echte Lichter zu vermeiden. Besonders bei mehreren Lichtern gehen Grafikkarten gerne in die Knie.
was wäre denn dann ein unechtes licht? ne andere, hellere farbe für das object?

Kitty Hello

BYREF:
Code (glbasic) Select
a$  = "Hallo"
foo(a$)

// Schreibt "World"
PRINT a$, 0,0; SHOWSCREEN; MOUSEWAIT

FUNCTION foo: BYREF t$
   t$ = "World"
ENDFUNCTION
Echtes Licht ist 0-7, "unechtes" Licht ist z.B. BumpMapping, CelShading oder eine Lightmap http://www.flipcode.com/articles/article_lightmaps.shtml
Das geht mit Multitexturing (also X_SETTEXTURE a, b)

Vampire

okay, danke dir
mit BYREF und "aussen" habe ich einfach auf der leitung gestanden...*schäm*
und das texture eigenschaften "unechtes" licht genannt werden, wusste ich nicht...

Kitty Hello

Naja, man macht halt damit ein statisches Licht, das aber keines ist.

BumbleBee

Danke schon mal.
 
 Gernot, welche Variante ist besser?

  So
   IF BOXCOLL(x1,y1,w1,h1,x2,y2,w2,h2)=TRUE THEN ....

  oder so
   Collision=BOXCOLL(x1,y1,w1,h1,x2,y2,w2,h2)
   IF Collision=TRUE THEN ...
   
  Funktionieren tut ja beides. Also ich benutze ja immer die zweite.  

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Kitty Hello

Für die 2. hast Du eine Zuweisung, und einen Vergleich. Bei der ersten nur einen Vergleich. Aber das sind wirklich Mikro-Optimierungen, die Du nicht spüren wirst.