2011-07-15 10 views
8

Przesyłam dwuwymiarową grę akcji z systemu Windows Phone 7 (opracowanego w XNA 4.0) na Androida. Używam wywołań Canvas.drawBitmap() - około 200-300 na aktualizację klatki - z różnymi farbami dla każdego połączenia, aby obsłużyć zmienną przezroczystość i koloryzację w czasie rysowania. Jest to zarządzanie systemami cząstek i różnymi innymi nakładkami oraz efektami w grze, a także taflami w tle i grzebieniami w grze. Nie robię żadnych zmian rozmiaru ani obracania na żądanie, to proste prostokąty src-> dest o tym samym rozmiarze.Słaba wydajność Androida Canvas.drawBitmap - przejdź na OpenGL?

Na WP7 działa to z prędkością 30 + fps, ale staram się uzyskać 12fps na moim testowym sprzęcie droidowym (Samsung Galaxy S). To sprawia, że ​​gra jest nie do odtworzenia. Po sprofilowaniu kodu, potwierdziłem, że cały mój czas jest tracony w Canvas.drawBitmap()

Wydaje mi się, że podążam za wszystkimi zwykłymi poradami dotyczącymi wydajności - używając SurfaceView, mając na uwadze GC, więc nie tworząc mnóstwa wyrzucania przedmioty i unikanie Drawables.

Mam rację, rozumiejąc, że Canvas.drawBitmap() jest związany z procesorem, a jeśli chcę poprawić wydajność, muszę przełączyć się na OpenGL, który będzie używać GPU? Nie mogę znaleźć tego stwierdzenia, że ​​nigdzie gdzieś baldecznie, ale czytając między liniami niektórych komentarzy, myślę, że to może być mój następny krok ...?

+1

Jak rysujesz swoje mapy bitowe? Jaki format koloru? Jakie wymiary? W programowaniu graficznym istnieje * dużo * rzeczy, które należy szanować, aby wszystko działało szybko. Proszę napisać jakiś kod. –

+1

Świetne pytanie. Miałem ten sam problem z Canvas.drawBitmap() i zakończyłem portowanie gry w openGl, ale może przegapiłem super-tajną opcję Canvas? –

+0

Gra ma ponad 100 klas, dziesiątki tysięcy linii. Nie jestem pewien, czy mogę opublikować rozsądny wyciąg, który byłby szczególnie pouczający. Efekty różnią się od 16x6 do 128x128, wszystkie ARGB_8888 –

Odpowiedz

7

Jest to normalne. Podczas używania przezroczystości płótno jest niesamowicie wolne (np. ARGB_8888).

2 opcje:

  • Przełącz na OpenGL ES
  • użytkowania najmniejszy możliwy przejrzystość swoich bitmap (tj użyć RGB_565 najbardziej można).
+0

Dzięki. Chciałem to potwierdzić zanim wyruszyłem i nauczyłem się zupełnie nowego stosu graficznego, na wypadek, gdybym zrobił coś głupiego ... –

1

Być może będzie lepiej działać na systemie Android 3+, ponieważ wykorzystuje akcelerację sprzętową w operacjach na płótnie.

Powiązane problemy