2015-06-30 2 views
1

Я создаю Android-игру с OpenGLES 2.0, и моя игра в настоящее время может отображать до 55-60 кадров в секунду, но у меня есть небольшая проблема с Garbage Collector, она замедляется до 35 кадров в секунду , и вы можете увидеть задержку, которая повредит пользователю. Он работает в совершенно случайных моментах.

Мой вопрос:

Можно ли каким-то образом контролировать исполнение сборщика мусора, например, я могу задержать GC для 0,5с или позвоните по телефону GC до и быть уверенным, что GC не будет называться в ближайшие два секунду? Или есть ли способ уменьшить влияние GC на выполнение приложения?Java-сборщик мусора

ответ

1

Вы не можете влиять на GC слишком многими способами. Он будет работать, когда ему придется (и когда он решит, что он хочет).

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

2

В принципе, вы не можете остановить GC, но вы можете заставить вызова с помощью System.gc()

попробовать these шаги, чтобы избежать таких проблем с GC

+0

Но я могу быть уверен, что Java не будет вызывать GC после моей силы вызова (например, 2-3 s)? – encrypt

+0

, мы не можем прийти к заключению, что это может вызвать GC немедленно или даже после 5 секунд, то есть позаботится Java –

2

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

Лучший способ работы - уменьшить количество новых объектов, повторно использующих старые.

Прочтите свой код, и каждый раз, когда вы видите ключевое слово new, спросите себя Мне действительно нужен новый объект здесь? Или я могу сбросить старый неиспользуемый объект?

Попробуйте прочитать советы в разработчиков андроида сайте http://developer.android.com/training/articles/perf-tips.html

Примечание: вызов System.gc() это просто предложение для системы сбора мусора, который автоматически выбирать, когда работать. От Javadoc «Вызов этого метода предлагает, что виртуальная машина Java затрачивать усилия в направлении утилизации неиспользуемых объектов ...»

+0

Означает ли это, что вызов 'System.gc()' непосредственно перед тем, как важная часть игры не хороша идея? – encrypt

+0

Вы не уверены, что сборщик мусора вызывается, когда вы его спрашиваете. Лучший способ программирования игры - это оживить необходимость сбора мусора. Лучше всего использовать объекты повторного использования, а не создавать новые. Вызов System.gc() иногда может быть плохим выбором. –

+0

ОК, но, пожалуйста, проверьте этот сценарий: Например, у меня есть игрок и несколько врагов на экране (я не знаю, например, 5-10 врагов), и в одно мгновение появляются новые враги и присоединяются к другим. Лучше ли создавать дополнительных врагов до начала игры (хотя они не видны на экране, OpenGL должен нарисовать их каждый кадр) или создать объект, когда мне нужно его использовать. Я знаю, что трудно сказать, что является лучшим вариантом, но я хочу знать, что является лучшей стратегией программирования? – encrypt

Смежные вопросы