390 likes | 538 Views
Άγγελος Μπιμπούδης, Φοιτητής/Ερευνητής στο Τμήμα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστημίου Αθηνών, Microsoft Student Partner. ΧΝΑ in a nutshell Τι κάνει ένας XNA Developer σε ένα μεγάλο studio ανάπτυξης παιχνιδιών;. Πώς φτάσαμε στο XNA. Assembly Direct3D <= 7.x
E N D
ΆγγελοςΜπιμπούδης, Φοιτητής/Ερευνητής στο Τμήμα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστημίου Αθηνών, Microsoft Student Partner ΧΝΑ in a nutshell Τι κάνει ένας XNA Developer σε ένα μεγάλο studio ανάπτυξης παιχνιδιών;
Πώς φτάσαμε στο 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 • Απλοποίηση κώδικα • Αρχίζει και γίνεται προσιτό σε ευρύτερο πλήθος προγραμματιστών • ΧΝΑ
FFP vs Pixel Shaders • Fixed Function Pipeline • Programmable Pipeline
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();
Full Screen – XNA Equivalent graphics.IsFullScreen = true/false
Το ΧΝΑ (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 Platform XNA Game Studio Express Επέκταση του Visual Studio C# Express για υποστήριξη του XNA Framework Επιπλέον, προσθέτει υποστήριξη για δημιουργία και διαχείριση περιεχομένου (μοντέλα, ήχος, κτλ) XNA Framework XNA Game Studio Express XNA Framework .NET game framework Άμεση μεταφορά σε XBOX 360
XNA Framework Layers Content Code Components Storage Math Audio Graphics Input Direct3D Starter Kits Content Pipeline XACT XINPUT XContent Application Model Legend Πηγές XNA Προγραμματιστής Games Extended Framework Core Framework Platform
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 • Texture • Effects • Shaders …
Sound Άνεση στην διαχείριση ήχων • Διαχείριση αρχείων XACT • Προσθήκη ήχων • Ρύθμιση παραμέτρων • Δημιουργία συλλογών από ήχους • Εύκολο integration για τους προγραμματιστές • Ανάκτηση με λογικά ονόματα • Looping, streaming, και memory management • Buffer 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
Unmanaged Code Native binaries, που εκτελούνται από την CPU Managed Code Ο compiler παράγει ενδιάμεσο κώδικα (IL) O Just-In-Time compiler μεταφράζει τον IL σε native κώδικα (σε run time) Οφέλη Διαχείριση μνήμης Ανεξαρτησία πλατφόρμας Ασφάλεια Native vs. managed
Απαιτητική η διαδικασία επεξεργασίας γραφικών, όμως… Το βάρος πέφτει αποκλειστικά στην GPU Μελετάμε τα system calls Managed βιβλιοθήκες που χρησιμοποιούν την native υλοποίηση του DirectX Overhead αμελητέο και πολλές φορές μηδενικό Optimized έκδοση του .NETcf Performance Monitoring Tools XNA Performance
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 • Downloads • Microsoft Visual C# Express • XNA Game Studio Express • DirectX SDK - (August 2007)(κυρίως για documentation) • Πηγές • Forums • forums.microsoft.com/msdn • XNA Developer Center • msdn.com/xna
Χρήσιμα links για XNA • XNA team blog • blogs.msdn.com/xna • XNA Creators Club Online • creators.xna.com • Community sites • XNAResources.com • XNADevelopment.com • Performance από .NETcf team (link1link2) • Διαθέσιμες οι παρουσιάσεις για XNA από GDC 2008 • Θα βρείτε την παρουσίαση στο studentguru.gr • Ελληνικό blog του XNA (δηλώστε συμμετοχή)http://www.studentguru.gr/blogs/xna/default.aspx • To blog μου: Delicate Sound of Developmenthttp://www.studentguru.gr/blogs/grnemo
ΧΝΑ & ΧΒΟΧ 360 • XBOX Live Silver/Gold Subscription • XNA Creators Club Academic Subscription (δωρεάν συνδρομή ενός χρόνουμέσω ELMS)
Q&A Ευχαριστώ, Happy Joyful Game Designers