Verschiedene Updates
Nach vielen Wochen harter Arbeit habe ich es endlich geschafft: Das Spiel läuft wieder genauso gut wie vorher. Cool, nicht? Tatsächlich mache ich so etwas häufiger, als ich gerne möchte, aber so ist es nun mal. Wie immer liefert auch dieser Umbau die Grundlage für viele, weitere coole Sachen, da jetzt die Infrastruktur vorhanden ist. In diesem speziellen Fall bedeutet das, dass ich jetzt beliebige Fahrzeuge vom Spieler steuern lassen kann, ohne dafür jedesmal den Quellcode zu ändern. Möglich geworden ist dies dadurch, dass jetzt alle Aspekte des Fahrens durch Javascript-Code gesteuert werden, den ich schnell ändern kann und der für beliebige Fahrzeuge gilt.
Bis dieser ganze Kram lief, hat es sehr lange gedauert. Teile des Codes, in die ich festes Vertrauen hatte (weil ich die Dinger nicht selbst geschrieben habe) liefen nicht. Der Material-Code, von dem ich fest überzeugt war, dass er überhaupt nicht laufen würde, hatte aber interessanterweise nur einen Bug, und den auch noch ganz wo anders, als ich erwartet hätte.
Der komische Blickpunkt aus dem letzten Post lag übrigens daran, dass ich die Punkte, die die Kamera verfolgt, falsch eingestellt hatte. Es lief also alles so, wie ich es gesagt habe, nur nicht so, wie ich es wollte.
Kommen wir damit zu dem, was ich seither gemacht habe. Erstens liefen die Landschaftstexturen nicht mehr, seit dem ich auf angeblich schnellere Render-Techniken umgestellt habe. Der Fehler lag darin, dass die Texturkoordinaten falsch waren. Um dies zu bestätigen, habe ich einfach mal die Texturkoordinaten zufällig vergeben, mit interessantem Ergebnis.
Das war allerdings eher leicht behoben.
Das nächste Problem war “Frustum Culling”. Diese Optimierung für Spiele läuft darauf hinaus, dass Objekte, die sich außerhalb des theoretisch sichtbaren Bereiches befinden, nicht gezeichnet werden. Wenn es denn richtig funktioniert, sollte dies viel bessere Performance liefern, denn etwas nicht zeichnen geht schneller als etwas zeichnen. Nur leider erhielt ich folgendes:
Um die Funktion besser zu testen, baute ich den Code so um, dass nicht sichtbares rot-gelb statt gar nicht gezeichnet wurde.
Dem aufmerksamen Beobachter wird aufgefallen sein, dass mein Code anscheinend nicht richtig funktionierte.
Was war der Grund dafür? Dass ich doof war, natürlich. Ein kurzer Exkurs: Für die Landschaft verwende ich eine sogenannte Heightmap, das heißt ein Bild, dessen Helligkeit an jedem Pixel in einen Höhenwert umgerechnet wird. Der Abstand zwischen den Pixeln kann hier frei gewählt werden, für diese Karte verwende ich einen Abstand von fünf Metern. Leider vergaß ich, diese Information allen Beteiligten zu übermitteln, so dass sich die Sektoren, deren Sichtbarkeit geprüft wurde, für diese Berechnung konsequent zu klein fühlten, obwohl sie korrekt gezeichnet wurden. Nach dem dies korrigiert wurde, funktioniert jetzt auch diese Optimierung endlich. Leider ist der Unterschied nicht furchtbar stark spürbar, aber ein wenig hat es wohl doch gebracht.
Geschrieben am 26. Mai 2006 um 09:52