Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 3 > Как правильно рисовать быстро


Автор: Leksey 7.9.2007, 01:56
 происходит ли обновление изображения при изменении позиции спрайта? 
например мы поменяли x координату, изменения моментально отображаються?
А что тогда если у нас куча этих объектов спрайт и они все двигаються?
А может было неправильно их рисовать как отдельные спрайты, а нужно было просто у одного спрайты с помощью graphics все вручную делать?

собственно ответов на эти вопросы что-то не могу найти в интернете и в книжках.
Есть флешка с несколькими многоугольниками - их можно выбирать и перемещать и вращать. так вот после непродолжительного вращения/перемещения флешка все больше "тупит". с чем это может быть связано?

Автор: AlDev 7.9.2007, 04:53
Цитата(Leksey @  7.9.2007,  06:56 Найти цитируемый пост)
 происходит ли обновление изображения при изменении позиции спрайта? 

Это быстрее, чем перерисовать спрайт.


Цитата(Leksey @  7.9.2007,  06:56 Найти цитируемый пост)
например мы поменяли x координату, изменения моментально отображаються?

Если нет фильтров, то все достаточно быстро.


Цитата(Leksey @  7.9.2007,  06:56 Найти цитируемый пост)
А что тогда если у нас куча этих объектов спрайт и они все двигаються?

Тут лучше распределять. Иначе память перегрузится. Двигать только контейнеры, или двигать по несколько за шаг с использованием интервалов.


Цитата(Leksey @  7.9.2007,  06:56 Найти цитируемый пост)
А может было неправильно их рисовать как отдельные спрайты, а нужно было просто у одного спрайты с помощью graphics все вручную делать?

Каждый спрайт создает вместе с собой кучу всякого говна, как правило не нужного.
Если ты только рисуешь, а не добавляешь к спрайту чайлды, то лучше использовать не Sprite, а Shape. 

Разделение на спрайты это архитектурный вопрос - естественно что если у тебя мало объектов - все быстрее и память не засирается лишним. Но разобраться и модифицировать - сложнее.

Цитата(Leksey @  7.9.2007,  06:56 Найти цитируемый пост)
Есть флешка с несколькими многоугольниками - их можно выбирать и перемещать и вращать. так вот после непродолжительного вращения/перемещения флешка все больше "тупит". с чем это может быть связано? 

Скорее всего:
#1: Интервалы
#2: Где-то создаются объекты лишние
или просто все время создаются объекты.

У меня так и не получилось заметить Garbage Collector в действии. Так что советую быть очень внимательным с созданием объектов.

Автор: Leksey 7.9.2007, 13:23
Спасибо большое за подробный ответ, но все таки некоторые моменты не совсем понятны.
То что передвинуть  быстрее чем перерисовать особенно если casheAsBitmap стоит это мне понятно. 
Но я передвигаю сразу несколько объектов, и мне хотелось бы чтобы перерисовка произошла один раз после всех изменений позиций, а не при кажом перемещении одного объекта. Можно ли как нибудь запретить обновление, пока я не закончил изменение позиций всех объектов?

 Sprite насколько я понял отличаеться от Shape только наличием коллекции - заменил на Shape результаты теже.

А еще можно поподробнее про интервалы?  - я новичек во Флеше и поэтому стока вопросов задаю...

Насчет постоянно создающихся объектов. 
Вот например метод класса Vector:
Код

    public static function Subtract(u:Vector, v:Vector):Vector
        {
            var r:Vector = new Vector(u.x, u.y);
            r.Subtract(v);
            return r;    
        }

Как видно здесь сздаеться новый объект - вектор. Поскольку этот метод вызываеться достаточно большое количество раз за перерисовку/пересчет столкновений - это может быть причиной замедления работы? И этот код нужно как то переделать? ( Как же не хватает Value типов и передачи аргументов по ссылке...)    

Автор: AlDev 10.9.2007, 11:34
Аргументы (кроме базовых типов: Number, uint, int, String, Boolean) всегда передаются по ссылке.
Для базовых типов можно сделать обертки. Аля
Код

class NumberWrapper {
  public var value:Number;
  public function NumberWrapper(value:Number) {
    this.value = value;
  }
}


Цитата(Leksey @  7.9.2007,  18:23 Найти цитируемый пост)
Можно ли как нибудь запретить обновление, пока я не закончил изменение позиций всех объектов?

afaik нет.

Можно распределить вычисления - считать все блоками. При просчете блока - считать следующий блок.

Интервалы - постоянный вызов чего-либо через определенный промежуток времени.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)