我在使用 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 个图像放在 1 个中吗?)
5) 与水滴相同但没有动画
6到10)无关紧要,它只是画一个图像
我猜速度慢是由于:(2)因为星星的数量(4)因为动画,女巫每2-3帧更改为不同的图像,也许它对内存来说太多了,我想我应该合并所有图像都集中在 1 中。
S. Galaxy S i9000 的帧速率约为 20-22 FPS