Programmazione anormale
Trucchi e magia nera del C++: template di template, calcoli constexpr, __PRETTY_FUNCTION__ e altri modi per far fare al linguaggio ciò per cui non era proprio pensato.
- Programmazione anormale
Come Pharaoh viveva in 16 megabyte di memoria
Come Pharaoh (2000) fece stare circa 300 megabyte di grafica in 16 megabyte di RAM senza una sola riga di assembly, solo cambiando il formato dei dati: palette a 8 bit e superfici DirectDraw, archivi .sg3/.555, un RLE da cui si può disegnare direttamente, rombi isometrici senza angoli, la parte alta degli edifici a parte, cinque direzioni invece di otto, un font che si colora mentre viene disegnato, caricamento delle immagini su richiesta e slot con segnaposto. Con numeri dai file reali del gioco e codice da Tutankhamun, una reimplementazione di Pharaoh in C.
- Programmazione anormale
Dirty Coding Tricks, part 3
Un seguito scherzoso della classica raccolta Dirty Coding Tricks: leggende di studio e aneddoti del gamedev — un avviso di batteria scarica al posto del fix di un crash in Super Time Force, un contatore FPS che sistemava la fisica in Burnout 3, scoiattoli-timer invisibili in Titan Quest, il Gandhi nucleare, i poliziotti impazziti che hanno dato vita a GTA e i giochi sovietici da calcolatrice.
- Programmazione anormale
Miti, superstizioni e saggezza popolare nello sviluppo di giochi
Un'analisi di 12 «verità» comuni del C++ nel gamedev — quali sono miti, quali superstizioni e quali saggezza popolare: il culto del C puro, la «cattiva build buona», il costo di eccezioni e RTTI, smart pointer e container STL, il polimorfismo, l'assembly inline, il template bloat, l'ottimizzazione prematura e la maledizione del commit del venerdì.
- Programmazione anormale
Uno zoo di stringhe nel tuo codice C++?
Un grande tour dei tipi di stringa del C++ come uno zoo di animali: char* e char[N], letterali stringa, std::string e SSO, string_view, pmr::string, QString, NSString, std::wstring, stringhe di frame, la FString di Unreal, StringAtom e interning, stringhe COW e StringID basati su hash — e dove ciascuno trova posto nei motori di gioco.
- Programmazione anormale
Sii il tuo breakpoint
Come funzionano i breakpoint software e hardware: sostituire un byte con int 3 (0xCC), i registri di debug x86-64 DR0–DR7 e il layout di DR7, breakpoint condizionali, su funzione e temporanei, un watchpoint in scrittura via GetThreadContext, un canary per il buffer e un pulsante per i breakpoint hardware direttamente in un editor di gioco ImGui.
- Programmazione anormale
Game++. run, thread, run…
Il multithreading nei giochi: i problemi dei lock (deadlock, thread starvation, inversione di priorità in Cyberpunk 2077 e Crysis), il memory model del C++11, lock-free e atomics, spinlock con backoff, thread pool e un sistema di task, hitching e un mutex read-write.
- Programmazione anormale
Game++. Danze con gli allocatori
Un grande tour degli allocatori di memoria nei giochi: linear, step-back, frame, stack, pool, free list, arena, segregated, buddy, thread-cache, fibonacci, compacting, suddivisione hot/cold e TLSF — con codice, diagrammi e un benchmark.
- Programmazione anormale
Game++. Cucinare i vettori
Come funzionano i vettori nei motori di gioco e quanto li paghi: crescita della capacity e frammentazione della memoria, composizione singola vs a cascata, std::array, uno static_vector sullo stack, hybrid_vector con un'ottimizzazione in stile SSO e le insidie degli allocatori pmr dei vendor.
- Programmazione anormale
Game++. String interning
L'interning delle stringhe (string pooling) nei motori di gioco: una sola copia di una stringa per tutti i riferimenti, l'interning dei letterali in clang/GCC e perché il trucco si rompe su Xbox, il pericolo dei confronti con ==, la lotta alla frammentazione della memoria e una semplice implementazione di xstring su hash con conteggio dei riferimenti.
- Programmazione anormale
Il pesante H[eader]
Come il tempo di build completa di un grande progetto C++ è sceso da 15:32 a 5:16: l'antivirus e l'explorer, header template pesanti, forward declaration, precompiled header, PIMPL e la disattivazione di analizzatori, test e LTO — con tabelle dei tempi di build degli header.
- Programmazione anormale
Come Unity ha rinunciato alle proprie stringhe
La storia delle stringhe COW di Unity: copy-on-write con condivisione parziale dei buffer e allocazioni quasi zero, lo scontro con il design di std::string, puntatori pendenti e perché alla fine il motore è tornato alla libreria standard.
- Programmazione anormale
Capo, è tutto sparito
Il seguito di «Dove sono i tuoi bug?»: 16 bug da venerdì sera presi da motori reali — scritture out-of-bounds, handle persi su Switch, memset su un tipo non banale, =! al posto di != e alloca in un loop.
- Programmazione anormale
Le stringhe nei motori di gioco
Perché std::string è evitata nei motori: C-string e NTBS, SSO e string_view, stringhe sized/pool/arena, stringhe condivise e identificatori, più il parsing SIMD delle config.
- Programmazione anormale
La magia dello swizzle degli shader in C++
Implementare lo swizzle (vec.xxy, vec.zx, vec.rgb) in C++ con union e template: da una prima versione a base di copia-incolla a un'unica soluzione constexpr e benchmark contro glm e CxxSwizzle.
- Programmazione anormale
Dove sono i tuoi bug?
Una collezione di bug selvaggi da motori reali: un punto e virgola mancante in Unity, un memset eliminato dal compilatore, race sui bitfield in CryEngine, il most vexing parse e un'altra dozzina — trova tu stesso il bug.
- Programmazione anormale
Quando è private ma lo vorresti proprio public
Testare i membri privati di una classe C++ senza toccare gli header: da cento friend e #define private public a un hack con i template che scambia un tipo puntatore a membro.
- Programmazione anormale
Perché l'SDK dello Switch ha tre funzioni sin diverse?
Portando giochi su Nintendo Switch ho trovato tre implementazioni di sin nell'SDK — ed ecco cosa ha mostrato il disassemblato con diverse modalità di ottimizzazione.
- Programmazione anormale
Il nome di un enum C++ a runtime
Ottenere il nome di un tipo e i valori di un enum a runtime in C++ senza RTTI — via __PRETTY_FUNCTION__, template e magia constexpr.