2011-11-28 3 views
4

나는 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

+0

내 새 Galaxy Nexus에서 비슷한 문제가 발생합니다. 내 응용 프로그램은 주로 SurfaceView를 사용하고 다른 모든 장치에서 잘 작동합니다. ICS에서는 하드웨어 가속이 강제 설정되어 있어도 사용할 수 없습니다. – GuyNoir

+0

도면 코드 자체를 게시 할 수 있습니까? 앱의 시간/CPU 집약적 인 부분을 확인하려면 TraceView를 사용하십시오. http://developer.android.com/guide/developing/debugging/debugging-tracing.html –

+0

전체 클래스를 게시하십시오. 그렇지 않으면 누구도 코드를 신중하게 분석 할 수 없습니다. 흐름. – poitroae

답변

3

와 함께, 당신은 얼마나 많은 FPS를 달성 않습니다되는 모든 이미지를 병합해야 추측? 디스플레이 파이프 라인이 얼마나 많은지 확인하기 만하면됩니다.

다음을 시도해 보았습니다. 크기가 720 x 480 인 pix5 형식의 RGB565 과 비슷한 루프에서 SurfaceView에 표시 할 수 있습니다. 유일한 차이점은 내가 "준비된 비트 맵"을 가지고 루프에서 그리지 않았다는 것입니다. 이 넥서스 S 전화에 달성 된 것입니다

FPS : 55 (I 규정하지 않고, 빠르게 루프를 실행하려고)

CPU 부하 : 85 %

이 JNI에서 SurfaceView를 렌더링하기로 결정한 때입니다 !! !!

유사한 실험을 수행하고 기기가 드로잉 작업없이 "스로틀 링"할 수 있는지 확인하십시오. 모양이 좋으면 예산 내에서 그리기 작업에 적합 할 수 있는지 여부를 프로파일 링 할 수 있습니다.

+0

사실 나는 다른 문제가 있었지만, 기자 포스터의 문제를 해결하는 가장 좋은 방법은 현상금을 수여하는 것입니다. – GuyNoir

0

고려해야 할 사항 : 일상적인 복용량을 얼마나 오래 그립니다?

30 FPS 미만으로 작동하는 데 문제가있는 경우 잠자는 것을 다시 생각해 보겠습니다. 이것은 정확한 것이 아니며 API에 따라 더 많거나 적은 수면을 할 수 있으므로 지금은 제거하고 가능한 빨리 실행하도록하겠습니다.

위와 동의합니다. 그리기 코드를 게시하거나 그리기 루틴 호출에 주석을 달고 실행중인 FPS를 확인하십시오.

일반적으로 샘플링 스탠드 지점에서 1 초 이상 측정하면 지터가 나타날 수 있습니다.

대부분의 드로잉 백엔드는 60의 짝수 제로에서만 작동합니다. 따라서 많은 물건을 처리하는 경우 1 ~ 2 회의 추가 전화로 60/1 = 60 fps에서 60/2 = 30 fps로 전환 할 수 있습니다.

관련 문제