.NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios [email protected] Black&White 2 • Statistiche: – – – – – – Quattro anni e mezzo di sviluppo Circa 2 milioni e mezzo di linee di codice Complessita’ ciclomatica totale: NP Fino a quarantacinque ingegneri sul codice Circa 4500 cene ordinate al fastfood 4 bambini nati nel team durante il periodo di sviluppo Problemi • Il codice si e’ evoluto a partire da quello di Black&White. • Testing interamente manuale. – Nessuna politica di testing automatico – Difficolta’ di refactoring del codice • Difficolta’ nel debugging e gestione della memoria. – Double delete e memory scribbler – Resource leak .NET la soluzione? (1) • Si. – Semplificherebbe la gestione della memoria – eliminerebbe i bug comuni nella programmazione nativa – offrirebbe migliori tool di supporto al testing e al refactoring .NET la soluzione? (2) • No, almeno per ora, per due motivi: – Prestazioni. Il porting di Quake in Managed C++ viaggia a circa il 90% del framerate rispetto alla versione nativa. Non e’ male. – Garbage Collector non deterministico. Non e’ l’ideale per un’applicazione real time dove il framerate deve essere il piu’ costante possibile ed il GC non garantisce un tempo di esecuzione massimo. I Tool di sviluppo • Una gran parte del tempo di sviluppo e’ spesa nei tool di supporto – Tool di esportazione dell’art asset (texture, modelli, animazioni) – Tool di editing visuale (es. level editor) – Tool di scripting per definire il game play • In un tool le prestazioni contano relativamente • .NET e’ una soluzione per questo problema gia’ oggi! Esempio: Landscape Editor • Questo e’ il tool di editing delle isole di Black&White 2: .NET vs DirectX • Un level editor, ad esempio, condivide gran parte dell’engine grafico con il gioco. • L’engine e’ codice nativo ed implementato in termini di DirectX native. Deve andare veloce. • Il framerate costante non e’ una necessita’ di un editor visuale • Ci serve uno ‘strumento’ per coniugare le prestazioni dell’engine nativo alla produttivita’ dell’ambiente managed. • C++/CLI e’ il nostro uomo. DEMO! • Creeremo un Direct3D Device unmanaged. • Useremo il Device per colorare una Form di rosso. • Fatto questo, Black&White 2 e’ solo un paio d’anni di sviluppo piu’ in la’ Facade Pattern • “Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.” GOF185 • Il Facade pattern cattura l’essenza di quello che stiamo facendo: un’astrazione ad alto livello di un motore 3D consumabile da .NET. • Cool! Anche noi programmatori 3D usiamo i Design Pattern! Facade (1) • Concetti a basso livello esposti da D3D: – – – – 3D Device Vertex e index buffer Shader Texture • Concetti ad alto livello esposti dal facade: – Oggetto 3D – Materiale – Scena Facade (2) • Il facade espone solo una vista ristretta e semplificata dell’engine sottostante. • Il giusto livello di astrazione dipende dall’applicazione: – Troppo a basso livello non serve: c’e’ gia’ DirectX Managed – Troppo ad alto livello non serve: limiterebbe il campo d’applicazione Sphere&Boxes (1) • Questo e’ il risultato di due settimane di R&D, e delle mie indubbie qualita’ artistiche • Sphere&Boxes consiste in: – – – – Un semplice motore di rendering in Direct3D native Un motore di fisica scritto in codice nativo (Novodex) Un framework di generazione degli shader (cool ) Un wrapper che espone oggetti device, mesh e camera Sphere&Boxes (2) • Un’applicazione C# pilota l’engine usando gli oggetti managed esposti dal facade e implementa semplici effetti di riflessione e ray casting. • Un oggetto Scene in C# implementa il render loop ed un semplice database di mesh da disegnare. Sphere&Boxes (3) • Il rendering loop gira in un thread separato dalla “logica” dell’applicazione. • Prototipare un’architettura di rendering multithreaded in C# e’ rapido e indolore! – Ma poi l’implementazione finale dovra’ essere in C++ – … e wrappata per essere nuovamente accessibile al mondo managed! • Lo strumento giusto per risolvere ogni problema: – C# per scrivere il tool di visualizzazione e editing del mondo – C# per prototipare rapidamente una soluzione – C++ per spaccare il nanosecondo in quell’inner loop! DEMO! I’ll give you SPHERE&BOXES Coming soon on your screens… Sviluppi futuri • Valutare la piattaforma .NET come framework per sviluppare l’applicazione principale e non i soli tool di supporto. • Il linguaggio giusto per il compito giusto: – Engine in C++ – Game code in C# – Script in Python/LUA • Domani: C++ come l’assembly oggi, C# come il C++ oggi. Sviluppare ad un livello di astrazione piu’ alto. Conclusione • “Every fool can write code that a machine can understand, good programmers write code that a human can understand” – Martin Fowler Approfondimenti • DirectX SDK October Release – http://msdn.microsoft.com/directx/sdk/ • Novodex Physics Engine – http://www.ageia.com/novodex.html • Quake II .NET – http://www.codeproject.com/managedcpp/Quake2.asp Domande… ? Fate i bravi che chiamo la mucca