나는 SurfaceView를 사용하여 나의 프레임을 가진 몇몇 트루 블을 가지고있다. 나는 일부 튜토리얼에서 찾은 tipical 물건들을하고있다. (그들 모두는 똑같이 말하고있다.) 그러나 나는 삼성 갤럭시 S (오래된 것, i9000)에 괜찮은 프레임 속도에 도달 할 수 없다.안드로이드 SurfaceView를 가진 낮은 FPS
다음은 루프 스레드에 대한 코드입니다. FPS가 서피스 뷰 SurfaceView 30.
@Override
public void run() {
long ticksPS = 1000/FPS;
long startTime;
long sleepTime;
//fps checker
long contms=0;
long lasttimecheck = System.currentTimeMillis();
int fps=0;
while (running) {
long time = System.currentTimeMillis();
if(contms>1000) {
Log.v("FPS",String.valueOf(fps));
contms=time-lasttimecheck;
fps=1;
}
else {
fps++;
contms+=time-lasttimecheck;
}
lasttimecheck = time;
Canvas c = null;
startTime =time;
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
try {
if (sleepTime > 10)
sleep(sleepTime);
else {
Log.w("LOWFPS",String.valueOf(contms));
sleep(10);
}
} catch (Exception e) {}
}
}
초기화되고, I는 holder.setFormat (PixelFormat.RGBA_8888)와 홀더를 초기화; 하지만 쓸모없는 CPU 작업 (비트 맵을 로컬 변수에 저장 한 후 그립니다)을 피하기 위해 비트 맵을 사용하여 작업해야하는지 잘 모릅니다. 게임은 간단하다, 그것은 훨씬 빨리 달려야한다.
프레임 속도는 매우 무작위이며 때로는 스무디가 작동하며 때로는 느려지지만 항상 30FPS 미만입니다.
어떤 아이디어 ??? onDraw는 설명
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bg, 0, 0, null); //1
stars.draw(canvas,dx,dy); //2
if(playing.on()) reactors.draw_reaccio(canvas,dx,dy); //3
gotes.draw(canvas,dx,dy); //4
reactors.draw(canvas,dx,dy); //5
sg.draw(canvas); //6
sr.draw(canvas); //7
eraser.draw(canvas); //8
playing.draw(canvas); //9
opcions.draw(canvas); //10
}
1) 배경 드로잉
EDIT가 (480X800) 2)는 coordenates와의리스트 "getHeight()"를 기본 객체 (개)를 포함하는 클래스 (X , y)와 관련된 이미지 (약 9 개의 다른 별 이미지)를 가진 ID 3) n * 2 개의 원을 채 웁니다. 하나는 채우기가 있고 다른 하나는 관련 객체 (약 20 정도)마다 획을 긋습니다. 4) 게임의 객체, 애니메이션과 함께 작은 방울. 9 개의 다른 종류의 방울이 있으며 각각에는 애니메이션의 5 개의 관련 이미지가 있습니다. (아마도 5 개의 이미지를 1 개로 넣어야합니까?) 5) 방울과 동일하지만 애니메이션이없는 경우 6 ~ 10) 부적절합니다.
느린 이유는 다음과 같습니다. (2) 애니메이션 때문에 별의 수가 많아지기 때문에 마녀는 2-3 프레임마다 다른 이미지로 바뀌며 메모리가 너무 많을 수 있습니다. , 난 그냥 1
프레임 속도 드로잉을 사용하지 않도록 설정하면 약 20 ~ 22 FPS S. 갤럭시 S의 I9000
내 새 Galaxy Nexus에서 비슷한 문제가 발생합니다. 내 응용 프로그램은 주로 SurfaceView를 사용하고 다른 모든 장치에서 잘 작동합니다. ICS에서는 하드웨어 가속이 강제 설정되어 있어도 사용할 수 없습니다. – GuyNoir
도면 코드 자체를 게시 할 수 있습니까? 앱의 시간/CPU 집약적 인 부분을 확인하려면 TraceView를 사용하십시오. http://developer.android.com/guide/developing/debugging/debugging-tracing.html –
전체 클래스를 게시하십시오. 그렇지 않으면 누구도 코드를 신중하게 분석 할 수 없습니다. 흐름. – poitroae