Android游戏中的多线程问题
2010-06-29 15:19:00 来源:WEB开发网this.fireflyView= fireflyView;
// 在最开始初始化这个task的时候就把传过来的坐标复制出来用,免得两个线程冲突
System.arraycopy(x,0,calculateX,0,FireflyView.MAX_FIREFLY_COUNT);
System.arraycopy(y,0,calculateY,0,FireflyView.MAX_FIREFLY_COUNT);
}
@Override
public void run() {
// 更新坐标,此时应该不影响另一个主线程的draw动作
this.updateXY();
// 坐标更新完了之后把新坐标给主线程复制一份,让他画。
// 不过如果这个时候主线程正在画图的话,这个调用也就只有阻塞了
fireflyView.copyXYArray(bufferX, bufferY);
}
}
问题就是,我觉得应该是第二种方法更好一些,但是第二种方法每次都要对数组进行一次复制,变相又加大了计算量
而且目前这种情况,如果主线程在画图的话,另一个线程还要等着,更新好的数据还是没法传过来的。如果要解决这个问题,就还需要再加一次arraycopy(),这样更加增大了操作。虽然网上搜了下,觉得arraycopy的效率还是挺高的,但是还是想咨询下。
顺便还想了解下,对于多线程的操作究竟怎么样才好呢。
而且,如果使劲想,如果对对象的update太花时间,比如是整个对象draw周期的5倍,就是我们的主线程调用onDraw都画5次了,结果因为对象update太花时间,我们的update连一次都没做完。结果就是主线程五次onDraw画的都是同样的东西(因为没update嘛),那我还不如单线程,等他update完了再画图……就感觉这样看来,两个线程根本就没有意义嘛?除了防止Application not response……
又或者,我们update算起来好快好快,我们在两次onDraw之间,update就已经完成了10次,这样onDraw画出来的东西实际就相当于掉帧掉了10帧,这样想起来,两个线程也没意义嘛……
这样想来,游戏虽然背景音乐啊之类还是需要多线程外,但对于在画面上显示的东西似乎多线程意义不大哦?就是说,如果我单线程来计算你的机器卡的话,我换成多线程计算你的也必然卡,没得悬念得(其实从计算机底层看也似乎确实是这样的嘛(暂时无视多核多CPU))……防Application not response的除外
更多精彩
赞助商链接