Άγγελος Μπιμπούδης, Φοιτητής/Ερευνητής στο Τμήμα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστημίου Αθηνών,Microsoft Student Partner
Πώς φτάσαμε στο XNA Assembly Direct3D <= 7.x
Προγραμματισμός σε C Ανεπαρκή εργαλεία Code porting δύσκολο Αποκλειστικά fixed function pipeline
Direct3D 8,9 Προγραμματισμός σε C++ Βελτιωμένο Hardware Abstraction Layer Για πρώτη φορά εμφανίζονται programmable pipelines, ενισχύοντας τον
προγραμματισμό των 3D γραφικών Managed Direct3D (MDX)
Πρώτη προσπάθεια να γίνονται κλήσεις DirectX, από .ΝΕΤ βιβλιοθήκες Προγραμματισμός και σε Visual Basic Απλοποίηση κώδικα Αρχίζει και γίνεται προσιτό σε ευρύτερο πλήθος προγραμματιστών
ΧΝΑ
Initializing DirectX – Step 1
// Step 1: Δημιουργία του IDirect3D9 object.
md3dObject = Direct3DCreate9(D3D_SDK_VERSION);
if( !md3dObject )
{
MessageBox(0, "Direct3DCreate9 FAILED", 0, 0);
PostQuitMessage(0);
}
Initializing DirectX – Step 2
// Step 2: Έλεγχοι για υποστήριξη διάφορων συσκευών
D3DDISPLAYMODE mode;md3dObject->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);HR(md3dObject->CheckDeviceType(D3DADAPTER_DEFAULT, mDevType, mode.Format, mode.Format, true));HR(md3dObject->CheckDeviceType(D3DADAPTER_DEFAULT, mDevType, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, false));
Initializing DirectX – Step 3
// Step 3: Έλεγχος για την υποστήριξη επεξεργαστή κορυφών.
D3DCAPS9 caps;
HR(md3dObject->GetDeviceCaps(D3DADAPTER_DEFAULT, mDevType, &caps));
DWORD devBehaviorFlags = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
devBehaviorFlags |= mRequestedVP;
else
devBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// If pure device and HW T&L supported
if( caps.DevCaps & D3DDEVCAPS_PUREDEVICE &&
devBehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING)
devBehaviorFlags |= D3DCREATE_PUREDEVICE;
Initializing DirectX – Step 4
// Step 4: Fill out the D3DPRESENT_PARAMETERS structure.
md3dPP.BackBufferWidth = 0;
md3dPP.BackBufferHeight = 0;
md3dPP.BackBufferFormat = D3DFMT_UNKNOWN;
md3dPP.BackBufferCount = 1;
md3dPP.MultiSampleType = D3DMULTISAMPLE_NONE;
md3dPP.MultiSampleQuality = 0;
md3dPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
md3dPP.hDeviceWindow = mhMainWnd;
md3dPP.Windowed = true;
md3dPP.EnableAutoDepthStencil = true;
md3dPP.AutoDepthStencilFormat = D3DFMT_D24S8;
md3dPP.Flags = 0;
md3dPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
md3dPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
Initializing DirectX – Step 5
// Step 5: Δημιουργία κυρίως object
HR(md3dObject->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
mDevType, // device type
mhMainWnd, // window associated with device
devBehaviorFlags, // vertex processing
&md3dPP, // present parameters
&gd3dDevice)); // return created device
}
Toggling FullScreen
// Switch to fullscreen mode.if( enable ){
// Are we already in fullscreen mode?if( !md3dPP.Windowed )
return;
int width = GetSystemMetrics(SM_CXSCREEN);int height = GetSystemMetrics(SM_CYSCREEN);
md3dPP.BackBufferFormat = D3DFMT_X8R8G8B8;md3dPP.BackBufferWidth = width;md3dPP.BackBufferHeight = height;md3dPP.Windowed = false;
// Change the window style to a more fullscreen friendly style.SetWindowLongPtr(mhMainWnd, GWL_STYLE, WS_POPUP);
// If we call SetWindowLongPtr, MSDN states that we need to call// SetWindowPos for the change to take effect. In addition, we // need to call this function anyway to update the window dimensions.SetWindowPos(mhMainWnd, HWND_TOP, 0, 0, width, height, SWP_NOZORDER | SWP_SHOWWINDOW);
}// Switch to windowed mode.else{
// Are we already in windowed mode?if( md3dPP.Windowed )
return;
RECT R = {0, 0, 800, 600};AdjustWindowRect(&R, WS_OVERLAPPEDWINDOW, false);md3dPP.BackBufferFormat = D3DFMT_UNKNOWN;md3dPP.BackBufferWidth = 800;md3dPP.BackBufferHeight = 600;md3dPP.Windowed = true;
// Change the window style to a more windowed friendly style.SetWindowLongPtr(mhMainWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);
// If we call SetWindowLongPtr, MSDN states that we need to call// SetWindowPos for the change to take effect. In addition, we // need to call this function anyway to update the window dimensions.SetWindowPos(mhMainWnd, HWND_TOP, 100, 100, R.right, R.bottom, SWP_NOZORDER | SWP_SHOWWINDOW);
}
// Reset the device with the changes.onLostDevice();HR(gd3dDevice->Reset(&md3dPP));onResetDevice();
Το ΧΝΑ (XNA’s Not Acronymed) είναι το καινούριο framework της Microsoft, αποτελούμενο από εργαλεία και βιβλιοθήκες, βασισμένα στο .NET Framework 2.0 και στο DirectX9.0. Aφορά τον προγραμματισμό, την σχεδίαση και την διαχείριση περιβάλλοντος, παιχνιδιών για Windows και XBOX 360.
Αποτελείται, από το ΧΝΑ Framework και το XNA Game Studio Express τα οποία διανέμονται δωρεάν.
Γλώσσα προγραμματισμού: C# (garbage collection, hardware abstraction, thread management, security model)
Δεκέμβριος 2006 -> Version 1.0 Απρίλιος 2007 -> Version 1.0R Δεκέμβριος 2007 -> Version 2.0 Μάιος 2008 -> Version 3.0 (CTP, αναμένεται τέλος έτους)
Microsoft’s XNA Framework
Λιγότερος και απλούστερος κώδικας, εστιάζοντας στην ιδέα και όχι στην πλατφόρμα ανάπτυξης.
Ευκολία στον προγραμματισμό παιχνιδιών για ακόμα μεγαλύτερο κοινό: ερασιτέχνες, σπουδαστές και επαγγελματίες
Άνετο debugging, crash-free παιχνίδια Ανάπτυξη των δικών μας παιχνιδιών για Windows και
ΧΒΟΧ 360
XNA FrameworkΣτόχοι
XNA Development Tools
XNA FrameworkXNA Framework
.NET game framework.NET game frameworkΆμεση μεταφορά σε Άμεση μεταφορά σε XBOX 360XBOX 360
XNA Game Studio XNA Game Studio ExpressExpress
XNA FrameworkXNA Framework
XNA Game Studio ExpressXNA Game Studio Express
Επέκταση του Επέκταση του Visual Visual Studio C# Express Studio C# Express για για υποστήριξη τουυποστήριξη του XNA XNA FrameworkFramework
ΕπιπλέονΕπιπλέον,, προσθέτει προσθέτει υποστήριξη για υποστήριξη για δημιουργία και δημιουργία και διαχείριση περιεχομένου διαχείριση περιεχομένου (μοντέλα, ήχος, κτλ)(μοντέλα, ήχος, κτλ)
PlatformPlatform
XNA Framework LayersXNA Framework Layers
PlatformPlatform
CoreCoreFrameworkFramework
ExtendedExtendedFrameworkFramework
GamesGames
XACTXACT XINPUTXINPUT XContentXContentDirect3DDirect3D
GraphicsGraphics AudioAudio InputInput MathMath StorageStorage
Application ModelApplication Model Content PipelineContent Pipeline
Starter KitsStarter Kits CodeCode ContentContent ComponenComponentsts
Legend XNAXNA Προγραμματιστής ΠηγέςΠηγές
Application ModelΈμφαση στην λογική του παιχνιδιού
Εστιάζουμε στο παιχνίδι και όχι στην πλατφόρμα Τρόπος σχεδίασης game loop Διαχείριση παραθύρου Προγραμματιστικοί κανόνες για την πλατφόρμα
Γράφουμε κατευθείαν κώδικα για την λογική του παιχνιδιού
Game Είναι η βασική κλάση που αρχικοποιεί την μονάδα
γραφικών, την λογική του παιχνιδιού, τον κώδικα που ασχολείται με το rendering
Πέντε οι βασικές μέθοδοι
Κορμός Προγράμματοςpublic class Game1 : Microsoft.Xna.Framework.Game{ GraphicsDeviceManager graphics; ContentManager content;
public Game1() { graphics = new GraphicsDeviceManager( this ); content = new ContentManager( Services ); }
protected override void Initialize() { base.Initialize(); }
protected override void LoadContent() { }
protected override void UnloadContent() { }
protected override void Update( GameTime gameTime { }
protected override void Draw( GameTime gameTime ) { }}
Application ModelΔημιουργία components και προσθήκη
λειτουργικότητας με αντικειμενοστραφή λογική
Game Component Βασικός τύπος για όλα τα XNA components
Game.GameComponents Διαχειρίζονται από την managed πλατφόρμα του
framework Προσθέτουν λειτουργικότητα
Game Logic Rendering Code Frame rate Menus
Content PipelineΣύστημα επεξεργασίας content pipeline διαχειριζόμενο από το
περιβάλλον του VS C# Express
To XNA παρέχει απλό και κατανοητό τρόπο για να προσθέσουμε όλα τα σχεδιαστικά στοιχεία στο παιχνίδι μας ότι format και αν έχουν.
Το σύστημα ροής περιεχομένων είναι σχεδιασμένο έτσι ώστε να επιτρέπει στους προγραμματιστές να: Χρησιμοποιούν ότι εργαλεία (digital content creation tools) σχεδίασης
θέλουν Ξεδιπλώνουν όλο το περιεχόμενο που έχουν ετοιμάσει δένοντάς το με
την μηχανή γραφικών Έρχονται κοντά προγραμματιστής και σχεδιαστής από θέμα ευκολίας
επίβλεψης και παραμετροποίησης περιεχομένου Βασική κλάση το ContentManager
Standar class Custom Importer method & Processor method
GraphicsΠαρέχονται χαμηλού επιπέδου κλήσεις
συστήματος για την κάρτα γραφικών
Δομημένο με βάση το Direct3D 9 Καλοσχεδιασμένες μέθοδοι ακολουθώντας
την λογική σχεδίασης .ΝΕΤ εφαρμογών Διαχειρίζονται
Meshes TextureEffects Shaders …
Sound
Άνεση στην διαχείριση ήχων
Διαχείριση αρχείων XACTΠροσθήκη ήχωνΡύθμιση παραμέτρωνΔημιουργία συλλογών από ήχους
Εύκολο integration για τους προγραμματιστέςΑνάκτηση με λογικά ονόματαLooping, streaming, και memory managementBuffer Management υψηλού επιπέδου
Input
Υποστήριξη διαχείρισης εισόδων παικτών
Έτοιμο προγραμματιστικό μοντέλοΔΕΝ χρειάζεται αρχικοποίησηΔΕΝ χρειάζεται διαχείριση καταστάσεων
ΠαρέχονταιΥποστήριξη για XBOX χειριστήριαΠληκτρολόγιοΠοντίκι (αν πρόκειται για παιχνίδι Windows)
StorageΠαρέχεται εύκολο APΙ για λειτουργίες,
ανάγνωσης εγγραφής στο σύστημα αρχείων της εκάστοτε πλατφόρμας
Το StorageContainer αποτελεί για τον προγραμματιστή ένα εικονικό σύστημα αρχείωνTo XNA είναι αρμόδιο για το που και με ποιον τρόπο
θα αποθηκεύσει δεδομέναΥποστήριξη όλων των ειδών αποθήκευσης για
XBOX Όλες οι λειτουργίες βασίζονται στο System.IO
namespace οπότε είναι κάτι πραγματικά εύκολο για τους προγραμματιστές.
Mathematics
Εξειδικευμένη βιβλιοθήκη μαθηματικών λειτουργιών
Διανύσματα, πίνακες, μετασχηματισμοί, προβολές, σφαίρες, ακτίνες, καμπύλες, γεωμετρία χώρου
Εύκολη προσαρμογή μαθηματικών μοντέλων στην game engine που σχεδιάζουμε
Παρέχεται βοήθεια για κινήσεις δομικών στοιχείων παιχνιδιών
XNA Namespaces Microsoft.Xna.Framework Microsoft.Xna.Framework.Audio Microsoft.Xna.Framework.Content Microsoft.Xna.Framework.Design Microsoft.Xna.Framework.GamerServices Microsoft.Xna.Framework.Graphics Microsoft.Xna.Framework.Graphics.PackedVector Microsoft.Xna.Framework.Input Microsoft.Xna.Framework.Net Microsoft.Xna.Framework.Storage
ΧΝΑ & ΧΒΟΧ 360 Υπέρτατη προγραμματιστική εμπειρία 95% του API είναι κοινό μεταξύ Windows και XBOX 360 Προδιαγεγραμμένες οδηγίες που ακολουθούμε ώστε το
100% των παιχνιδιών μας να τρέχει χωρίς αλλαγές σε ΧΒΟΧ 360
Δεν χρησιμοποιούμε Windows-Specific κλάσεις από Framework API (Form, Control, EventArgs)
Δεν χρησιμοποιούμε XNA Framework API που αναφέρεται ως Windows-Only στο documentation (Texture2D.FromFile(), Mouse.GetState() )
Κώδικας, textures, media κτλ δεν πρέπει να ξεπερνούν τα 2GB.
Ονόματα αρχείων (conventions για μέγεθος ονομάτων, κτλ)
Threading
Native vs. managed
Unmanaged CodeNative binaries, που εκτελούνται από την CPU
Managed Code Ο compiler παράγει ενδιάμεσο κώδικα (IL)O Just-In-Time compiler μεταφράζει τον IL σε native
κώδικα (σε run time)
ΟφέληΔιαχείριση μνήμηςΑνεξαρτησία πλατφόρμαςΑσφάλεια
XNA Performance Απαιτητική η διαδικασία επεξεργασίας
γραφικών, όμως… Το βάρος πέφτει αποκλειστικά στην GPU Μελετάμε τα system calls Managed βιβλιοθήκες που χρησιμοποιούν
την native υλοποίηση του DirectX Overhead αμελητέο και πολλές φορές
μηδενικό Optimized έκδοση του .NETcf Performance Monitoring Tools
Profiling on Xbox 360XNA Framework Remote Performance Monitor for Xbox 360
Βασικές πληροφορίες για GC Επίγνωση για προβλήματα GC System calls διερευνώνται και αναφέρονται
προσεκτικά Δυστυχώς όχι καλή υποστήριξη για
υπολογιστικά bottlenecks
Τελικά τι έκανε ο XNA developer; Οι old-school gd’s τον υποδέχτηκαν γεμάτο
καχυποψία Ο XNA developer δεν πτοήθηκε, γιατί δεν ξέρει
κάτι διαφορετικό από εκείνους. Χρησιμοποιούσε ένα έξυπνο εργαλείο που τον μύησε στο game design.
Στα project-ακια του έπαιξε με shaders, χρησιμοποίησε AI, physics, κτλ
Προκάλεσε σύγχυση και άφησε το video να παίζει…
viewer discretion advised :P
Χρήσιμα links για XNA
DownloadsMicrosoft Visual C# ExpressXNA Game Studio ExpressDirectX SDK - (August 2007)(κυρίως για
documentation)
ΠηγέςForums
○ forums.microsoft.com/msdnXNA Developer Center
○ msdn.com/xna
Χρήσιμα links για XNAXNA team blog
○ blogs.msdn.com/xnaXNA Creators Club Online
○ creators.xna.comCommunity sites
○ XNAResources.com○ XNADevelopment.com
Performance από .NETcf team (link1 link2) Διαθέσιμες οι παρουσιάσεις για XNA από GDC
2008 Θα βρείτε την παρουσίαση στο studentguru.gr Ελληνικό blog του XNA (δηλώστε συμμετοχή)
http://www.studentguru.gr/blogs/xna/default.aspx To blog μου: Delicate Sound of Development
http://www.studentguru.gr/blogs/grnemo
ΧΝΑ & ΧΒΟΧ 360 XBOX Live Silver/Gold Subscription XNA Creators Club Academic Subscription
(δωρεάν συνδρομή ενός χρόνου μέσω ELMS)