android "游戏循环" 帧速,Android基本游戏循环实例分析

// desired fps

private final static int MAX_FPS = 50;

// maximum number of frames to be skipped

private final static int MAX_FRAME_SKIPS = 5;

// the frame period

private final static int FRAME_PERIOD = 1000 / MAX_FPS;

@Override

public void run() {

Canvas canvas;

Log.d(TAG, "Starting game loop");

long beginTime; // the time when the cycle begun

long timeDiff; // the time it took for the cycle to execute

int sleepTime; // ms to sleep (<0 if we're behind)

int framesSkipped; // number of frames being skipped

sleepTime = 0;

while (running) {

canvas = null;

// try locking the canvas for exclusive pixel editing

// in the surface

try {

canvas = this.surfaceHolder.lockCanvas();

synchronized (surfaceHolder) {

beginTime = System.currentTimeMillis();

framesSkipped = 0; // resetting the frames skipped

// update game state

this.gamePanel.update();

// render state to the screen

// draws the canvas on the panel

this.gamePanel.render(canvas);

// calculate how long did the cycle take

timeDiff = System.currentTimeMillis() - beginTime;

// calculate sleep time

sleepTime = (int)(FRAME_PERIOD - timeDiff);

if (sleepTime > 0) {

// if sleepTime > 0 we're OK

try {

// send the thread to sleep for a short period

// very useful for battery saving

Thread.sleep(sleepTime);

} catch (InterruptedException e) {}

}

while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {

// we need to catch up

// update without rendering

this.gamePanel.update();

// add frame period to check if in next frame

sleepTime += FRAME_PERIOD;

framesSkipped++;

}

}

} finally {

// in case of an exception the surface is not left in

// an inconsistent state

if (canvas != null) {

surfaceHolder.unlockCanvasAndPost(canvas);

}

} // end finally

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值