2016-07-17 2 views
0

많은 문제가 있지만 가능한 가장 가까운 결과를 얻기 위해 다른 작업을 멈추거나 병렬 스레드를 사용하여 알 수 있습니까? 내 작업이 너무 오래 걸리거나 대상 장치가 나쁜 성능, 다음 타이밍이 잘못되고 있으며, 경우java/android에 상관없이 정확하게 정확한 시간에 작업 수행

public void draw(Canvas canvas) { 
    DrawButtons(canvas); 
    DrawPercise(canvas); 
    DrawLines(canvas); 
} 

private void DrawButtons(Canvas canvas) { 
    canvas.drawBitmap(Button, 50, 0, null); 
     } 

private void DrawPercise(Canvas canvas) { 

    if (System.nanoTime() >= AllowedTimeinNano) { 
     // Save time again for Next if 
     //if 50000000 nanoseconds passed do it again 
     AllowedTimeinNano = (long) (System.nanoTime() + (20000000000f/400)); 

     DoTask(); 

     } 
} 

private void DrawLines(Canvas canvas) { 

     for (float i = 40; i < 800; i += 40) { 
      canvas.drawLine(0, i, 800, i, TablePaint); 
     } 

    } 

문제는 응용 프로그램의 요점이 기반으로한다 : 여기

내 코드입니다 타이밍. 나는 이것이 불가능할 수도 있지만 당신은 몇 가지 조언을 줄 수 있겠는가?

+0

내가하려는 일을 이해할 수 없다. – Zoe

+0

나는 DrawPercise (canvas)를 원한다. 매 50000000 나노초마다 실행하지만 그 이상은 항상 – MREZA

+0

스레드를 만들고, 60FPS로 설정하고 최선을 다하겠습니다. 안드로이드 장치가 120 이상 걸릴 수 있으므로 60/30은 일반적인 안드로이드 전화 – Zoe

답변

0

나는이 질문에 대답하여 내가이 코멘트에서 말한 것을 분명하게 해줄 것이라고 생각했다.

스레드 :

public class GameThread extends Thread { 

    private int FPS = 60; 
    private double averageFPS; 
    private SurfaceHolder surfaceHolder; 
    private Clicker gamePanel; 
    private boolean running; 
    public static Canvas canvas; 

    public GameThread(SurfaceHolder surfaceHolder, Clicker gamePanel) 
    { 
     super(); 
     this.surfaceHolder = surfaceHolder; 
     this.gamePanel = gamePanel; 
    } 

    @Override 
    public void run() 
    { 
     long startTime; 
     long timeMillis; 
     long waitTime; 
     long totalTime = 0; 
     int frameCount =0; 
     long targetTime = 1000/FPS; 




     while(running) { 
      startTime = System.nanoTime(); 
      canvas = null; 

      //try locking the canvas for pixel editing 
      try { 
       canvas = this.surfaceHolder.lockCanvas(); 
       synchronized (surfaceHolder) { 
        this.gamePanel.tick(); 
        this.gamePanel.draw(canvas); 
       } 
      } catch (Exception e) { 
      } 
      finally{ 
       if(canvas!=null) 
       { 
        try { 
         surfaceHolder.unlockCanvasAndPost(canvas); 
        } 
        catch(Exception e){e.printStackTrace();} 
       } 
      } 




      timeMillis = (System.nanoTime() - startTime)/1000000; 
      waitTime = targetTime-timeMillis; 

      try{ 
       sleep(waitTime); 
      }catch(Exception e){} 

      totalTime += System.nanoTime()-startTime; 
      frameCount++; 
      if(frameCount == FPS) 
      { 
       averageFPS = 1000/((totalTime/frameCount)/1000000); 
       frameCount =0; 
       totalTime = 0; 
       System.out.println(averageFPS); 
      } 
     } 
    } 
    public void setRunning(boolean b) 
    { 
     running=b; 
    } 

} 

I가 시작했을 때 나는 자습서를했다 때 나는 그것을 가지고, 나는 단지이 사용하고 있습니다. 당신이 그것을 사용하기 전에 당신이해야 할 몇 가지가 있습니다 :

  • extends SurfaceView implements SurfaceHolder.Callback
  • 이 클래스의 이름으로 '리모콘'을 교체하는 클래스가 있습니다. FPS 계산에

:

밀리 1 초는/FPS는 업데이트 빈도 밀리 =

60분의 1,000 그것은 모든 0.01666666 초 갱신 수단 = 16.666666

어떻게 사용합니까?

심플.

if(gt == null) { 
    gt = new GameThread(getHolder(), this); 
    gt.setRunning(true); 
    gt.start(); 
} 

를 중지 :

그것을 만들기 (당신은 그들에게 자신을 배치 할 PROPPER 장소를 찾을 수있다) 내 경험에

if(gt != null) { 
     try { 
      gt.setRunning(false); 
      gt.join(); 
      gt = null; 

     } catch (InterruptedException e) { 
      Toast.makeText(c, "An error occured when stopping the thread.", Toast.LENGTH_LONG) 
        .show(); 
     } 
    } 

, 60 FPS가 걸릴 수있는 가장 좋은 FPS입니다 이것이 모든 장치에서 작동 할 것이라는 점을 확실히하십시오. 그래도 예외는 있습니다.

일반 전화기에는 현재 2GB 이상의 RAM이 있습니다. 인스턴스의 경우 S7에는 4GB의 RAM이 있습니다. 그러나 512MB RAM이 있으면 성능이 확실하지 않습니다. 그러나 512MB RAM이 장착 된 장치는 전 세계적으로 거의 없습니다. 일부 예산 휴대폰이 있지만 정말로 오래된 버전을 선택하지 않는 한 RAM이 512MB 밖에없는 제품은 많지 않습니다.

위의 스레드를 사용하면 지속적으로 업데이트되고 결코 멈추지 않을 게임 스레드를 갖게됩니다. 실제 잠재 고객을 대상으로하는 새로운 장치가 대부분 있기 때문에 성능에 대해 걱정할 필요가 없습니다.

FPS가 최대 FPS이므로 새로운 체재 반면 너무 하단 장치, 60까지 가능한 한 높게 갈 것입니다, 높은 이동하지 않습니다

또한이 스레드는 매우 간단한 방식으로 작동합니다 60시에 꾸준함.

나는 62 개까지 가끔씩 휴대 전화를 경험했지만, 실제로는 2 FPS이기 때문에 문제가되지 않는다.

는 기억

gamethread 감동 방법에서 일어나는 추가 작업은 더는 시스템 및 응용 프로그램에 변형. 아무런 제한도없고 아무 일도 일어나지 않으면 모든 게임이 2000fps에 도달 할 수 있습니다. While 루프는 빠릅니다!

+0

고마워 .i 이미 30FPS에서이 수업을 듣고 있지만 60까지 늘리면 수업 시간이 30 초 이상 걸립니다. 그 이유는 모르겠지만 이상합니다. – MREZA

+0

초당 60 번 업데이트하는 것이 스레드 – Zoe

+0

덕분에 너무 많은 것일 수 있습니다. 나는 나의 유일한 길은 내 일 전에 경과 된 전체 시간을 측정하고 그것을 내가 선택한 시간에 적용하는 것이라고 생각한다. 그런데 내가 upvote 또는 내 속도의 대답 bcz로 표시 할 수 없다 – MREZA

관련 문제