我在android上制作了一个有三个线程的游戏。这些将是我的GL渲染线程,我的游戏更新线程和UI线程。
游戏围绕ArrayList
(以及常规阵列)的“球”对象展开。用户通过点击屏幕创建一个球,游戏更新线程在屏幕上移动球,渲染线程绘制所有球。
我遇到的问题是处理由许多线程访问相同数据(即球阵列)引起的并发问题。特别是在游戏线程移除球时接收out of bounds exception
,并且渲染线程试图访问移除的球。
如果您考虑我发布的代码示例。确保一旦这些代码块中的任何一个(在不同的线程上)开始执行,另一个在完成之前无法启动的最佳方法是什么?
呈现主题
int size = balls.size();
for(int i = 0; i < size; i++){
Ball ball = balls.get(i);
drawBall(ball.xCoord, ball.yCoord, ball.image);
}
游戏thead
int size = balls.size();
for(int i = size -1; i >= 0; i--){
Ball b = balls.get(i);
b.updateBallPosition();
b.updateBallVelocity();
if(b.isOutOfBounds())
balls.remove(i);
}
答案 0 :(得分:0)
使用synchronized
块来确保代码的一部分互斥:
final Object lock = new Object(); // globally visible lock object
渲染线程:
synchronized(lock) {
int size = balls.size();
for(int i = 0; i < size; i++){
Ball ball = balls.get(i);
drawBall(ball.xCoord, ball.yCoord, ball.image);
}
}
游戏主题:
synchronized(lock) {
int size = balls.size();
for(int i = size -1; i >= 0; i--){
i.updateBallPosition();
i.updateBallVelocity();
if(i.isOutOfBounds())
balls.remove(i);
}
}
此时,两个线程中只有一个可以执行代码,而另一个将阻塞。请注意,它们必须在同一个锁定对象上同步。