2011-01-07 4 views
5

Я работаю над игрой для Android и отлаживаю ее на своем N1. Сначала производительность была неоднородной. Затем я работал над очисткой всех распределений, чтобы предотвратить сбор мусора. Это значительно улучшило ситуацию, но я все еще видел некоторые коллекции мусора, которые вызывали очень короткие паузы в анимации.Разработка игр для Android и сборка мусора

После вытягивания волос на некоторое время, я заметил, что идентификаторы процессов, которые делали сборку мусора (GC_FOR_MALLOC), не были моим идентификатором процесса. Идентификаторы процессов принадлежали «Android-системе» и android.process.acore (определяется с помощью приложения «Android System Info» с рынка). Процесс acore был привязан к настольному виджету, называемому цифровыми часами. Я удалил виджет и почти сделал его через всю игру без каких-либо пауз. Была одна очень короткая пауза для GC для «Android-системы».

Извините за длинное объяснение, но теперь мои вопросы:

  1. Как это, что другие игры не иногда имеют пауз из-за системного процесса в GC (что-то из-под контроля разработчика)?
  2. В соответствии с первым вопросом, как я могу работать с другим приложением, вызывающим GC, которое замедляет мой процесс и вызывает икоту в моей игре?

Я просто чувствую, что что-то мне не хватает, поскольку в других играх нет этой проблемы.

Thanks

+1

Если ваше приложение чувствительно к сборщику мусора, вы делаете это неправильно. – Falmarri

+0

Возможно, вам повезло на http://gamedev.stackexchange.com/ для конкретных вопросов игры. Я не уверен, что есть простой ответ на этот вопрос. Вы не можете предотвратить gc, просто скройте их. 2.3 включает в себя одновременный gc, но это не поможет вам, если вы хотите настроить таргетинг на более ранние платформы. –

ответ

3

Уменьшить частоту отсчета вашей игры? Возможно, он использует 100% процессора, поэтому все остальное, что потребляет процессор, заставит его отстать. Эти устройства не так быстро, как ваш обычный ПК. Вы также можете посмотреть, как уменьшить процессор, необходимый для создания каждого кадра, чтобы частота кадров была достаточно высокой, чтобы быть плавным.

+0

Вы пригвоздили его точно. Моя игра использовала 100% -ный процессор. Самое важное, что я сделал, чтобы исправить это, - это изменение способа рисования фона для прозрачности процесса (функция ниже). Оттуда сразу же упал мой CPU. Когда процессор не был привязан, я никогда не замечал сборку мусора. thx – Steve0212

+0

Немного поздно на вечеринку, но у меня есть аналогичная проблема. Как вы на самом деле используете менее 100% процессора, кроме просто спать в конце каждого кадра? И какой инструмент вы используете для измерения использования ЦП? Кроме того, прозрачность/отсутствие прозрачности действительно является пользователем GPU, а не процессором? Благодаря! – Tenfour04

+0

@ TenFour04: почти по определению вы используете меньше CPU, следя за тем, чтобы сделать как можно меньше работы. Иногда это означает использование другого формата изображения (альфа стоит дорого, особенно если у вас есть дерьмовый графический процессор или вообще нет), иногда это означает сохранение ссылки на материал, поэтому вам не нужно каждый раз искать его ... иногда это означает ожидание, пока вы не знаете, что вам нужно что-то сделать, прежде чем вы это сделаете. Специфические особенности меняются, но все это сводится к «не тратить процессорные циклы». О, и спать - это хорошо - если все сделано хорошо, он поддерживает скорость кадров относительно стабильно. – cHao

0
private static Bitmap GetNonTransparentBitmap(int Id) { 
    // no transparency 
    Drawable tmp = myContext.getResources().getDrawable(Id); 

    Bitmap retval = Bitmap.createBitmap(tmp.getMinimumWidth(), tmp.getMinimumHeight(), Bitmap.Config.RGB_565); 
    Canvas canvas = new Canvas(retval); 
    tmp.setBounds(0, 0, tmp.getMinimumWidth(), tmp.getMinimumHeight()); 
    tmp.draw(canvas); 
    return retval; 
} 
Смежные вопросы