Marco Grubert ist ein talentierter Programmierer; die gute Nachricht ist dass er für uns alle daran arbeitet, Acknex näher und näher an die Spitzenengines zu bringen!

F: Hast du mit anderen Engines gearbeitet, bevor du bei Conitec’s Acknex gelandet bist?
A: Vor etwa zehn Jahren gab es ein Programm "3D Construction Kit" einer britischen Softwarefirma namens Superscape, durch das ich mich sehr für das Arbeiten mit einer skriptbasierten 3D Spiele-Engine interessierte. Ich habe Genesis3D/Jet3D für ein paar Monate ausprobiert, bevor ich zu Conitec gegangen bin. Ansonsten arbeitete ich hauptsächlich mit „low-level graphics APIs“ wie IrisGL/OpenGL, DirectX.

F: Ich weiß dass du erst vor ein paar Jahren zu Conitec gekommen bist; wie hast du C-Script gelernt?
A: Durch Lesen des gedruckten Handbuches, dass mit der Sybex Extra Edition geliefert wird. Als ich es gelesen hatte, war eine Anzahl von Fragen noch immer unbeantwortet, daher kann ich einige Anfragen, die wir im „Blame the Manual" Forum sehen konnten, verstehen. Jedoch machte alles, nach einem zweiten Lesedurchgang und ein paar Testprogrammen, einen ziemlich guten Sinn. Für Neulinge empfehle ich den 7-Tage-Workshop und anschließendes Herumspielen mit dem Code, um zu sehen was die Änderungen bewirken.

F: Es gibt viele Benutzer, die gerne das SDK beherrschen würden. Welche Bücher würdest du empfehlen?
A: Das SDK selbst ist nur ein Interface zu den internen Datenstrukturen vom Gamestudio und den C-Script Funktionen. Ich glaube nicht dass man ein leeres SDK-Projekt erstellen kann und anschließend schaut, was man damit anstellt – man muss die Idee eines verblüffenden Grafikeffekts oder einer erweiteren Scriptfähigkeit haben und sich dann erst ans SDK wenden, um diese Idee einzubinden. Eine Sache die ich zur Zeit bearbeite ist die Möglichkeit, Gamestudio als Visualisierung für den Windows Media Player 9 zu benutzen – das wäre ein perfekter Kanidat, um mit dem SDK herumzuspielen und zu testen, ob es als Interface zwischen diesen beiden Anwendungen funktionieren kann. Ein anderes Projekt, dass ich wegen Zeitproblemen fallen lassen musste, war ein Schachspiel, das Gamestudio als Input/Output benutzt und sich zu einer Open Source Schach-Engine für die Zugberechnungen verbindet.

Ich habe keine Empfehlungen für gute Einführungsbücher in C aber hier ist eine Liste:
- Stroustrup- "The C++ Programming Language" (wenn man C kennt aber zu C++ wechseln will)
- Woo/Neider/Davis/Shreiner- "OpenGL Programming Guide (Red Book)" (Einführung in 3D Grafik)
- Moeller/Haines - "Real-Time Rendering" (erweiterte Computergrafik, Spezialeffekt-Programmierung, High-End Rendering)
- Lengyel - "Mathematics for 3D Game Programming & Computer Graphics" (man kann die Mathematik nicht umgehen wenn man schöne Bilder erzielen will)
- Microsoft - "Visual C++ online help system"

F: Welche IDE / Programmiersprache (MSVCPP, Delphi, usw.) ist die beste für die Nutzung mit dem SDK? Warum?
A: MS Visual Studio C++ 6.0. Das Conitec Entwicklungsteam benutzt Visual Studio 6.0/ 7.0, daher ist dies die Plattform auf der wir die meisten Tests machen, und wenn Fragen im SDK Teil des Forums auftreten können wir zuverlässigere Antworten geben. Visual Studio 7.0 ist etwas überhäuft und man braucht mehr Aufwand um effizienten Code zu erstellen, aber beide funktionieren einwandfrei mit dem SDK.

F: Wie sollten wir unsere Levels designen um die Framerate hoch zu halten?
A: GameStudio bietet eine Vielzahl von Features für spezielle Aufgaben – wenn man sich jedoch auf ein paar beschränkt kann man damit große Wirkung bei der Framerate erzielen. Der Map-Compiler der die Levels vom WED ins effizientere Format für Gamestudio übersetzt, nimmt an dass man labyrinthartige Innenlevels erstellt. Wenn man WED benutzt, um riesige Außenlevels zu erstellen wird die Framerate sinken, deshalb sollte man im WED nur die groben Umrisse erstellen und den Rest durch Terrains hinzufügen. Benutze L oder U – geformte Korridore zwischen Räumen – für gewöhnlich nimmt der Map-Compiler dies als Hinweis, die Räume getrennt zu bearbeiten. Wenn man einen geraden Gang zwischen zwei Räumen hat, ist die Wahrscheinlichkeit hoch dass sie als einzelner, großer Raum betrachtet werden, was die Framerate erneut reduziert. Betreffs Details – erstelle keine Türknöpfe, Schrauben, Leitern usw. als Teil deines Hauptlevels, dies kann Einfluss auf die Rendergeschwindigkeit der näheren Räume haben (die möglichen Compiling-Fehler lassen wir mal außen vor). Stattdessen sollten Details als seperate Map-Entities oder MDLs erstellt werden. Wenn man Wert auf korrekte Schattengebung dieser kleinen Details setzt, sollte man zumindest das Detail – Flag für diese kleinen Blocks setzen. Eine sehr wichtige Empfehlung: Benutze LOD wenn möglich. Wenn der Spieler in einem Flugzeug über einen Wald fliegt gibt es keinen Grund 500–Polygon–Bäume zu benutzen. Andererseits, wenn der Spieler landet und zum Baum läuft (um das böse Eichhörnchen zu fangen), sollte man einen 2000 – Polygon Baum benutzen, oder die Anwender werden sich über die Grafikqualität beschwerden. Trotz AGP Ports ist ein Haupt-Flaschenhals der Grafikkarten immer noch der Transfer der Texturen vom Mainboard-RAM ins Grafikkarte-RAM. Um den Einfluss dieser Transfers zu minimieren, sollte man es unterlassen zu viele Texturen oder Lightmaps zu verwenden. Wiederverwerte Texturen so oft wie möglich, stelle sicher dass deine Texturen quadratisch sind und Vielfache von Zwei in Höhe und Breite. Wenn es mehrere Styles in deinem Level gibt, halte sie getrennt, zum Beispiel könnte es in deiner Alien-verseuchten Raumstation Texturen mit metallenen Oberflächen geben, aber auch organische Strukturen. Wenn du einen Gang hast, der einerseits Metallwände, aber auch organische Texturen benutzt, dann müssen beide Texturen zur selben Zeit im RAM der Grafikkarte sein. Mit wenig Texturspeicher kann eine wechselnde Nutzung von diesen beiden Texturen das Spiel verlangsamen. Begrenze deinen Gang auf Metalltexturen, dann beginne nach einer U-Kurve deinen organischen Teil des Levels. In der U-Kurve könnte es einen Geschwindigkeitsverlust geben, aber es wird weniger RAM in den beiden Hälften des Levels benutzt.

F: Lohnt es sich eine Dual-CPU für das Builden der Levels zu kaufen?
A: Für kleine Entwicklerteams löhnt sich ein Multiprozessorsystem nicht. Es werden vier Schritte vollzogen: Erstellung der Geometrie, Portalgenerierung, Visibility-Berechnung und das Lighting. Zur Zeit benutzt nur die Visibility-Berechnung mehrere Prozessoren, aber bei den meisten Levels ist dieser Schritt der langsamste und kann auf langsamen PCs Tage dauern. Der Schritt kann jedoch übersprungen werden: Gamestudio läuft tadellos ohne Visibility-Informationen (es rendert dann den ganzen Level wie es auch WED tut). Das erzeugt normalerweise einen großen Performanceeinbruch – aber wenn man nur die aktuelle Ausleuchtung kontrollieren will macht dies ja nichts. Um die Visibility-Berechnung zu verhindern, wähle „Testmap“ anstatt von „Levelmap“ beim Builden aus. Wenn dann das Projekt fertig ist, builde das Level mit aktiviertem „Levelmap“, um überall die höchste Framerate zu erzielen. Da dies nun gesagt ist: Wenn man an einem hochkarätigen Titel arbeitet und die Levels oft auf hervorragende Geschwindigkeit überprüfen will, können diese Buildvorgänge sehr häufig nötig sein, sogar im frühen Entwicklungsstadium. In diesem Fall macht es tatsächlich Sinn ein Multiprozessorsystem zu benutzen. Ein Kunde hat die folgenden Berechnungszeiten für das gleiche Level festgestellt: Einzelner Prozessor: 6 Stunden, Dual Prozessor: 4.2 Stunden, Quad Prozessor: 2.1 Stunden

F: Welche Features planst du in der näheren Zukunft zum wmp2wmb Compiler hinzuzufügen?
A: Eine der hauptsächlichen Veränderungen die wir planen ist das Ersetzen der BSP (Binary Space Partition) -Struktur und vielleicht die Entfernung der Portal-Informationen. Zur Zeit stellt der Map-Compiler sicher dass nur Polygone in dem Raum gerendert werden, in dem der Spieler ist. Das ist gut für langsame PCs, aber mit schnelleren Grafikkarten macht es Sinn auch die Nachbarräume zu rendern, weil dies die CPU entlastet, die nun mehr Platz für sinnvollere Berechnungen wie KI oder Sound hat. Als kleiner Bonus bedeutet dies eine gewaltige Reduzierung der Build-Zeit, bessere Shadowmaps und vielleicht sogar die Möglichkeit, Geometrie während dem Spiel hinzuzufügen.

F: Kannst du uns ein paar Tipps für die Anfänger unter uns geben?
A: Beginne klein. Wenn du dein erstes Spiel ähnlich, aber besser als Grand Theft Auto 3 machen willst, wirst du dazu bestimmt sein zu scheitern. Benutze die Templates. AUM und die Tutorials liefern Spiel-Templates mit – es braucht nur etwas Fantasie um sie in vollwertige, unterhaltende Titel umzuwandeln. In den guten alten Zeiten konnte eine einzige Person Programmieren und die Grafiken erstellen, und das für einen erstklassigen Titel! Heute arbeiten Teams von 20 oder mehr Leuten vollzeit für die Produkte die wir in den Regalen sehen. Wenn die Leute von deinem Leveldesign begeistert sind, aber sich vor deinen C-Script Fähigkeiten schütteln – zieh es in Betracht dich mit einem C-Script Zauberer zusammenzutun, sowie einem Musikgenie, um ein gut abgestimmtes Team zu bilden. Gehe Schritt für Schritt vor. Wenn du einen 1st Person Shooter, ein Rennspiel und ein Rollenspiel zur gleichen Zeit entwickelst, ist es wahrscheinlich dass keins davon fertig wird. Setze Meilensteine um sicher zu gehen, dass du und deine Teammitglieder immer noch auf dem richtigen Weg sind – zu viele Teams brechen auseinander, weil es kein klares erreichbares Ziel für jedes Mitglied gibt. Bleibe informiert. Lese das Benutzerforum. Lese AUM. Wenn du es dir leisten kannst, abonniere das Game Developers Magazine, oder gehe zu www.gamasutra.com und lese die Artikel. Charles River Media hat sich als der Verleger mit den meisten spiel-orientierten Büchern von hoher Qualität durchgesetzt.

F: Bitte geb uns ein Beispiel wie die neue Physikengine unseren Projekten weiterhilft.
A: Aus der alltäglichen Erfahrung haben wir bestimmte Erwartungen an die Realität. Wenn ich zum Beispiel gegen meinen Bürotisch stoße, ist es sehr wahrscheinlich dass sich der Tisch etwas bewegt. Trotzdem scheint jeder Tisch in allen Spielen die ich bisher gesehen habe an den Boden festgenagelt. Daher „verrät“ die fehlende Physik alle grafischen Neuerungen der letzten Jahre.

Non-lineares, nicht vorhersehbares Gameplay: Eine oft vernommene Kritik über aktuelle 1st Person Shooter ist, dass sie zu linear seien. Im Grunde genommen läuft der Spieler einen vordefinierten Pfad ab, macht vordefinierte Dinge und gewinnt. Warum sollte man nicht etwas MacGyverismus zum Spiel hinzufügen? Hier einige Beispiele: Ich weiß dass die Wache hinter der geschlossenen Tür bald anfangen wird, den Korridor zu abzusuchen. Glücklicherweise bemerkte ich den Stuhl im nahgelegenen Raum, deshalb greife ich mir den Stuhl und stelle ihn unter den Türknauf, um zu verhindern dass die Wache den Raum verlässt. Dann, unter Benutzung der eben gewonnenen Zeit, staple ich alle Fässer die ich im Level finden kann auf einen Haufen, vorsichtig auf einem schmalen Brett balanciert. Die ahnungslose Wache kommt aus der Tür gerannt, rennt in meinen Auslöser, der die Fässer hinüberfallen lässt und ihn damit überrollt. Einige Gamedesigner werden mit dieser Idee nichts anfangen können, weil sie riesige Lücken erzeugt, intensives Testen verlangt und fehleranfälliger ist. Trotzdem denke ich dass vorhersagbare Handlungen für Actionfilme vorbehalten werden sollten und von Computerspielen fern bleiben sollten.

Kürzere Entwicklungszeiten: Wenn du jemals probiert hast ein C-Script für einen einfachen, realistisch rollenden Ball, der mit Objekten auf dem Boden kollidiert, zu schreiben, dann wirst du wissen dass es eine echte Herausforderung sein kann. Wenn mehrere Objekte miteinander interagieren sollen wird es immer komplizierter und zeitaufwändiger. Vergleiche dies mit der benötigten Zeit, um diese Möglichkeit mit der Physikengine umzusetzen: Es braucht nur ein paar Zeilen Code, und alles andere wird von Gamestudio übernommen. Hier ist der physikrelevante Code für die Bowlingkugel aus dem Demovideo:

action InitBall {
phent_SetType(my, PH_RIGID, PH_SPHERE); // make it a physics object- sphere shaped
phent_SetMass(my, 5, PH_SPHERE); // weighs 5 kg
phent_SetFriction(my, 70); // rolling friction 70%
phent_SetElasticity(my, 50, 10); // 50% bounciness when moving faster than 10 quants/sec
phent_SetDamping(my, 20, 20 ); // 20% damping
}

function InitPhysics {
temp.x=0; temp.y=0; temp.z=-380; // corresponds to earth gravity factor 9.81
ph_SetGravity(temp);
}

Vielen Dank, Marco.