Prestazioni
Appunti su ciò che accade sotto il livello degli algoritmi — cache della CPU, coerenza dei dati, primitive di sincronizzazione e allineamento. Il tutto con benchmark ed esempi in C++.
- Prestazioni
Come funziona la memoria nelle console di gioco
Una storia dell'architettura della memoria delle console dall'Atari 2600 a PS5 e Xbox Series: il conteggio dei cicli e i blank, la condivisione del bus e il DMA, la RDRAM veloce-ma-lenta dell'N64, il tile renderer del Dreamcast, le tre isole di memoria della PS2, le SPU e la Local Store della PS3, l'unificazione della memoria sulla PS4 e l'SSD come nuovo livello della gerarchia di memoria.
- Prestazioni
Calcoli ridondanti
Come l'esecuzione speculativa e la branch prediction interagiscono con il sottosistema di memoria: perché il codice branchless non è sempre più veloce, il costo di una misprediction rispetto alla latenza della memoria e benchmark di ricerca binaria branchful/branchless sul Jaguar (PS4).
- Prestazioni
Perché non abbiamo cache L5?
Perché una CPU ha diversi livelli di cache invece di uno solo grande: la fisica dei segnali on-die, un'analogia con le palline di Natale, la storia dall'i486 a Nehalem, la separazione di L1I/L1D, i protocolli di coerenza, eDRAM e HBM come L4 «nascosta» e perché una L5 per ora non ha senso.
- Prestazioni
A caccia degli fps rossi
Il profiling dei giochi come filosofia di sviluppo: l'evoluzione delle aspettative sugli FPS, come i contenuti degli artisti danneggiano le prestazioni (geometria, texture, render, culling), i metodi di profiling — sampling, instrumentation, tracing, event-based, analisi statica e replay — e il design di un tracing profiler con architettura a zero allocazioni e handle per le stringhe.
- Prestazioni
Il buono, il brutto, il colorato e il veloce
Allocatori di memoria anormali dalla pratica: un allocatore che traccia i lifetime per dare la caccia ai leak, un allocatore randomizzante (chaos) per lo stress test dei sistemi a lunga esecuzione, un allocatore «colorato» per l'isolamento dei sottosistemi (Deathloop) e il veloce TLSF — con diagrammi e un benchmark in cicli di CPU.
- Prestazioni
Respingo i commit che usano l'heap e chiedo ai colleghi di riscrivere quella logica
L'esperienza di costruire grandi giochi C++ senza heap: perché le allocazioni dinamiche sono pericolose su console e mobile (frammentazione, degrado dei tempi di malloc, un rifiuto in certificazione) e con cosa sostituirle — container a dimensione fissa gtl::vector<T,N>, etl/FastDelegate al posto di std::function, CRTP e polimorfismo statico con std::variant, object pool e placement new.
- Prestazioni
Come far entrare un elefante in una valigia
I livelli di ottimizzazione nel porting dei giochi su hardware debole: architettura, algoritmi e codice. La storia di un costoso controllo di escaping delle stringhe — da un loop ingenuo a una versione branchless, una lookup table e SIMD con _mm_movemask_epi8.
- Prestazioni
Lance & bit
Impacchettare i bool nei bit: std::bitset, std::vector<bool>, un ingenuo array di byte e l'approccio di CryEngine, benchmark con picchi a 32/64/128, i miss del branch predictor e una vettorizzazione SSE finale con _mm_movemask_epi8.
- Prestazioni
Pensare a task nei motori di gioco
I pattern fondamentali dei sistemi di task nei motori: spostare movimento, fisica, script, path-finding, animazione, rendering e I/O su thread separati, il raggruppamento dei task, il message passing e un confronto tra un task semplice, un thread manager e un task manager.
- Prestazioni
Un 486 dovrebbe bastare a tutti
Quali tecnologie general-purpose sono comparse nelle CPU dopo il 486 e usiamo ogni giorno: cache e prefetch, la TLB, l'esecuzione speculativa, NUMA, SIMD, l'out-of-order, il GPGPU e la branch prediction — con esempi dalle console e benchmark.
- Prestazioni
Semplicemente non copiarlo
Passaggio per valore vs const&, allocazioni nascoste su stringhe e vettori, reserve e un crollo reale a 10 FPS — il tutto con benchmark su QuickBench.
- Prestazioni
E 20 core ancora non bastano
Undici tecniche di ottimizzazione C++ da motori in produzione: cache warming, dispatch a compile time, loop unrolling, signed/unsigned e corrispondenza dei tipi, isolamento degli hotpath, SIMD, prefetch, constexpr e lock-free — con benchmark e storie di guerra.
- Prestazioni
Non c'è fretta… (Sugli spinlock)
Implementazioni di spinlock in C++ — dal TAS ingenuo a un ticket spinlock — con benchmark, cache miss e le sfumature della prioritizzazione dei thread.
- Prestazioni
Cache inquinata? Fai scorta di test
Come cache, associatività, coerenza e allineamento dei dati influenzano le prestazioni — con benchmark.