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
Tieni l’hot path al fresco e la cache al caldo
Nei giochi conta non la banda di memoria ma la latenza: quanto passa tra richiesta e risposta mentre tutti i sistemi del frame si dividono un’unica L3. Il riscaldamento software della cache con accessi fittizi e dove ti spara nei piedi, una struttura che «è semplicemente cresciuta» e ha rotto tutto, il costo dell’indirezione degli handle, un prefetch software che ha pagato solo su 32 MB, chiamate virtuali non poi così costose, cali di cache che non sono veri cali, un inquinatore di cache che ha ingannato se stesso e il blocco hardware della cache su Intel, AMD e PS5.
- 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.