2017-02-03 1 views
0

나는 을 간단하게 만들었습니다 안드로이드에 캔버스가있는 2D 게임. 나는 그것이 내 게임에 충분하다고 생각한다. 약 % 40- % 50 CPU를 사용하는 캔버스 작업 잠금 및 잠금 해제. 정상입니까? 또는 내가해야 할 일? 내 영어Android Canvas 너무 많은 CPU 사용

while(GVars.isGameRunning){ 
     c=holder.lockCanvas(); 
     p.setColor(Color.argb(255, 229, 43, 68)); 
     c.drawRect(GMethods.createRec(0,0,GVars.size[0], 90),p); 
     for (int i = 0; i < GVars.size[0]/110; i++){ 
      c.drawRoundRect(new RectF(i*100+30,100,i*100+130,100+100),10,10,p); 
     } 
     p.setColor(Color.argb(255,255,255,255)); 
     p.setTextSize(50); 
     c.drawText("Simple text:", 0,60, p); 
     holder.unlockCanvasAndPost(c); 
     try{Thread.sleep(GVars.waitTime/*waitTime =30*/);}catch(Exception ex){}; 
    } 

죄송합니다 : 내 게임 루프 코드가 있습니다.

편집 : 다시 한번 이렇게 시도했습니다. (메인 스레드에서) 이제 % 10의 CPU가 사용됩니다. 나는 그것이 내가 원하는 것이라고 생각한다. : D 고마워요!

@Override 
public void onDraw(Canvas c){ 
    p.setTextSize(50); 
    for (int i = 0; i < GVars.size[0]/110; i++){ 
     p.setColor(Color.argb(255,183, 33, 53)); 
     c.drawRoundRect(new RectF(i*100+i*10, 100+5, i*100+100+i*10, 100+100+10),10,10,p); 
    } 
    p.setColor(Color.argb(255,255,255,255)); 
    c.drawText("Test:", 0,60, p); 
    invalidate(); 
    try{Thread.sleep(20);}catch (Exception ex){} 
} 
+0

자신 만의 루프가 아닌 Android 이벤트 메커니즘을 사용해야합니다. –

+0

p.s. 컨텍스트를 더 제공하려면 코드가 포함 된 클래스와 메서드를 포함해야합니다. –

+0

'onDraw()'에'Thread.sleep()'을 넣으면 안됩니다. 여전히 앱의 메인 스레드가 고정됩니다. 'invalidate()'도 호출 할 필요가 없다. –

답변

1

코드의 루프가 기본 이벤트 스레드를 차단합니다. 대신 Android API에서 이벤트 메커니즘을 사용해야합니다. 특히 View.onDraw()을 무시해야합니다.

+0

아니요, 차단되지 않습니다. 루프가 다른 스레드에 있습니다. 미안, 나는 언급하지 않았다. – zekikos

+0

그리고 나는 override onDraw()를 시도했지만 여전히 너무 많은 CPU를 사용하고있었습니다. – zekikos

+0

@zekikos 당신이 한 일을 보여줄 필요가 있습니다. 현재 코드를 포함하고있는 클래스와 메소드를 보여줍니다. 'onDraw()'에서 당신이 시도한 것을 보여주십시오. 다른 스레드에서 루프를 실행하고 있다고 생각할 수도 있지만 기본 UI 스레드에서만보기를 사용할 수 있기 때문에 불가능합니다. 다른 스레드에서 사용하려고하면 예외가 발생하여 응용 프로그램이 중단됩니다. –

관련 문제