Я делаю игру на Android, которая будет иметь три темы.Это будет мой поток рендеринга GL, мой поток обновления игры и поток пользовательского интерфейса.
Игра вращается вокруг ArrayList
(а также регулярного массива) объектов 'ball'.Пользователь создает шар, нажимая на экран, поток обновления игры перемещает шары по экрану, а поток рендеринга рисует все шары.
Проблема, с которой я столкнулся, связана с проблемой параллелизма, возникающей измногие потоки обращаются к одним и тем же данным, а именно к массиву шаров.В частности, проблема заключается в получении 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 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);
}