.NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios...

20
.NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios [email protected]

Transcript of .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios...

Page 1: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

.NET vs DirectX: Prestazioni… Managed

Francesco Carucci3D Software Engineer

Black&White Studios

[email protected]

Page 2: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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

Page 3: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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

Page 4: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

.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

Page 5: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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

Page 6: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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!

Page 7: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

Esempio: Landscape Editor

• Questo e’ il tool di editing delle isole di Black&White 2:

Page 8: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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

Page 9: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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’

Page 10: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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!

Page 11: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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

Page 12: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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

Page 13: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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

Page 14: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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.

Page 15: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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!

Page 16: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

DEMO!

I’ll give you

SPHERE&BOXESComing soon on your screens…

Page 17: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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.

Page 18: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

Conclusione

• “Every fool can write code that a machine can understand, good programmers write code that a human can understand” – Martin Fowler

Page 19: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

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

Page 20: .NET vs DirectX: Prestazioni… Managed Francesco Carucci 3D Software Engineer Black&White Studios fcarucci@lionhead.com.

Domande…

?Fate i bravi che chiamo la mucca