Я работаю над Android-игрой, и я начал замечать небольшую медлительность во время разработки, поэтому я хотел попытаться использовать многопоточность для удовольствия и обучения.
Мое приложение имеет 3 потока:
- поток пользовательского интерфейса (должен быть в основном неактивным)
- Игровая логическая тема
- Графическая тема
Я минимизировал критический раздел между потоками 2 и 3, насколько мог, с идеей, что логика игры может обновляться независимо от потока рендеринга, а затем в конце обоих потоков я мог бы иметь как можно более короткое окно, где Я выталкиваю все графические обновления из логического потока в игровой цикл. Это должно позволить двум нитям работать независимо в течение большей части времени. В теории звучит как победа в производительности.
Однако, как только я добрался до реализации, моя работа заняла большое место. Это намного хуже, чем раньше, один цикл обновления и рендеринга занимает примерно 50 мс (20 кадров в секунду), поэтому он выглядит как мусор. Это всего лишь рендеринг примерно 20 треугольников и, возможно, 20 текстурированных квадратов, действительно простая рабочая нагрузка (я боюсь думать о том, что будет, когда я реализую правильную графику).
В любом случае я взял трассировку DDMS в андроиде в профиль, где дела идут неправильно или могут быть улучшены.
http://i.stack.imgur.com/DDUYE.png
Это примерно 3 кадра моей игры. Пока что, похоже, примерно то, что я ожидал. Части, выделенные синим цветом, представляют собой заблокированную секцию, которая выглядит правильно (держит glThread в основном, ожидая, пока он заблокирован). Однако как только я разблокирую его, я должен видеть, что оба потока работают одновременно, и похоже, что они есть, но если я посмотрю ближе:
http://i.stack.imgur.com/vukXQ.png
Я занимаюсь разработкой на двухъядерном телефоне, но если я правильно понимаю трассировку, это не похоже на то, что он когда-либо делал что-либо параллельно, и что хуже, по-видимому, переключает активную нить сотни раз за миллисекунды! (если я не интерпретирую это неправильно). Все это переключение контекста, похоже, было бы ужасно для производительности, поэтому я не уверен, почему он хотел бы переключаться туда и обратно так быстро.
Итак, после моего долгого объяснения, мне интересно несколько вещей:
- Насколько я понимаю, что заполненные прямоугольники в трассировке являются активными потоками, а цветные линии - спящими потоками? В противном случае, что они означают?
- Почему я не вижу, чтобы мои потоки выполнялись одновременно на якобы двухъядерном телефоне?
- Почему это так быстро переключает активные потоки?
- В DDMS я получаю предупреждение "ПРЕДУПРЕЖДЕНИЕ: активен отладчик, результаты отслеживания методов будут искажены". О чем это беспокоиться? Как я могу избавиться от этого предупреждения? (Я запускал приложение через Run, а не через Debug, если это имеет значение)