最近写一个游戏,在一个SurfaceView上有很多的精灵,这些精灵对象都在不停的更新帧以及绘制的位置,但是我发现游戏运行时候看着总是一卡一卡的。我是这样写的:在surfaceCreated方法中启动了两个线程,一个doComputeThread,一个doDrawThread,doComputeThread中是这样写的:public void run() {
while (true) {
// 更新所有精灵显示的帧
refreshFrame();
// 更新所有精灵的位置
refreshLocation();
try {
Thread.sleep(COMPUTE_SLEEP_TIME);
} catch (Exception ex) {
}
}
}
doDrawThread中是这样写的:
public void run() {
while (true) {
Canvas canvas = myHandler.lockCanvas();
// 绘制背景
drawBackGround(canvas); // 绘制所有的游戏中需要表现的精灵spriteList1,spriteList2,spriteList3...
spriteList1.drawSprite(canvas);
spriteList2.drawSprite(canvas); myHolder.unlockCanvasAndPost(canvas);
try {
Thread.sleep(DRAW_SLEEP_TIME);
} catch (Exception ex) { }
}
}刚接触这个东西,很多东西都不懂,请教一下各位,我的设计思路是否正确,如果正确的话,COMPUTE_SLEEP_TIME以及DRAW_SLEEP_TIME这两个变量的值应该如何控制才能让游戏画面显得流畅。如果设计思路不正确的话,应该怎样处理呢?
在网上搜索了一些相关内容,还是没有头绪。希望大家帮忙看看,先谢谢了。

解决方案 »

  1.   

    把要在两个线程中都用到对象做同步,只是简单的SLeep肯定是不行的吧
      

  2.   

    应该是doComputeThread更新位置完了发消息通知重绘吧...
      

  3.   

    精灵的图片都是从网上找的,只有朝向左边的图片,每次在所有的精灵在draw的时候都会判断一次移动方向,如果是右边的话都会再重新调用Bitmap.createBitmap的方法来生成图片,我想知道如果是专业做游戏的话,是不是美工做图都是只有一个方向的,其余方向的都是编程实现的,如果是编程实现的话,是不是都是预先生成好,用的时候直接调用呢?
      

  4.   

    刚刚实验了一下,在程序加载的时候把所有会使用到的图片全部创建以后,在绘制的时候大概在20ms左右,但是悲剧的是,再次加载的时候就OOM了手指一直触摸屏幕的话,画面会有明显延迟。我加了下边这两句代码以后延迟依旧。this.setFocusable(false);
    this.setFocusableInTouchMode(false);怎样让surfaceView不监听触屏事件呢?
      

  5.   

    this.setFocusable(false);应该就不会收到touchevent了吧
      

  6.   

    依然会收到的。另外如果游戏中有许多的精灵,这些精灵使用的图片是一样的,只有位置坐标(x,y)不一样的话,是不是可以只用new一个精灵的对象出来,其余的通过clone方法生成呢?我想听听大家在开发的时候都是用的什么方法,现在还在学校学习,不知道如果在公司做开发的话,是怎么处理这种情况的,总觉得我的方法乡土化气息好浓- -
      

  7.   

    现在主要的就有两个问题:
    1、OOM。这个游戏是由许多关卡组成的,玩家在每次选择一关以后,就得到这一关的所有的会出现的精灵的信息,然后创建这些精灵。在这一关结束之后,全部释放这些对象。但是当我再次进入这一关的时候,随机会出现OOM,在创建之前我用Runtime的totalMemory和freeMemory方法输出总内存和可用内存,发现有时候在出现OOM的时候freeMemory的值还是很大的。不知道怎么回事2、触屏时候游戏延迟很高。应该是手指的触点太不精确了,会产生很多的MotionEvent.ACTION_MOVE的事件,俺这个菜鸟依旧没思路。哪位大神指点下啊。
      

  8.   

    觉得应该只是启动一个线程来画 surfaceview 的吧,两个线程未必效果比一个线程效果好;另外,使用 lockCanvas(Rect ) 应该比使用 lockCanvas() 好。
      

  9.   

    看过一篇文章,说的是android绘制图片的预置内存是有限的,例如仅有几M,绘制的图片超过这个大小就会出现OOM。可以在绘制完Bitmap之后释放该对象即可。
    if (!bitmap.isRecycled()) bitmap.recycle();
      

  10.   

    现在再看这个问题
    1、OOM以及卡的问题都是机器性能问题,测试时候用的是G12、一直触摸屏幕时候延迟确实是因为手指触点不精确,会产生很多的MotionEvent.ACTION_MOVE。