我将我的游戏基于农场游戏示例,并且自从我第一次开始制作游戏以来一直存在口吃问题。我没有尝试过任何东西已经摆脱它们所以我已经达到了我花了几个小时创建一个简化版的lunarlander示例,然后放入一个简单的滚动图像来显示口吃的地步。注意:它与垃圾收集器无关。如果您认为是这样,只需查看日志,垃圾收集器就会在出现断断续续的时间点附近运行。
向下滚动屏幕的图像大约每秒钟在我的手机上停顿约1/10秒(Motorola Milestone,2.2)。这种口吃并不能完全摧毁游戏玩法,但却令人分心,令人沮丧。我的游戏还涉及很多快速滚动和快速移动,所以它通常更明显。
如果你们有时间,你可以快速浏览一下这个日食项目,看看是否:
我希望我只是有一条延迟的代码行,导致整个事情没有我意识到。我无法相信即使在剥离了这么多之后它仍然具有与我的完整游戏1000个对象完全相同的口吃,特别是因为它在我的手机上以稳定的60fps运行。
编辑:在Traceview上描述了我的游戏,看起来很好。答案 0 :(得分:1)
我在手机上试了一下(nexus one),对我来说也一样。
我做了一些改动,这对我来说更好:
我没有在循环期间每次声明新变量,而是声明了类的属性
Canvas c = null; //变成
私人画布c;
循环中的//现在只需使用
c = null
对doDraw和updatePhysics函数中反复声明的所有变量执行此操作。
而不是直到永远增加viewY,我只是把一点if statemant
if(viewY> mCanvasHeight){
viewY -= mCanvasHeight;
}
我不确定它现在是100%工作但对我来说好多了。
答案 1 :(得分:0)
听起来你的滚动会产生大量需要经常收集的垃圾。如果您要创建大量短期小对象,请考虑管理自己的池。只要你不让游泳池无限制地增长,这可以大大减少gc抢占你的时间。
答案 2 :(得分:0)
我在Verizon DroidX(2.2.1)上进行了测试,看起来每隔3-6秒就非常简短。关闭活动壁纸似乎稍微好一点,没有其他运行。也许图形子系统跟不上?您是否尝试过图形密集度较低的图像(较少的像素和较少的颜色),只是为了看看它的作用?
答案 3 :(得分:0)
你每帧正在绘制三个巨大的背景位图...这比你需要做的更多。使用TileMode设置重复BitmapShader
可能更好。然后它只是对本机层的一次调用。
在某处添加Paint paint;
成员并更改您的setSurfaceSize()
以包含以下内容:
BitmapShader shader = new BitmapShader(mBackgroundImage,
TileMode.CLAMP, TileMode.REPEAT);
paint = new Paint();
paint.setShader(shader);
然后doDraw()
只需要这样:
//translate to viewY position
canvas.translate(0,(float)(-viewY));
//draw backgrounds
canvas.drawPaint(paint);
我实际上没有测量过这个证明它更快,但从我对图形API的了解它当然应该是。
(当然,如果你真的希望飞行,你应该使用OpenGL ES ...)