8 Minuten. 43 Sekunden. So lange braucht ein Samsung Galaxy S24 Ultra, um einen Dungeon voller JSON zu spucken – Etagen, Mobs, HP, Angriffe – direkt aus einem lokalen LLM.
Stellt euch eure Taschenrakete vor, diesen glatten Snapdragon-Klotz, der 150 Token Roguelike-Wahnsinn durchrechnet, ohne die Cloud anzurufen. Keine Latenzprobleme. Keine Konzern-Datensammler. Nur pure, lokale KI-Magie treibt ein Unity-RPG an. Gemeint ist Phi-4-mini, Microsofts 3,8-Milliarden-Biest, gequetscht in die Android-Spielschleife.
Und der Hammer: Es funktioniert wirklich. Gültiges JSON. Koreanische Mob-Namen inklusive (Prompt-Fehler, na und?).
Warum ein Sprachmodell in ein Roguelike quetschen?
Roguelikes leben von prozeduralem Chaos – endlose Durchläufe, brutale Zufälle. Aber was, wenn das Chaos schlau wird? Ein LLM flüstert Feindpositionen, Boss-Stats, sogar Flavor-Text, alles auf euren Run zugeschnitten. Lokal heißt: Blitzschnell, privat, euer Eigentum. Keine API-Keys, die betteln.
Der Entwickler geht aufs Ganze. Phi-4-mini wählt er, weil Microsofts ONNX-Paket plug-and-play ist – 4,9 GByte quantisiert, passt perfekt in 12 GByte RAM. Kleinere Modelle? Die verpatzen JSON-Formatierung, kotzen Arrays statt Müll.
“[LLM] Generiert in 181,4s (150 Token max) JSON kam raus: [ {“floor”:1,”mob”:”게으른 빵집 아들”,”hp”:50,”atk”:10}, {“floor”:4,”mob”:”elite”,”hp”:100,”atk”:20}, {“floor”:5,”mob”:”boss”,”hp”:200,”atk”:40} ]”
Peng. Strukturierte Ausgabe. Auch wenn Mob-Namen an die des Spielers erinnern (später fixen, Kumpel).
ONNX Runtime? Cross-Platform-Göttergabe. Unity-C#-Bindings über asus4s Paket. Acceleratoren umschalten – QNN für Snapdragon-NPU, NNAPI, CoreML – mit einer Codezeile. Unity? 2D-Roguelike-Paradies, Android/iOS-Builds, C# überall. Kein Python-Schiss.
Min SDK 31 macht’s wasserdicht – Android 12 schaltet Vendor-Libs für QNNs libcdsprpc.so frei. Tiefer runter? NPU ade.
Schafft euer Flaggschiff-Handy ein 3,8-Milliarden-Modell im Spiel?
Kurz: Knapp. S24 Ultras Snapdragon 8 Gen 3 prunkt mit Hexagon-NPU, 12 GByte RAM. Entwickler schiebt das 4,9-GByte-Modell per adb rein (94 Sekunden, geil). APK bleibt schlank.
Aber Zahlen? Mac-Editor (CPU): 246s, 0,45 Tok/s. S24 CPU-only: 523s, 0,21 Tok/s. QNN HTP? 490s, 0,31 Tok/s. Handy 2,1x langsamer als Mac. NPU? Peanuts-Boost.
Logs petzen: “Failed in loading stub: dlopen failed: library ‘libcdsprpc.so’ not found.” QNN meldet sich, Backend versagt. NPU-Versprechen, CPU-Lieferung.
Mein heißer Take – ungeschminkt, originell: Das erinnert an iPhone 2007. GPUs waren Spielzeug; Jobs’ Metal-API zündete Mobile-Gaming-Explosion (Angry Birds, Infinity Blade). NPUs stehen jetzt da. Klobig, halbgare, aber gebt Entwicklern sechs Monate? On-Device-AI-Spiele werden vom Gimmick zum Genre. Stellt euch No Mans Sky prozedurale Galaxien vor, aber pro Gerät, pro Run, LLM-gesteuert. Cloud? Für Indies überholt.
Die blutigen Build-Probleme – und Fixes, die gerettet haben
Dev-Leben: 90% Dämonen zähmen.
Tokenizer? Kein C#-tiktoken für Phi. Eigener aus tokenizer.json gebaut – 200k Vokabeln, Merges als Arrays (nicht Strings, Ups), GPT-2-Byte-Tricks, BPE-Cache.
KV-Cache-Decoding: 32 Layer, 8 Köpfe, 128 Head-Size. Prefill-Prompt, Token decodieren. Tensoren meutern – DenseTensor-Ctor-Args vertauscht.
model.onnx-Pfad? ../../.. wird ../..
CompressReleaseAssets? 5 GByte StreamingAssets zertrümmern Javas 2,1-GByte-Array. Gradle-Cache (15 GByte!) gelöscht, Modell aus Assets verbannt. adb push in App-Dateien.
Fonts? TMPs LiberationSans ignoriert Koreanisch. AppleSDGothicNeo.ttc konvertiert – Custom Range: 32-126,44032-55203,12593-12686 (dezimales Hangul-Hölle).
Newtonsoft.Json-Cast? JValue zu JArray floppt – Merges waren Arrays, keine Strings.
Alles klickt. Dungeon-JSON fließt.
Warum zählt On-Device-AI für Game-Devs?
Energiewelle hier. Plattformwechsel – AI als neue OS-Schicht. Heut Unity-Plugins, morgen NPU-Hooks in jedem Engine. Handys packen 40+ TOPS NPUs; Desktops hinken.
Konzerngequatsche? Qualcomm pumpt Hexag