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 ...?
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. –
Ś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? –
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 –