2012-01-11 7 views
5

Tworzę prostą grę 2D dla Windows Phone 7 (Mango) przy użyciu XNA Framework.Jak uniknąć częstych int/float/double rzutków podczas tworzenia aplikacji XNA?

Zrobiłem następujące obserwacje:

  • Większość operacji rysowania akceptują float s
  • SpriteBatch.Draw akceptuje Rectangle który wykorzystuje int s
  • Klasa Math akceptuje double s jako parametry, a także zwraca double s

Tak więc mój kod jest pełen typecastów między int s, float s i s. To cholernie dużo typecasts.

Czy istnieje sposób, że mogę się ich pozbyć, czy powinienem po prostu nie dbać o to?

Co więcej, czy te typecasts powodują wymierną utratę wydajności?

+1

Jeśli to możliwe, użyj klasy XNA "MathHelper". Ma kilka metod i stałych, które są spławikami. http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper%28v=XNAGameStudio.40%29.aspx – SomeWritesReserved

+0

Hm, to bardzo miłe! :) Brakuje tylko funkcji trygonometrycznych. – Venemo

Odpowiedz

2

Zauważyłem to również, ale jeśli nie zauważysz zmniejszenia prędkości, można to uznać za mikrooptymalizację. Konwersja między float i jest stosunkowo droga, natomiast konwersja pomiędzy float i jest tania. Gdziekolwiek nie musisz wykonywać konwersji, możesz uniknąć tego. Odlewanie typu jest zwykle tańsze niż faktyczna konwersja (na przykład przy użyciu Convert.ToInt32). Jednak to wszystko nie jest wąskie gardło, chyba że wykonujesz je wiele razy. Również z this post:

  • float, double i int mnożenia mieć taką samą wydajność ==> użyć odpowiedniego rodzaju numeru dla swojej aplikacji, bez obawy
  • telefon jest 4x do 10x wolniej niż PC używam do rozwijania moich aplikacji ==> testuj z prawdziwym telefonem, nie ufaj komputerowi do operacji matematycznych
  • Podziały są do 8 razy wolniejsze niż multiplikacje! ==> nie używaj podziałów, np. spróbuj użyć 1/A następnie pomnożyć

nieoficjalnych liczb, ale myślę, że ten ostatni jest dość akceptowaną metodą. Podwójne są często uważane za wolniejsze od pływaków, ale sprowadza się to do systemu, na którym działa. AFAIK, Windows Phone jest zoptymalizowany do używania doubles, co wyjaśniałoby, że klasa Math je akceptuje.

Podsumowując, dość często widzę, że rzutowanie odbywa się w oparciu o framework XNA. Oczywiście należy go unikać, gdy tylko jest to możliwe, ale jest mało prawdopodobne, aby był źródłem wąskich gardeł dla gier, chyba że trzeba go często wykonywać, w takim przypadku inne obszary mogą być łatwiejsze do optymalizacji (lub może być wymagane przeprojektowanie struktury gry)).

+0

Dzięki za odpowiedź! :) Jestem nowy w XNA i jakoś czułem się "winny" przez wszystkie te typki. I tak, testuję na prawdziwym telefonie (A Nokia Lumia 800) i nie widzę problemów z wydajnością. – Venemo

0

Jeśli martwisz się o konwersji Prostokąt, są przeciążenia, które biorą Vector2 zamiast, które są pływak opartej:

http://msdn.microsoft.com/en-us/library/ff433988.aspx

Uwaga źródło (tekstury) nadal jest prostokątem, ale to jest zwykle jest to słowo statyczne (nie słowo kluczowe w języku C# static, ale niezmienne, nienametyczne).

+0

Wiem, że istnieje takie przeciążenie, ale uczciwie przeciążenie, które ma Prostokąt jest o wiele wygodniejsze w użyciu przez większość czasu. :) – Venemo

+1

Nie zgadzam się, ale jest to technicznie jeden ze sposobów na uniknięcie ich. –

Powiązane problemy