Script für (schnelleres) automatisiertes Skalieren der Grafiken

Zu Beginn der Entwicklung an Argh! Earthlings! dachte ich, dass sich der Aufwand zum Zeichnen der Grafiken (bzw. Ressourcen) im Rahmen halten würde und ich spürte bis zum Erscheinen der Retina-Tablets keinen Bedarf meinen Entwicklungsprozess zu ändern. Der Mensch ist ein Gewohnheitstier und damit war das Thema für mich gegessen.

Die Monate vergehen… und urplötzlich erschien nicht nur ein Retina-iPad, sondern auch noch das iPhone 5 mit seiner “krummen” Auflösung. Damit drängte mich Apple in eine neue Situation: Grafische Ressourcen an der passenden Auflösung je Gerät zu generieren.

Das ganze Dilemma beginnt schon bei den Icons. Zwischen 29 und 1024 px große Icons soll man nun für iTunes generieren, in allen erdenklichen Zwischenstufen… Zudem wächst Argh! Earthlings! unaufhörlich und selbst kleine Änderungen enden in einem erheblichen Aufwand.

Grund genug also sich dem “Automatisierten Build” zu widmen.

Konzept

Die Basis bildet ein Script mit allerlei Funkionen zum Errechnen vieler, niedrig aufgelöster Grafiken aus wenigen hochauflösenden. Das Tool zur Kommandozeilen basierten Verarbeitung heißt ImageMagick. Es müssen knapp 570 Grafiken gerendert werden. Ausgangspunkt sind große PNGs mit Retina-Auflösung für’s iPhone 5, die mit Inkscape exportiert wurden. Environment

PC, Windows 8, SSD, 2 x 2,2 GHz, 2 GB RAM Mac, Mountain Lion, SSD, 2 x 1,6 GHz, 4 GB RAM Gigabit Netzwerk

  • Coole Musik, um die Nerven zu schonen

1. Versuch

Eine Batch-file für Windows (hey, nobody is perfect aber dort wird eben jede Grafik handgezeichnet). Die Grafiken liegen auf einem Mac, der per Freigabe in Windows sichtbar ist.

Rechenzeit: ca. 15 Minuten! WTF?

Das Netzwerk ist trotz Gigabit Verbindung und passender Komponenten einfach zu langsam. Der Zugriff auf jede einzelne Datei dauert einfach zu lange. Offenbar müssen zu viele Rechte geprüft werden oder der Virenscanner mischt sich ein… Wie auch immer: Unbrauchbar, wenn man mal schnell etwas ändern und gegenprüfen möchte.

2. Versuch

Die Batch-File wird so verändert, dass die Dateien, die sich gegenüber dem letzten Build nicht verändert haben, mit einer Datei mit Hash aus dem Last-Modified-Datum ergänzt. So soll sich das System nicht mit unnötigen Berechnungen der Grafiken aufhalten.

Rechenzeit: ca. 13 Minuten! Woooah!?

OK, das hat nicht wirklich geholfen und macht den Code nur komplizierter. Irgendwie scheint die Batch im Netzwerk sehr träge einfachste Kommandos auszuführen. Die Anzahl neuer Kommandos relativiert die Optimierung mit den Hashes – so mein Gefühl.

3. Versuch

Fehleranalyse: Die Dateien werden auf die Windows SSD in einen Temporär-Ordner kopiert und das Script lokal ausgeführt.

Rechenzeit: ca. 2 Minuten! Ist nicht wahr…!

Das Problem scheint also nicht die Berechnung der Grafiken zu sein, sondern tatsächlich der Zugriff auf die Netzwerkfreigabe.

4. Versuch

Das batch-Script erfährt seine Wiedergeburt als bash-Script auf dem Mac. Zudem wird ImageMagick für Mac installiert.

Rechenzeit: ca. 2 Minuten! Ich traue meinen Augen kaum!

Na, so kann man doch arbeiten!

Doch mein Ego gibt mir keine Ruhe, hilft die Hash-Prüfung bei der Performance?

5. Versuch

Das bash-Script wird nun um die gleiche Hash-Maßnahme erweitert, wie zu Beginn unter Windows.

Rechenzeit: ca. 10 Sekunden! Perfekt!

OK, zugegeben… beim letzten Run hatte das Script nichts gemacht, einfach nur 570 mal festgestellt, dass sich nichts geändert hat. Das aber in 10 Sekunden. Kommen nun Änderungen hinzu werden diese in Bruchteilen einer Sekunde abgearbeitet. Bei vielen kleinen Änderungen sind Resultate schnell messbar.

Lessons Learned

Ich habe lange Zeit unterschätzt, wie wichtig nachhaltige Ressourcen, wie Scripte, sind. Mal sehen, ob sich das Spiel insgesamt schneller entwickeln lässt… für’s Schneiden und Kodieren von Sound und Video ist noch Platz im Script.