我在使用SurfaceView时遇到了一些帧率问题。我按照一些教程上的典型操作(所有教程都是一样的),但是我的三星Galaxy S(旧版,i9000)无法达到一个合理的帧率。
下面是我用于循环线程的代码。 FPS初始化为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) {}
}
}
在SurfaceView中,我使用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) 绘制背景 (480x800) 2) 这是一个包含基本对象(星星)“getHeight()”列表的类,其坐标(x、y)和关联图像的ID(约有9个不同的星星图像) 3) 它为每个相关对象绘制n * 2个圆形,一个填充,另一个描边(大约20个左右) 4) 它绘制游戏的主要对象,小滴水动画。有9种不同类型的滴落物,并且每种滴落物都有5个相关图像的动画(我应该把这5个图像放在一起吗?) 5) 没有动画的与滴落物相同 6到10) 不相关,它只是绘制一幅图像
我想缓慢是由于:(2)由于星星的数量,(4)由于动画,它会在2-3帧之间更改为不同的图像,也许对于内存来说太多了,我想将所有图像合并成只有1个。
在S. Galaxy S i9000上帧速率约为20-22 FPS。