我使用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)与drop相同但没有动画 6到10)无关紧要,它只是画一个图像
我猜这种缓慢是由于:(2)由于动画的星数(4),每隔2-3帧改变一个不同的图像,也许它对记忆来说太多了,我猜我应该只用1合并所有图像。
使用S. Galaxy S i9000的帧速率约为20-22 FPS
答案 0 :(得分:3)
如果禁用绘图,您实现了多少fps? 只是为了检查显示管道的占用量。
我曾尝试过以下 创建大小为720 x 480的5位图:像素格式RGB565 从类似于您的循环中将它们显示在SurfaceView上。 唯一的区别是我已经准备好了位图"并没有把它们画成一个循环。 这是在Nexus-S手机上实现的目标
FPS:55(我试图快速运行循环,没有规定)
Cpu负载:85%
这时我决定从JNI渲染我的SurfaceView :) !!
进行类似的实验,看看您的设备能够节省多少油耗"没有"绘图操作。如果它看起来不错,那么您可以了解您是否可以在预算范围内适应您的绘图操作。
答案 1 :(得分:0)
需要考虑的事项:您需要多长时间拍摄?
如果你在30 FPS以下运行时遇到问题,我会重新考虑让它睡觉。这不是一个确切的事情,根据API可以睡得更少或更多,所以我暂时删除它,让它尽可能快地运行。
我同意上述内容,请发布绘图代码或将其注释到绘图程序的调用中,看看你正在运行的FPS。
一般情况下,如果测量时间超过1秒,从采样的角度来看,您可能会看到它的抖动值。
许多退缩端只能在60的除数中工作。所以如果你做了很多东西,可能会有一两个额外的召唤将你从60/1 = 60 fps带到60/2 = 30 fps。 / p>