![]() |
Глобальный Enter Frame
Как лучше реализовать ентерфрейм, чтоб была возможность добавлять функции в которых есть анимация. Сделал так, но мне кажется это медленно:
Код AS3:
|
Да вроде нормально. Именно перебор сильно не улучшить. Можно for .. in попробовать, можно сделать список вместо вектора (как бонус вставка/удаление быстрее), но до 1000 длины вектора нереально разницу увидеть. Можно написать функцию удаления - это даст повод подумать над Dictionary вместо или вместе с вектором.
|
Цитата:
|
каждую анимацию имплементить от интерфейса с function Tick():void;, например.
создание анимации проводить в какой-нибудь AnimationSystem, которая будет получать игровой Tick от игрового мира World, скажем. Собирать анимации в Vector.<Animation>(); Код AS3:
|
А вот это всё каждый фрейм происходит?
Код AS3:
|
Цитата:
А сам перебор (сравнение i <, инкремент i++, обращение к элементу массива) - ни как не больше времени и памяти жрёт чем непосредственный вызов всех функции Tick() Т.е. это не место для оптимизаций. Где место для оптимизаций? Это удаление функции могло бы быть, но у Вас просто нет такого метода :) Цитата:
Код AS3:
|
Цитата:
Добавлено через 8 минут Интересно, что быстрей такой подход как Frost47rus написал где будут через интерфейс дёргаться методы или как у меня с передачей всего метода в ентерфрейм или это совсем не важно что так, что так? |
Разве for..in не намного медленней, чем другие циклы?
|
так, нужно будет сделать класс который измеряет скорость работы отдельных кусков кода(но это уже другая история), действительно for each ведь медленее while, но используя for each в данном случае стают не нужными private var _funcCount:int = 0; private var _oldFuncCount:int = 0; и все манипуляции с ними отпадают.
В общем-то почти всё что хотел - узнал, так как по любому прийдётся перебирать вектор с анимациями каждый кадр то моё решение удовлетворяет. |
Цитата:
если удаление функции происходит внутри другой или той же вызываемой функции (хотя предыдущий подход тоже не спасёт ситуацию) Цитата:
Тут народ пытался определить что же лучше (с переменным успехом): http://stackoverflow.com/questions/1...ce-in-as3-flex Цитата:
Пользуйтесь переменными. Вот пример без foreach, если религия не позволяет: Код AS3:
Код AS3:
|
ну как же? Тут бесконечно будут создаваться переменные итераторы 60 раз в секунду
Код AS3:
Цитата:
Код AS3:
|
Может так попробовать?
Код AS3:
|
В свое время мне показался более простым и очевидным другой вариант. Класс таймера наследовался от EventDispatcher. Он так же имел методы start(), stop(), reset(). Сам таймер был 2-в-1: он посылал как ENTER_FRAME в каждом кадре, так и TIMER каждую секунду (ну мне секунды было достаточно). При этом таймер корректно отрабатывал незавершенную секунду при последовательном вызове методов stop() и start().
Все, кто заинтересован в кадрах или секундах, просто получали ссылку на этот глобальный таймер и вешали на него слушатель. А уже по месту решалось, что делать в обработчике, который, к примеру, уже таки мог пробежаться по сотне объектов и передвинуть их. Ну т.е. антиглобалистский такой подход =) |
Цитата:
4 байта, на стеке, будет создаваться 60 раз в секунду. Какой ужас! При чем место на стеке и при взятии значения поля(не переменной), если не ошибаюсь, тоже выделяется. Завязывайте с придумыванием себе проблем. Об этих 4-х байтах даже GC не знает - они автоматом после отработки функции сносятся. Или, по-крайней мере, прочитайте доки по работе виртуальной машины, структуре байткода, посмотрите во что компилируется тот или иной код, а уже потом придумывайте себе что и когда будет тормозить. Вот что может создать проблемы, т.к. память выделяется на куче, с последующей сборкой GC и прочими прелестями (но не в вашем случае - 60 раз в секунду выделить память под Point - это фигня на постном масле): Код AS3:
Код AS3:
Код AS3:
Цитата:
Код AS3:
Кстати, тут и с добавлением функции внутри функции те же проблемы будут. Это типичная проблема для всяких самописных Signal-ов и EventDispatcher-ов (в стандартном, вроде, решена) Если Вы уверены - что внутри слушателя не будете никого подписывать/отписывать - можете забить. |
| Часовой пояс GMT +4, время: 03:22. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.