Вопрос

Я (все еще) пытаюсь решить проблему в моей 2D флеш-игре, из-за которой моя частота кадров падает до неприемлемо низкого уровня.У меня есть класс со следующей переменной-членом и методом:

protected var value:*;
public function getValue () :* {
    return this.value;
}

Прямо сейчас этот метод вызывается, по-видимому, несколько сотен раз за кадр, и 2,23% времени моего приложения тратится на этот метод.

Считаете ли вы, что я замечу значительное повышение производительности, сделав value типизированная переменная?Ввод этой переменной приведет к разрыву кода во всем приложении, поэтому я хотел бы быть более уверенным, что это действительно поможет.

Кроме того, вот несколько лучших записей профиля производительности для моего приложения, отсортированных по времени автономной работы, что заставило меня заподозрить это getValue() метод в первую очередь:

Method                             Calls    Self Time (ms)
------                             -----    --------------
[pre-render]                       0        2137 (19.68%)
[reap]                             0        727 (6.7%)
[enterFrameEvent]                  0        464 (4.27%)
[mouseEvent]                       0        352 (3.24%)
[mark]                             0        327 (3.01%)
State.getValue                     792356   242 (2.23%)
[verify]                           0        209 (1.93%)
[render]                           0        159 (1.46%)
CollisionManager.detectCollisions  584      156 (1.44%)
Entity.updateAllStates             30227    154 (1.42%)
Entity.getStateValue               392412   143 (1.32%)
GSVector.set y                     156244   141 (1.3%)
State.update                       659738   123 (1.13%)
Это было полезно?

Решение

Одним словом, ДА.Строгая типизация - одна из основных причин, почему AS3 работает быстрее, чем AS2 (потому что в AS2 все переменные нетипизированы, и каждый раз, когда вы ссылаетесь на нетипизированную переменную, Flash должен внутренне проверять, какого она типа).

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

На самом деле нет веских причин для использования нетипизированных переменных в AS3.Потратьте время на внесение этого изменения, и оно окупится в долгосрочной перспективе, даже если вы не увидите увеличения производительности (хотя я думаю, что вы увидите).

Другие советы

Учитывая, что вы уже используете этот профиль, почему бы вам просто не попробовать и не посмотреть?

Низкая частота кадров во флеш-играх обычно не связана с кодом.Попробуйте включить "перерисовывать области" и посмотреть, что перерисовывается в каждом кадре - вероятно, вы перерисовываете слишком много.

По теме, у вас нет причин использовать *, если только состояние также не может быть пространством имен.Все остальное наследуется от Object.Разве у ваших состояний нет общего предка или интерфейса?

Редактировать: На самом деле, теперь, когда я думаю об этом, вы часто вызываете GetValue.Предполагая, что вы звоните CollisionManager.detectCollisions один раз за кадр вы вызываете GetValue 1356 раз за кадр.

Если вы вызываете эти методы несколько раз в рамках одного метода, попробуйте получить значение один раз и сохранить его в локальной (ограниченной до функции) переменной.Вы даже могли бы передать значение в другие методы, чтобы уменьшить количество вызовов этой функции.

Во-первых, вы должны использовать типизированные переменные.Это улучшает читаемость кода, обеспечивает безопасность типов и может повысить производительность.Единственная ситуация, в которой я обнаружил необходимость использовать : *, - это когда я пишу класс collection и хочу, чтобы его можно было повторно использовать для множества разных типов (Adobe предлагает дженерики!).

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

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

Если вы можете запустить его в отладчике, поместите свой код для каждого кадра в плоский цикл и попробуй это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top