Od kilku dni zbierałem się z tą notką i w końcu muszę napisać słów kilka o bibliotece (w zasadzie to całym frameworku) dla platformy .NET jakim jest XNA. Na początek może trochę technikaliów (wprost z Wikipedii):
Biblioteka XNA powstała w firmie Microsoft jako następca Managed DirectX. Struktura XNA przypomina właśnie Managed DirectX czyli znajdziemy tam część odpowiedzialną za grafikę 3D, część odpowiedzialną za odtwarzanie dźwięków itd. Ponieważ XNA opiera się na platformie .NET, gry z użyciem XNA można programować za pomocą dowolnego języka opartego o .NET czyli C#, C++/NET, VB.NET, IronPython i wiele innych. Kod jest kompilowany do postaci kodu zarządzanego a dopiero przy uruchomieniu jest kompilowany do wykonywalnego. Dzięki takiemu rozwiązaniu, gra może zostać uruchomiona zarówno na komputerze PC jak i np. na konsoli Xbox 360. Kod wykonywalny jest generowany przez optymalizator wspólny dla wszystkich kompilatorów Microsoftu czyli daje kod bardzo podobny do zwykłego kodu C++ dla Win32. Różnice wynikają jedynie z użycia platformy .NET. Ponadto biblioteki zawarte w XNA, np. część graficzna (odpowiednik Direct3D 9.0c) zostały pozbawione interfejsów COM i zreorganizowane specjalnie dla kodu managed dając wydajność większą niż w ich odpowiednikach w DirectX 9.0c.
Prościej mówiąc, jes to takie “coś”, co “siedzi” pomiędzy DirectX-em, sterownikami naszej karty graficznej a naszą aplikacją (konkretniej - naszym engine’m). No dobrze - ktoś może zapytać - “po co mi to, skoro mogę skorzystać z gotowych silników, które nie są aż tak trudne do nauki i dają niebotyczne efekty graficzne łącznie z obsługą fizyki, dźwięku, kontrolerów, sieci, itp. , a nie marnować czas na naukę kolejnej abstrakcyjnej nakładki na DirectX-a. Już spieszę z odpowiedzią. Po pierwsze, XNA wykorzystuje platformę .NET - wiąże się z tym kilka zależności:
- teoretycznie można pisać w każdym z języków .NET, które będą wykorzystywać kod frameworku,
- teoretycznie kod taki może być przenośny między platformami PC (Windows z .NET, Linux z Mono),
- praktycznie, przy niewielkich modyfikacjach można stworzyć grę, którą można bez problemu uruchomić zarówno na PC jak i na Xbox360,
- należy uwzględnić wszystkie “za i przeciw” programu napisanego w języku zarządzanym, jakim może być np. C#,
Jak widzicie, zgodnie ze starym porzekadłem, “nie ma nic za darmo” - tak i w tym wypadku zostajemy obarczeni kilkoma aspektami, które będą miały negatywny wpływ na wydajność naszej aplikacji. Dokładnie - wydajność - bo to ona jest przecież najważniejsza - stanowi poważny przedmiot rozważań, jeśli nie nad XNA, to nad C# w zupełności. Nie ukrywam, że i mnie początkowo odstraszały mity o ociężałych, wręcz interpretowanych programach, które w zasadzie można szybko pisać, jednak strach je uruchamiać
Nic bardziej mylnego - kod XNA jest tak zoptymalizowany, że nawet w zestawieniu go z zarządzanym środowiskiem uruchomieniowym w jakim operuje nasz C#, spadek wydajności w porównaniu do analogicznej aplikacji napisanej w C++ z użyciem DirectX jest rzędu kilku, kilkunastu procent, przy założeniu intensywnego wykorzystania “wnętrzności” naszego PC. Dla prostych gier, produkcji 2D - różnicy praktycznie nie można zaobserwować.
A jak to wygląda ze strony developerskiej? Cóż - trzeba stwierdzić oczywisty fakt - pisanie gier jeszcze nigdy nie było tak przyjemne
W zasadzie wymagana jest elementarna wiedza z zakresu matematyki przestrzennej i podstaw projektowania graficznych aplikacji trójwymiarowych, i uzbrojeni w taką wiedzę możemy w bardzo krótkim czasie tworzyć pierwsze projekty. Oczywiście wykorzystujemy całą moc kart graficznych, korzystając z różnych technik świateł, cieniowania, wykorzystujemy shadery - jednak jest to bardzo intuicyjne - wiedza, którą pozyskaliśmy dzięki nauce DirectX-a nie pójdzie na marne i będziemy mogli ją wykorzystać. Wspominam tu o DirectX-ie, jednak jest to tylko częściowa prawda - jako że XNA z założenia ma być wieloplatformowy, a w Linuxie bibliotek DX nie uświadczymy, rozwiązano ten problem w inny sposób, mianowicie implementując renderer w OpenGL-u (oczywiście w ramach projektu Mono). Widzicie więc, że podejmowane są próby unifikacji co jest zjawiskiem pozytywnym, zarówno dla developerów (twórców), jak i użytkowników. Jak powiedział jeden z wykładowców na naszej grupie .NET - “w obecnych czasach nie liczą się (w znacznym stopniu) efekty, ważniejszy jest pomysł”. Stąd właśnie MS wyszedł z inicjatywą dla wszystkich koderów, dając im za darmo potężna narzędzia jakim są: Visual Express C# i XNA - można powiedzieć że kompletny pakiet do tworzenia w pełni profesjonalnych produkcji. Ważnym odnotowania jest fakt, że w internecie znajduje się mnóstwo koderów tworzących projekty w C# i XNA, którzy stanowią bardzo życzliwą społeczność i z chęcią pomagają “świeżym” twórcom w zgłębianiu tego framework’u, co jest niezmiernie potrzebne na samym starcie.
Nie pozostaje mi nic innego jak zabrać się za poznawanie XNA, wrażenia z nauki postaram się zamieszczać na blogu
P.S: W przyszłości, po dokładnym zgłębieniu XNA, możliwe że to ono stanie się bazą dla mojego engine’u ![]()
