Una persona i Claude

Com es va fer

El motor, els jocs i aquest web, fets parlant amb Claude Code i mesurats a la placa de debò.

En xifres

  • 16.489línies de C al motor
  • 33jocs d'exemple
  • 117proves a cada canvi
  • 239commits al repositori

Una persona i Claude. El motor, els exemples, les eines i aquest web es van escriure parlant amb Claude Code: cada idea es provava al simulador, es mesurava a la placa i es corregia segons el que deia la placa.

L'art, generat i encaixat. Els aspectes que ho demanen (Neo Geo, CPS2, 32 bits) fan servir imatges generades amb IA. Les eines del motor les retallen, les escalen a l'alçada justa, en separen els fotogrames i les redueixen a la paleta de la consola. Els aspectes de baixa resolució es dibuixen amb codi.

Mesurat abans de donar-ho per bo. Cada exemple té un guió que hi juga sol. A l'ordinador, compara la suma de control de cada fotograma amb la desada; a la placa, escriu els fps de cada segon. Les optimitzacions no canvien ni un píxel.

Lliure de debò. El codi és MIT; l'art, el so i els vídeos dels exemples, CC0. Agafa-ho, canvia-ho, fes la teva consola.

Un enemic, de l'encàrrec al joc

El goblin de mazmorra, pas a pas, amb les imatges de debò.

  1. 1 · L'encàrrec

    Un goblin original per a un beat-em-up de fantasia: petit, prim i encorbat, pell verda, orelles enormes, un tapall esparracat i un punyal corbat rovellat. De cos sencer, mirant cap a l'esquerra. Estil: sprite de recreativa de mitjans dels noranta, píxels durs, contorn fosc, uns 15 colors. Fons transparent.

    Resumit i traduït de l'encàrrec, que es va escriure en anglès.

  2. 2 · La referència

    El goblin sol, de cos sencer: verd, amb orelles punxegudes i un punyal corbat

    El personatge sol. S'adjunta a cada encàrrec següent, perquè no canviï d'un dibuix a l'altre.

  3. 3 · El full de postures

    Deu postures del goblin en dues files, sobre un fons fosc difuminat

    Deu postures: caminar, apunyalar, rebre un cop i caure. El fons es va demanar transparent i va sortir pintat.

  4. 4 · El retall

    Els deu fotogrames retallats, a la mateixa escala i amb els peus a la mateixa línia

    Les eines del motor treuen el fons, separen els fotogrames, els posen a la mateixa escala amb els peus alineats i els redueixen a 15 colors. Després es revisa cadascun a ull.

  5. 5 · Al joc

    L'Alba, l'espadatxina, davant de dos goblins al passadís de la masmorra

    A mazmorra surten en grup, a 60 fps a la consola.

Sis dies al repositori

  1. El motor neix de dos jocs d'aventures i es mesura a la placa: la imatge va directa al panell, en franges.

  2. Un processador d'imatge virtual, com el de la Game Boy Advance, i jocs en Lua de qualsevol gènere.

  3. Mesurat a la consola i accelerat. L'editor web, per fer jocs sense programar.

  4. Els aspectes de dotze consoles, el mode en primera persona, les instruccions perquè un agent faci jocs, el web i la Biblioteca.

  5. El web i l'editor en tres idiomes, els jocs de Codex i IL·LUSTRES a la Biblioteca.

  6. L'studio de so, un seqüenciador amb sintetitzador i efectes. El web, en pestanyes, amb la pestanya Juga i una pàgina i un rànquing per a cada joc.

Tot el procés és al repositori: com es fa l'art (s'obre en una pestanya nova), l'API de Lua (s'obre en una pestanya nova), les instruccions per a agents (s'obre en una pestanya nova).

ESP32-S3R8 · 240 MHz · PSRAM octal a 80 MHz · pantalla QSPI a 80 MHz

Mesurat a la consola, no promès

Cada xifra d'aquesta secció surt de la placa: un firmware que juga sol seguint un guió i escriu una línia de rendiment per segon, o un banc de proves que repeteix cada escena cinc vegades. Sense emulador. A 60 fps, cada fotograma dura 16,6 ms.

  • 71%d'un nucli a l'escena més pesada: capa afí, quatre capes i 128 sprites
  • 8,1msper enviar un fotograma sencer al panell; només el cable ja en són 7,7
  • 3%d'un nucli per al so mentre es juga
  • 117proves que juguen soles i comparen cada fotograma, a cada canvi

Dotze aspectes, en fotogrames per segon

El segon més lent i el més ràpid de cada exemple jugat a la consola. En gris, la primera mesura, abans d'optimitzar.

Aspectefps
Neo Geoduelo 60–61 fps
CPS2torneo 60–61 fps
Game Boybolsillo 58–61 fps
ZX Spectrumcinta 41–62 fps
PICO-8ladrillos 47–60 fps, abans 46–55
Maquineta LCDhuevos 60–61 fps
PlayStation · Saturn 2Dgotico 60–61 fps, abans 30–31
Super Nintendo · Mega Driveveloz 40–59 fps
Vectorialrocas 61 fps
Game Boy Advanceplataformas 61 fps
Recreativa verticaltormenta 30 fps, abans 20
Primera personalaberinto 38–60 fps, abans 20–31

Segon a segon

Cada punt és un segon de joc a la placa: una línia de rendiment per segon mentre un guió juga sol. La línia discontínua és la primera mesura; la contínua, la d'ara. El primer segon carrega l'escena i no compta en les xifres.

  • gotico 32 bits · la sala

    3060

    32,017,2 ms per fotograma

  • laberinto primera persona · caminar

    3060

    40,920,3 ms per fotograma

  • ladrillos PICO-8 · jugant

    3060

    18,817,6 ms per fotograma

  • tormenta vertical · onades

    3060

    48,732,3 ms per fotograma

No va caldre optimitzar-los:

  • torneo CPS2 60–61
  • mazmorra CPS2 61
  • rocas vectorial 61
  • bolsillo Game Boy 58–61
  • huevos LCD 60–61
  • cinta Spectrum 41–62

Com arriba un fotograma a la pantalla

No hi ha cap fotograma sencer a la memòria: la pantalla es dibuixa en 15 franges de 32 columnes. Cada franja es fa a la RAM interna, la meitat esquerra en un nucli i la dreta en l'altre, mentre l'anterior surt per DMA cap al panell.

A càmera lenta: un fotograma de debò triga 16,6 ms; aquí, 2,4 segons. Enviar-ne un de sencer costa 8,1 ms, dels quals 7,7 són del cable.

Com es troba què costa més

La mateixa escena, jugada un cop i un altre traient-ne una cosa cada vegada. A gotico, els dos raigs de lluna barrejats al vol es menjaven 13 ms per fotograma: ara ja venen pintats al fons, i el joc va passar de 31 a 60 fps.

gotico, abans d'optimitzar (ms per fotograma)

Mesura
16,6 ms = 60 fps
tot32,0 ms
sense columnes30,5 ms
sense raigs de lluna19,0 ms
sense raigs ni llums16,3 ms
sense res a sobre16,2 ms

laberinto: el raycast abans i després d'optimitzar-lo (ms per fotograma)

Mesura
16,6 ms
tot · abans39,0 ms
tot · ara24,4 ms
només raycast · abans34,6 ms
només raycast · ara22,1 ms
només la imatge · abans19,0 ms
només la imatge · ara16,3 ms

El que costa dibuixar, en un nucli

Un fotograma lògic de 240×160 amb contingut sintètic, el millor de cinc intents, en percentatge d'un nucli a 60 fps. La consola en té dos.

Mesura
un nucli sencer
Una capa de tiles1,96 ms · 11,8 %
128 sprites de 16×162,24 ms · 13,5 %
Una capa afí a pantalla completa3,34 ms · 20,0 %
Barreja alfa de dos fotogrames sencers4,03 ms · 24,2 %
Mode 7: una capa afí i 64 sprites6,28 ms · 37,7 %
4 capes de tiles6,50 ms · 39,0 %
GBA mode 0: 4 capes, 128 sprites8,64 ms · 51,9 %
Tot: capa afí, 4 capes, 128 sprites11,88 ms · 71,3 %

I per què gairebé tot es dibuixa a la RAM interna: la velocitat en copiar 1 MB.

RAM interna → RAM interna381,0 MB/s
PSRAM → RAM interna84,7 MB/s
RAM interna → PSRAM48,5 MB/s
PSRAM → PSRAM31,9 MB/s

Font: docs/measurements.md (s'obre en una pestanya nova), amb el mètode i cada mesura des del primer dia. Mesura-ho a la teva placa: idf.py -DBP_BENCH=ON build flash monitor