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
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.