Как я могу исправить эту "тупиковую" петлю события касания / отрисовки? - PullRequest
1 голос
/ 07 мая 2010

Просто хочу начать с того, что это отличный сайт, надеюсь, вы, ребята, можете помочь!

Я пытаюсь использовать структуру, изложенную в LunarLander, для создания простой игры, в которой пользователь может перетаскивать некоторые растровые изображения на экране (реальная игра более сложная, но это не важно). Я вырвал ненужные части LanderLander и создал свой собственный растровый рисунок, что-то вроде

BoardThread (an inner class of BoardView):
run()
{
  while(mRun)
  {
    canvas = lockSurfaceHolder...
    syncronized(mSurfaceHolder)
    {
      /* drawStuff using member position fields
         in BoardView */
    }
    unlockSurfaceHolder
  }
}

Мой drawStuff просто проходит через некоторые массивы и выбрасывает растровые изображения на холст. Все это прекрасно работает. Затем я хотел начать обработку сенсорных событий, чтобы при нажатии пользователем растрового изображения он выбирался, когда пользователь распаковывал растровое изображение, он отменяется, и если растровое изображение выбирается во время события сенсорного перемещения, растягивается растровое изображение. Я сделал это, прослушав сенсорные события в родительском объекте BoardView BoardActivity и передав их в BoardView. Что-то вроде

In BoardView
handleTouchEvent(MotionEvent e)
{
  synchronized(mSurfaceHolder)
  {
    /* Modify shared member fields in BoardView
       so BoardThread can render the bitmaps */
  }
}

Это также работает нормально. Я могу без проблем перетаскивать свои плитки по экрану.

Однако, время от времени, когда приложение запускается впервые, и я запускаю свое первое событие касания, handleTouchEvent прекращает выполнение на синхронизированной линии (как показано в DDMS). Цикл рисования активен в течение этого времени (я могу сказать, потому что таймер меняется на экране), и обычно требуется несколько секунд или больше, прежде чем через сенсор проходит множество событий касания, и все снова в порядке.

Для меня это не похоже на тупик, поскольку цикл прорисовки постоянно входит и выходит из своего синхронизированного блока. Разве это не должно позволить потоку обработки событий захватить блокировку на mSurfaceHolder? Что тут происходит? У кого-нибудь есть предложения по улучшению того, как я это структурировал?

Некоторая другая информация. Такое «зависание» происходит только при первом касании после начала действия. Это включает в себя изменение ориентации после вызова restoreState. Кроме того, я могу удалить ВСЕ в синхронизированном блоке в обработчике событий, и он все равно будет зависать при синхронизированном вызове.

Спасибо!

1 Ответ

0 голосов
/ 21 мая 2010

Так Роб Грин из rbgrn помог мне получить немного больше информации об этом. В итоге я использовал параллельную очередь для доставки сенсорных событий в мой игровой поток, но у меня все еще были проблемы с зависанием при вызове saveInstanceState, поэтому я теперь вызываю Thread.sleep (16) в нижней части каждой итерации потока моей игры петля. Полное обсуждение здесь .

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