奇怪的口吃问题,我不能摆脱(包括全部来源)

我以我的游戏为背景,自从我开始制作这个游戏以来,我的游戏就一直在出现口吃问题。 我已经试过的东西已经摆脱了他们,所以我已经花了几个小时创造了一个剥离版本的月球人的例子,并把一个简单的滚动图像显示口吃。 注意:它与垃圾回收器无关。 如果你认为是这样的话,只要看看日志,垃圾收集器就不会运行,就像出现口吃一样频繁。

在我的手机上摩擦大约1/10秒,屏幕上的图像大概每秒钟都会造成口吃(Motorola Milestone,2.2)。 这种口吃并不完全彻底摧毁游戏玩法,但却令人分心和沮丧。 我的游戏还涉及很多快速滚动和快速移动,因此在那里通常更加明显。

如果你们有时间可以快速浏览这个eclipse项目,看看是否:

  1. 它在你的手机上为你安排(仔细观察它的滚动,每半秒钟到一半半)
  2. 如果你能看到任何解决口吃的方法

我希望我只是有一个迟缓的代码行导致整个事情没有我意识到。 我简直不敢相信,即使剥离了这么多,仍然有完全相同数量的口吃,我的完整的游戏与1000个对象,特别是因为它在我的手机上以60fps的速度运行。

编辑:有Traceview我的游戏,似乎很好。

源下载链接: http : //dl.dropbox.com/u/4972001/LunarLander.rar

Solutions Collecting From Web of "奇怪的口吃问题,我不能摆脱(包括全部来源)"

我在我的手机上试了一下(nexus one),对我来说也一样。

我做了一些改变,使我更好:

  1. 我不是每次在循环中声明新variables,而是声明了这个类的属性

    Canvas c = null; //变成

    私人帆布c;

    //现在循环使用

    c = null

对所有在doDraw和updatePhysics函数中重复声明的variables执行此操作。

  1. 而不是增加viewY直到永远,我只是把一点,如果statemant

    if(viewY> mCanvasHeight){

    viewY -= mCanvasHeight; 

    }

我不确定它现在是否100%正常工作,但对我来说似乎更好。

这听起来像你的滚动产生大量的垃圾,需要经常收集。 如果你正在创造大量的短期小物件,考虑pipe理你自己的池。 只要你不让游泳池无限制地增长,这可以大大减lessgc抢占你的时间。

我testing了一个Verizon DroidX(2.2.1),它看起来像每3-6秒和非常简短。 这看起来好一点,主动墙纸closures,没有别的运行。 也许graphics子系统跟不上? 您是否尝试过使用更less的graphics密集图像(像素更less,颜色更less)来查看它的function?

你正在绘制三个巨大的背景位图…这是比你需要做的更多的工作。 将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); 

我没有实际测量这个来certificate它的速度更快,但是从我所知道的graphicsAPI当中应该是这样的。

(当然,如果你真的想飞,你应该使用OpenGL ES …)