2011-01-30 11 views
5

Szukam przykładowy przykład kodu, który pokazuje, jak osiągnąć 30 klatek na sekundę przy użyciu Android SurfaceView? Załóżmy, że każda klatka rysuje okrąg rozpoczynający się od pozycji x i y, a każda klatka zwiększa o jeden i xiy.Jak osiągnąć 30 klatek na sekundę przy użyciu Android SurfaceView?

Dodatkowe pytanie: Oprócz powyższego chcę nadpisać inny widok, aby wyświetlić zawartość tekstową, tak aby niezależnie od tego, jaka grafika jest rysowana, wyświetlana jest pod tą zawartością tekstu. Jak można to zrobić?

Odpowiedz

3

Zrób wątku, który robi to 30 razy na sekundę:

  1. połączeń SurfaceHolder.lockCanvas().
  2. Rysuje na płótnie (musi całkowicie odrysować wszystkie piksele).
  3. Zadzwoń do SurfaceHolder.unlockCanvasAndPost().

W rzeczywistości, jeśli twój wątek po prostu siedzi tak, nie próbując przerwać, zostanie zdławiony do liczby klatek na sekundę ekranu.

Musisz upewnić się, że ten wątek jest poprawnie zsynchronizowany z zarządzaniem widokiem powierzchni - na przykład jeśli powierzchnia się zmienia lub jest niszczona, twój kod powinien zsynchronizować się z gwintem, aby upewnić się, że wątek przestaje działać, podczas gdy to się stało.

Oczywiście oznacza to, że renderujesz oprogramowanie na płótnie. W zależności od tego, co robisz, może być dobrze, aby dać animację 30 klatek na sekundę. Jeśli nie, będziesz musiał użyć GLSurfaceView. Możesz mimo wszystko rozważyć jego użycie, tylko dlatego, że dba o ciebie.

+0

Czy to naprawdę najlepszy sposób na zrobienie tego? – Derzu

6

Jeśli chcesz uzyskać wysoką liczbę klatek na sekundę, naprawdę musisz przeczytać na GLSurfaceView. W normalnym widoku powierzchni będziesz na łasce obliczeń układu wydatków i renderowania centric CPU. Z GLSurfaceView można odciążyć to na GPU i mieć ścisłą, skuteczną kontrolę układów.

+0

GLSurfaceView tylko przyspiesza rysunku (bo używać OpenGL wyciągnąć do niego). Nie pozbywa się obliczeń układu ... w rzeczywistości nigdy nie powinno się wykonywać obliczeń układu podczas rysowania, a nawet rysować zwykłej hierarchii widoków. – hackbod

+1

"Nie pozbywa się obliczeń układu" - czy powiedziałem, że tak? "nigdy nie powinno się robić obliczeń układu podczas rysowania" - nie powiedziałem, że tak też zrobiłem? Jednak mówienie o ** częstości klatek ** zwykle oznacza, że ​​coś się porusza/zmienia, co wpływa na obliczenia układu. Jeśli korzystasz z natywnego menedżera układu, będzie to kosztowne. –

+0

Jeśli korzystam z interfejsu GLSurfaceView w przeciwieństwie do SurfaceView, jak bardzo wpłynie to na zużycie baterii i jaki będzie jej wpływ na zużycie baterii, jeśli urządzenie nie ma procesora graficznego, a procesor wykonuje całą pracę z nogą? Użytkownicy końcowi nie dbają o cykle procesora/procesora graficznego, ale dbają o to, ile baterii zużywa aplikacja.Moim celem jest znalezienie podejścia, które nie stawia więcej niż rozsądne obciążenie baterii. – ace

2

To może stara nitka, ale myślę, że to może pomóc innym. Tu jest ładny samouczek znalazłem na użyciu surfaceView: http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

I tu jest ładny artykuł o tym, jak wdrożyć gry pętli, które mogą pomóc w ograniczeniu fps 30: http://www.koonsolo.com/news/dewitters-gameloop/

Możesz dodać tekst bezpośrednio do surfaceView jeśli chcesz, Oto przykład

public void onDraw(Canvas canvas) { 
    ... 
    // Add text 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setFakeBoldText(true);    // if you like bold 
    paint.setShadowLayer(5, 5, 5, Color.GRAY); // add shadow 
    paint.setColor(Color.WHITE); 
    paint.setTextSize(30); 
    canvas.drawText("FPS: " + _fps, 10, 35, paint);    
} 
Powiązane problemy