Wydajność gry XNA

[6]}piszę grę używając C # 2010 i XNA 4.0. Chcę, żeby to była dobra gra, a nie jakiś "kolejny szajs", więc jednym z moich celów jest dobra liczba klatek na sekundę. W tym celu chciałbym poprosić Cię o kilka rad, czy to związanych z XNA lub C# związane - Co mogę zrobić, aby przyspieszyć mój kod i tak poprawić FPS.

Oto kilka rzeczy, które odkryłem:

  • (c#) użycie array insted of list<> znacznie poprawi wydajność, w przypadku, gdy chcesz uzyskać dostęp do ogromnej ilości danych( a nawet partii: posiadanie lista 20000 pozycji dawała prawie 180% FPS listy 20000.
  • (c#) użycie for zamiast foreach poprawi wydajność. Na tych samych 20000 elementów jest to około 5-10% różnicy.
  • (xna i c#) wywołanie metod kosztuje wydajność, więc kiedy rozrzuciłem mój kod na metody, które nazywały inne metody i takie, i wszystko było tak fajne i zorientowane obiektowo, że kosztowało 1-3 FPS każdego wywołania.
  • (xna) update vs. draw: nie było różnicy w wydajności, gdy wstawiałem kod w update () I draw (), więc jeśli nie zależy Ci zbytnio, nie musisz umieszczać niektórych metod w update() zamiast trzymać wszystko razem w draw () w nadziei na lepsze FPS.
  • (xna) nie mam pojęcia czy to ja czy tylko 4.0, ale po załadowaniu a .X z dużą ilością tekstur i dość złożonymi siatkami, ładowanie zajmuje dużo czasu. Musiałem napisać własną .X loader i mesh / model Renderer tylko dlatego, że XNA zaczął ładować tekstury dla każdego trójkąta niezależnie od tego, czy poprzedni miał ta sama Tekstura. Nawet pisanie własnego contentloadera, który buforuje tekstury dla Ciebie, nie jest rozwiązaniem, ponieważ nadal jest używany wiele razy. Jeśli zrobisz coś ładnego i puszystego proponuję użyć klasy drawuserprimitives, a nie Model. (Nie wiem, czy jest to tylko 4.0, Czy 3.1 też miał taki problem z wydajnością)
  • (xna i c#) staraj się unikać używania "new", gdy chodzi o rysowanie. Widziałem trochę kodu w Internecie, co zostało skopiowane/wklejone razem i miało "basicefect = new Basicefect (graphicsDevice);" i taka brzydota w draw (), a jeszcze gorzej: w iteracjach wewnątrz draw (). To zabije wydajność. Zamiast tego mają jedną taką klasę w" grze " lub w klasie statycznej. Dotyczy to również innych "temp-obiektów": brzydkie, ale myślę, że lepiej jest stworzyć coś globalnego i używać go z uwagą, a następnie zrobić ładny i puszysty Kod, co sprawi, że nasza gra z powodu garbage collector.

OK, więc aby krótka historia, proszę zamieścić kilka dobrych rad tutaj, więc i / możemy zrobić dobry, szybkie i zoptymalizowane gry;)

Z góry dzięki: Zéiksz
Author: Zéiksz, 2011-08-28

3 answers

UberGeekGames ma dobry artykuł na temat optymalizacji XNA. Jest głównie skierowany do Xbox i WP7, ale wiele rzeczy dotyczy również PC.

http://www.sgtconker.com/2011/05/high-end-performance-optimizations-on-the-xbox-360-and-windows-phone-7/

Oryginalna strona jest martwa, ale jest dostępna w Internet Archive:

Zarchiwizowana Wersja wysokiej klasy optymalizacji wydajności na xbox 360 i windows phone7

Zasada jest "profil przed optymalizacją".

 5
Author: Dave Carlile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-24 12:50:56

Optymalizacja oprogramowania to rzemiosło. Najlepszym rodzajem optymalizacji są dowody oparte na zebranych statystykach.

Dopóki nie masz problemu nie Optymalizuj. Nie uważasz, że grywalność jest ważniejsza niż ta czy inna? Moja sugestia to najpierw zrobić grę, a następnie rozważyć, gdzie nie działa jak chcesz.

Następnie napisz kilka konkretnych pytań i jestem pewien, że otrzymasz pomoc tutaj w konkretnych sprawach.

W międzyczasie proponuję że dostaniesz więcej informacji z książek o rozwoju gier, takich jak te wymienione tutaj: http://forums.create.msdn.com/forums/p/8642/45646.aspx .

XNA Extereme 101 - wydaje się być ciekawym tutorialem

 7
Author: Preet Sangha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-27 22:27:49

Moje 2 grosze warte:

Nie umieszczaj całego kodu w jednej metodzie, ponieważ uważasz, że wywołanie metody kosztuje. Jeśli uważasz, że tracisz 1-3 FPS, wywołując pustą metodę, prawdopodobnie jeszcze nie skończyłeś badania straty 1-3. Aby ta strata była prawdziwa podczas pustego wywołania metody, musisz mieć liczbę klatek na sekundę w tysiącach.... gdzie nie martwiłbyś się o spadek 1-3.

FPS to zły sposób na ocenę wydajności w XNA. Gdy masz zmienny krok czasu włączone, inne procesy związane z systemem operacyjnym mogą wpływać na liczbę klatek na sekundę. Naprawdę musisz profilować. Po prostu skoncentruj się na ilości czasu, jaki zajmuje Ukończenie metody aktualizacji i/lub rysowania, odmierzając je za pomocą systemu.Diagnostyka.Obiekt stopera. czas je indywidualnie, Nie razem(bardzo ważne).

Słowo kluczowe "Nowy" powinno być unikane nie tylko w wywołaniu losowania, ale w dowolnym miejscu zarówno w aktualizacji, jak i losowaniu... Tylko dla typów referencyjnych. Użyj nowego słowa kluczowego zawsze i wszędzie, gdzie potrzebujesz z typami wartości.

 7
Author: Steve H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-28 00:42:12