Другие процессы называют GC, который замедляет мою игру

Я пишу аркадную игру в режиме реального времени для Android >= 2.1. Во время игрового процесса я не выделяю память, чтобы не соблазнять GC. Beacuse, если GC вызывает, требуется процессор на 70-200 мс. Пользователь видит это как "о нет, эта игра отстает...".

Я проверил LogCat. Есть много GC_FOR_MALLOC или GC_EXPLICIT. Но... не от PID моего процесса! Моя игра не вызывает их. Они вызваны тем, что другие процессы работают в фоновом режиме. Некоторые обои, виджеты, радио, электронная почта, проверка погоды и другие услуги...

Я не понимаю этого полностью. Когда, например, обои исчезают, его onPause() называется, я полагаю. Таким образом, он должен остановить все свои потоки и, конечно же, не выделять какую-либо память (или вызвать System.gc()). Может быть, это неправильно реализовано? Я не знаю. Но есть некоторые службы Android, которые также время от времени вызывают GC... Это странно.

Это большой недостаток архитектуры Android <= 2.2? Android 2.3 вводит параллельный GC, который занимает меньше времени.

Что я могу сделать для обеспечения бесперебойной работы моей игры?

Ответ 1

Прежде всего, то, что вы видите в LogCat, будет отличаться от одного устройства к другому. Если вы уверены, что GC не поступает из вашего приложения, вы абсолютно ничего не можете сделать. Вы всегда найдете GC, сделав... что-то. Удостоверьтесь, что вы сохранили свой код чистым и очень легким.

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

Иногда, в некоторых относительно редких ситуациях, можно обнаружить, что конкретный GC ошибается, и ручной вызов GC может затем улучшать вещи по производительности. Это связано с тем, что на самом деле невозможно реализовать "идеальный" GC, который оптимально управляет памятью во всех случаях. Такие ситуации трудно предсказать и зависеть от многих тонких деталей реализации. "Хорошая практика" - позволить GC работать сама по себе; ручным вызовом в GC является исключение, которое должно быть предусмотрено только после того, как фактическая проблема с производительностью была должным образом засвидетельствована.

Я не считаю, что это недостаток Android <= 2.2. Это происходит на более высоких версиях? Вы протестировали его?