Android游戏中的多线程问题
2010-06-29 15:19:00 来源:WEB开发网}
}
}
public FireflyView extends View{
// ..... 不关键方法都省了
// 初始化那个timer的时候就把当前这个实例传过去,方便他调用方法
FireFlyTimerTask timerTask = new FireFlyTimerTask(this);
// 另一个线程,那个timerTask就用这个update方法来计算萤火虫路径,其实就是萤火虫的x和y啦
public synchronized void update(){
for(Firefly updateFirefly : fireflyList){
updateFirefly.update(); // 都是叫每个萤火虫自己去计算自己下一个时刻的坐标的啦
}
}
// 然后在主线程的onDraw里画到屏幕上
public synchronized void onDraw(Canvas canvas){
for(Firefly drawFirefly : fireflyList){
drawFirefly.draw(canvas); // 都是叫每个萤火虫自己去画自己啦
}
}
}
就这样,最开始我没看出问题,但是,后来仔细一想,发现晕,其实这个和单线程一模一样嘛,因为synchronized的原因,这两个方法根本没法同时执行……还是先update了然后再画……
然后我就想了第二种
我把萤火虫的坐标,全部从Firefly类里面搞出来了,让主线程不停的画,然后另一个线程不停的更新,等每次更新完了全部坐标之后就把刚刚更新的全部坐标复制一个备份出来,然后负责画图的线程就只用那个备份的。这样,就算两个线程冲突了,画图那个线程也只需要等待两个数组复制时间,比整个 update的时间少多了。
Java代码
ArrayList
int fireflyX[] = new int[MAX_FIREFLY_COUNT]; // 用来存放X
int fireflyY[] = new int[MAX_FIREFLY_COUNT]; // 用来存放Y,以后画的时候就用这个x,y了
this.initializeFireflyList(fireflyList, fireflyX, fireflyY);
ArrayList
int fireflyX[] = new int[MAX_FIREFLY_COUNT]; // 用来存放X
int fireflyY[] = new int[MAX_FIREFLY_COUNT]; // 用来存放Y,以后画的时候就用这个x,y了
更多精彩
赞助商链接