8 minutos. 43 segundos. Foi só o que um Samsung Galaxy S24 Ultra precisou pra parir uma masmorra inteira em JSON — andares, mobs, HP, ataques — direto de um LLM rodando local.
Imagina seu foguete de bolso, essa laje chique de silício Snapdragon, processando 150 tokens de loucura roguelike sem ligar pro cloud. Sem travadas de latência. Sem dados sugados por corporações. Só mágica de IA local pura alimentando um RPG feito no Unity. Tô falando do Phi-4-mini, o bicho de 3.8B da Microsoft, enfiado no loop de jogo Android.
E o pulo do gato? Funcionou de verdade. JSON válido. Nomes de mobs em coreano inclusos (falha no prompt, mas e daí?).
Por Que Enfiar um Modelo de Linguagem num Roguelike?
Olha, roguelikes vivem de caos procedural — replays infinitos, aleatoriedade bruta. Mas e se esse caos ficasse esperto? Um LLM sussurrando posições de inimigos, stats de boss, até texto de flavor, tudo sob medida pro seu run. On-device significa instantâneo, privado, seu. Sem chaves de API implorando piedade.
Esse dev não brincou em serviço. Escolheu Phi-4-mini porque o drop ONNX da Microsoft é plug-and-play — 4.9GB quantizado, encaixa nos 12GB de RAM como se fosse de casa. Modelos menores? Desmoronam no formato JSON, cuspindo lixo em vez de arrays.
“[LLM] Gerado em 181.4s (150 tokens máx) JSON que saiu: [ {“floor”:1,”mob”:”게으른 빵집 아들”,”hp”:50,”atk”:10}, {“floor”:4,”mob”:”elite”,”hp”:100,”atk”:20}, {“floor”:5,”mob”:”boss”,”hp”:200,”atk”:40} ]”
Pá! Saída estruturada. Mesmo que os nomes dos mobs ecoem os do player (conserta depois, cara).
ONNX Runtime? Bênção multiplataforma. Bindings C# pro Unity via pacote do asus4. Troca aceleradores — QNN pro NPU Snapdragon, NNAPI, CoreML — com uma linha de código. Unity em si? Paraíso pra roguelike 2D, builds Android/iOS, C# pra todo lado. Sem vergonha de Python.
Min SDK 31 fecha o pacote — Android 12 libera libs de vendor pro libcdsprpc.so do QNN. Cai mais baixo? Diz adeus pro NPU.
Seu Top de Linha Roda um Modelo de 3.8B num Jogo?
Resposta curta: Mal e porcamente. O Snapdragon 8 Gen 3 do S24 Ultra tem Hexagon NPU, 12GB RAM. Dev empurrou o modelo de 4.9GB via adb (94s, delícia). APK fica magro.
Mas os números? Mac Editor (CPU): 246s, 0.45 tok/s. S24 só CPU: 523s, 0.21 tok/s. QNN HTP? 490s, 0.31 tok/s. Celular 2.1x mais lento que Mac. NPU? Meh, melhora pouca.
Logs entregaram o ouro: “Falhou ao carregar stub: dlopen failed: library ‘libcdsprpc.so’ not found.” QNN registra, mas backend some. Promessa de NPU, entrega de CPU.
Minha opinião quente — sem roteiro, original: Isso é o iPhone de 2007 de novo. GPUs eram brinquedo na época; a Metal API do Jobs explodiu games mobile (Angry Birds, Infinity Blade). NPUs tão aí agora. Trôpegos, meio crus, mas dá seis meses pros devs? Jogos com IA on-device saem de gimmick pra gênero. Imagina galáxias procedurais de No Man’s Sky, mas por device, por run, turbinadas por LLM. Cloud? Obsoleto pros indies.
As Quebras Sangrentas do Build — e os Fixes que Salvaram o Dia
Vida de dev: 90% brigando com demônios.
Tokenizer? Sem tiktoken em C# pro Phi. Escreveu um do tokenizer.json — 200k vocab, merges como arrays (não strings, ops), hacks de byte GPT-2, cache BPE.
Cache KV na decodificação: 32 camadas, 8 heads, 128 head_size. Prefill do prompt, decode de tokens. Tensores se rebelaram — args do ctor DenseTensor invertidos.
Caminho model.onnx? ../../.. virou ../..
CompressReleaseAssets? 5GB de StreamingAssets explodiu o array Java de 2.1GB. Zerou cache Gradle (15GB!), exilou modelo pra fora dos Assets. adb push pros arquivos do app.
Fonts? TMP’s LiberationSans pula coreano. Converteu AppleSDGothicNeo.ttc — Custom Range: 32-126,44032-55203,12593-12686 (inferno Hangul decimal).
Cast Newtonsoft.Json? JValue pra JArray falhou — merges eram arrays, não strings.
Tudo encaixou. JSON da masmorra flui.
Por Que IA On-Device Importa pros Devs de Game?
Energia fervendo aqui. Tá rolando a mudança de plataforma — IA como a nova camada de OS. Plugins Unity hoje,