Помощь темы с игрой Android - PullRequest
3 голосов
/ 14 марта 2010

Мне нужна помощь в работе с тремя нитями в Android

Один поток является основным, другой - GLThread, а другой - WorkerThread, который я создал для обновления состояния игры.

Проблема, с которой я столкнулся, заключается в том, что всем им необходим доступ к одному и тому же LinkedList игровых объектов. И GLThread, и мой WorkerThread читают только из LinkedList, так что никаких проблем нет, но иногда у меня есть основной поток, добавляющий в список другой игровой объект.

Как мне это сделать? Я попытался использовать синхронизированный перед задействованными функциями, но это действительно замедляет работу приложения.

По какой-то причине простое отлавливание ошибок, а не рендеринг или обновление игрового состояния этого фрейма приводит к тому, что он постоянно начинает отставать.

У кого-нибудь есть отличные идеи?

Ответы [ 2 ]

1 голос
/ 14 марта 2010

Я бы предложил CopyOnWriteArrayList. Это копирует список поддержки, когда он мутирует, но разрешает несинхронизированное чтение с компромиссом, что вы читаете список с момента времени относительно записи.

0 голосов
/ 14 марта 2010

Существуют различные способы сделать это: если ваш список не слишком большой, вы можете CAS (сравнить и установить) список, который является атомарной операцией. Для этого необходимо создать копию списка, добавить элемент, который необходимо добавить, и затем CAS без блокировки. Если это добавление происходит только изредка, то это не будет значительными накладными расходами. CAS - это метод для AtomicReference из элементарной библиотеки Java ... Как отметил Software Monkey, с помощью CopyOnWriteArrayList.

можно добиться того же самого.

Кроме того, вы также можете взглянуть на различные контейнеры в библиотеке параллелизма Java или, если вы хотите иметь коллекцию без блокировки, используйте ConcurrentHashMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...