Mit Shadern kann man großartige Dinge tun. Leider kann dies auch zu Problemen führen. Damit sich diese in Grenzen halten oder zumindest der Spieler eine vernünftige Fehlermeldung bekommt, sollte man ein paar Dinge beachten.
Ein generelles Problem, vor allem von Anfängern, ist eine ungenügende Abfrage von Dingen. Ein Klassiker ist die Abfrage, ob ein Objekt überhaupt existiert. Bei der Entwicklung geht man gerne davon aus, dass das Objekt, welches gesteuert werden soll, ohnehin vorhanden ist. Wenn dies nicht der Fall ist, kommt es zum Absturz des Spiels und die Verwunderung ist groß.
Das Problem mit Shadern
Die zwei häufigsten Probleme sind:
- Shader werden von der Zielplattform nicht unterstützt.
- Shader ist nicht kompiliert.
Wenn Shader von der Grafikkarte überhaupt nicht unterstützt werden, merkt man das i. d. r. sehr schnell. Allerdings gibt es, in beiden genannten Fällen, ein Problem: Es kann sein, dass Shader erst sehr spät eingesetzt werden und der Fehler bei der Qualitätssicherung nicht bemerkt wird.
Ein konstruiertes Beispiel: Im ganzen Spiel gibt es nur eine Stelle, in der Shader eingesetzt werden. Unglücklicherweise passiert dies vor dem letzten Bosskampf, um diesen grafisch in Szene zu setzen. Wenn dies erst kurz vor Release eingebaut wurde, kann es gut sein, dass es kein Tester bemerkt. Der Spieler hingegen investiert Stunden, freut sich auf einen letzten epischen Kampf und bekommt eine kryptische Fehlermeldung um die Ohren geschlagen.
Die Lösung: Wir prüfen das gleich bei Spielstart.
Werden Shader unterstützt?
Die Unterstützung lässt sich mit einem einfachen Befehl Prüfen: shaders_are_supported
Hier kannst du die entsprechende Hilfe einsehen.
Beispiel:
1 2 3 4 | if (!shaders_are_supported()) { show_message("Leider unterstützt Ihr Computer nicht die erforderliche Shader-Technologie. Das Spiel wird abgebrochen."); game_end(); } |
Hier prüfen wir den Support und geben eine entsprechende Fehlermeldung aus. Sollte es sich um ein kommerzielles Spiel handeln und keine Demo oder Shareware vorhanden sein, sollte bei den Systemanforderungen auf jeden Fall mitgeteilt werden, dass Shader-Support benötigt wird.
Wurden alle Shader kompiliert?
Um dies zu prüfen, gibt es den Befehl shader_is_compiled
. In der offiziellen Dokumentation wird deutlich darauf hingewiesen, dass man dies beim Spielstart prüfen sollte, da es sonst zu Abstürzen kommen kann. Leider machen manche immer noch den Fehler und prüfen erst, bevor der Shader eingesetzt wird. Je nachdem, wie viele Shader man hat, kann so eine Prüfung etwas umfangreicher ausfallen. In meiner Demo NO RUST kamen 59 Shader zum Einsatz, die beim Start der Demo in dieser Manier geprüft werden:
1 2 3 | if (!shader_is_compiled(sh_2d_blobs)) { error = 1; } if (!shader_is_compiled(sh_blending_vertical)) { error = 2; } // usw... |
Jeder Shader hat eine individuelle Error-Nummer. Sollte ein Shader nicht funktionieren, kommt folgende Fehlermeldung:
1 2 3 4 | if (error != 0) { show_message($"A shader could not be loaded or is not working properly. The demo is canceled. Error number: {error}"); game_end(); } |
Der Betrachter weiß zwar nun nicht, welcher Shader Probleme macht, aber er bekommt immerhin eine Fehlermeldung und eine Nummer, die er an den Entwickler weitergeben kann. Und es passiert am Anfang und nicht irgendwo mitten drin oder am Ende.
Alles oder Nichts?
Die o. g. Beispiele brechen das Spiel immer ab, wenn etwas nicht funktioniert. Das muss natürlich nicht sein. In der besagten Demo geht es nicht anders, weil man ohne Shader nicht mehr viele Effekte sehen kann. Wenn im Spiel die Shader lediglich dekorativen Charakter haben, ohne einen tieferen Wert zu besitzen, kann man das auch anders lösen.
In so einem Fall macht man die gezeigten Abfragen, eventuell auch mit Fehlermeldungen, schreibst dies aber in eine globale Variable, welche später laufend abgefragt wird. Und wenn ein Shader nicht funktioniert oder generell nicht unterstützt wird, dann wird dieser Effekt einfach nicht angezeigt.
Die Entscheidung, wie man dies handhabt und ob man es generell als Option im Spiel anbieten möchte, sollte möglichst früh in der Entwicklung getroffen werden. Der Grund ist einfach: Je komplexer das Spiel wird und je mehr Shader davon betroffen sind, umso eher kann es passieren, dass man bei der Implementierung Fehler macht.
Weiterführende Links
GameMaker Quicktipp: Teil eines Sprites zeichnen
Shader-Programmierung 1: Grundlagen und Sprites
Template Strings in GML
Projekt Tic-Tac-Toe – Teil 1
Projekt Snake