나는이 질문에 대답하여 내가이 코멘트에서 말한 것을 분명하게 해줄 것이라고 생각했다.
스레드 :
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 루프는 빠릅니다!
내가하려는 일을 이해할 수 없다. – Zoe
나는 DrawPercise (canvas)를 원한다. 매 50000000 나노초마다 실행하지만 그 이상은 항상 – MREZA
스레드를 만들고, 60FPS로 설정하고 최선을 다하겠습니다. 안드로이드 장치가 120 이상 걸릴 수 있으므로 60/30은 일반적인 안드로이드 전화 – Zoe