39
Άγγελος Μπιμπούδης, Φοιτητής/Ερευνητής στο Τμήμα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστημίου Αθηνών, Microsoft Student Partner

ΧΝΑ in a nutshell Τι κάνει ένας XNA Developer σε ένα μεγάλο studio ανάπτυξης παιχνιδιών;

Embed Size (px)

DESCRIPTION

Άγγελος Μπιμπούδης, Φοιτητής/Ερευνητής στο Τμήμα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστημίου Αθηνών, Microsoft Student Partner. ΧΝΑ in a nutshell Τι κάνει ένας XNA Developer σε ένα μεγάλο studio ανάπτυξης παιχνιδιών;. Πώς φτάσαμε στο XNA. Assembly Direct3D

Citation preview

Άγγελος Μπιμπούδης, Φοιτητής/Ερευνητής στο Τμήμα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστημίου Αθηνών,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 Απλοποίηση κώδικα Αρχίζει και γίνεται προσιτό σε ευρύτερο πλήθος προγραμματιστών

ΧΝΑ

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

}

XNA Equivalent

_

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

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

Profiling on Xbox 360

Profiling on WindowsCLR Profiler for the .NET Framework 2.0

Τελικά τι έκανε ο XNA developer; Οι old-school gd’s τον υποδέχτηκαν γεμάτο

καχυποψία Ο XNA developer δεν πτοήθηκε, γιατί δεν ξέρει

κάτι διαφορετικό από εκείνους. Χρησιμοποιούσε ένα έξυπνο εργαλείο που τον μύησε στο game design.

Στα project-ακια του έπαιξε με shaders, χρησιμοποίησε AI, physics, κτλ

Προκάλεσε σύγχυση και άφησε το video να παίζει…

viewer discretion advised :P

XNA in action

Χρήσιμα 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)

Q&A

Ευχαριστώ,

Happy Joyful Game Designers