2013-03-16 2 views
4

Я столкнулся с недавними шипами отставания в игре, которую я разрабатывал. Это согласовано, происходит примерно в одно и то же время. Использование Java профилировщика jvisualvm я нашел это происходит в то же время определенная нить, кажется, перезагружать или что-то (АВТ-EventQueue-0):Отказ от обмена нитями

Image of Thread changing channels

Кроме того, нет никакой видимой причины, не в использовании кучи, использовании процессора, пространстве памяти или методах. Иногда это может вызвать ConcurrentModificationException при рисовании моего массива объектов, но это должно произойти только с существенным отставанием, и моя игра вряд ли будет интенсивной.

Я не помню выполнения каких-либо недавних изменений в проект, однако я провел недавно следующее:

  • Обновленный Java до последней версии
  • Скачивали последняя версия JDK7 (хотя не используется в этом проекте)
  • исправлена ​​ошибка с затмением, которое произошло в результате установки JDK7 (удален предел 256M в eclipse.ini)

Я запускаю Eclipse Indigo-service-1 на 32-разрядной XP. Мои процессоры почти не используются.

+0

Что такое «запаздывающий шип»? Как вы его измеряете? Когда поток «перезагружен», что он делает? – Gray

+1

Прыжок запаздывания, где игра заканчивается примерно на 3 FPS в течение секунды или около того, это видно, практически делает игру неиграбельной, так как это игра типа реакции. Я понятия не имею, что делает Thread, я даже не знаю, для чего нужен Thread. Если бы вам понравилось, я мог бы получить отвалы Thread от jvisualvm? –

+0

Отмечу, что единственная обработка потоков, которую я выполняю, - это инициализация, где я начинаю цикл игры. –

ответ

5

Кажется, вы делаете слишком много на тему отправки сообщения (EDT). AWT-Event-Queue-0 выглядит как EDT. Кроме того, ваш последний комментарий говорит:

... кажется, отставание наблюдается только тогда, когда я рисую свою игровую доску сначала, а не непосредственно компоненту.

Вам нужно будет подтолкнуть некоторые из ваших вычислений к другим темам, и похоже, что рисование игрового поля является хорошим выбором для этого. Кроме того, любой ИИ, который у вас есть.

Ваша клавиатура & Обработчики мыши запускаются на EDT, а обновления графики тоже нужны. Но вы можете предварительно визуализировать изображение (как вы сейчас делаете) вне EDT. И вы можете отправить клавиатуру & событиям мыши в другой поток через BlockingQueue.

Еще одна вещь, которую вы могли бы сделать, - это отменить свою скорость обновления игры с вашей скоростью обновления фрейма.

Но без каких-либо подробностей я не могу дать больше советов.

Update: (только что прочитал вашу немного о ConcurrentModificationException)

Это может быть вызвано двумя разными вещами:

  1. обновляемых коллекцию (как ваш ArrayList) в другом потоке из тот, который вы читаете; или
  2. Вы повторяете эту коллекцию и обновляете ее в цикле.

Пункт 2 легко исправить; но я боюсь, что не могу научить безопасность потоков в таком коротком пространстве.