Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как можно повысить производительность отрисовки? (http://www.flasher.ru/forum/showthread.php?t=121025)

Kolan 05.02.2009 17:34

Как можно повысить производительность отрисовки?
 
Здравствуйте!

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

Проблема в том, что курсор ездит по поверхности, которая довольно часто перерисовывается. Там расположено три графика (по 1000 точек), которые могут перерисовываться раз в каждые 100мс + сверху графиков могут быть другие мувиклипы, положение которых также меняется каждые 100мс.

При такой перерисовке мой курсор начинает нещадно отставать от настоящего. Отстает на несколько сантиметров.

Есть ли способ ускорить отрисовку курсора?

И еще. Как я понимаю такие методы как lineTo, moveTo ничего не рисуют, а просто добавляются в очередь. Как можно засечь сколько занимает сама отрисовка?

etc 05.02.2009 17:43

updateAfterEvent

Kolan 05.02.2009 23:01

__etc, правильно ли я понял, то вы имели ввиду метод экземпляра класса MouseEvent (хотя такой же есть еще у KeyboardEvent и TimerEvent)? И, если это так, то я должен вызывать этот метод после изменения координат моего курсора.

Правильно понял?

PS
Кстати, я пробовал заменить ручное присвоение координат на startDrag(), то есть в этом случае перемещением управляла сама среда, и эффект был такой же.

А какие есть средства профилировани для флеша?

etc 05.02.2009 23:17

Подпишитесь на событие MOUSE_MOVE, в нём вызывайте метод updateAfterEvent у пришедшего события.

Gaen 05.02.2009 23:31

Мне в голову пришла адская идея, мб поможет. Сделайте буферизацию!

Как я себе это представляю:

Имеется спрайт, который на сцене не лежит. В этом спрайте рисуются графики, причём не одним куском, а по частям, с распределением во времени. Т.е. например если нужно рисовать 1000 точек каждые 100мс, рисуется по 100 точек каждые 10мс. Это позволит более равномерно распределить нагрузку по времени. Когда график в спрайте нарисован полностью, он отрисовывается в битмап, который лежит на сцене.

Ещё можно попробовать написать рисование графиков в растре, BitmapData.lock() в помощь. Но тут я не знаю, будет ли оно работать быстрее.

BlooDHounD 06.02.2009 01:10

GAIKER, а может проще использовать updateAfterEvent?

Kolan 06.02.2009 11:34

__etc, с updateAfterEvent стало заметно быстрее, только вот от курсора стали оставаться «запчасти»:
http://img-fotki.yandex.ru/get/3209/...d1ff5604_L.jpg

Причем это происходит, когда прорисовка подложки, о которой я говорил в сабже, не делается вообще.

Как можно избав иться от «запчастей»? И самое главное, откуда они берутся?

etc 06.02.2009 12:26

Ну это надо вас спросить, откуда они берутся.

Gaen 06.02.2009 13:07

BlooDHounD, если проц загибается, то updateAfterEvent не поможет. Или я чего-то не понимаю? :)

Kolan 06.02.2009 14:07

__etc, я с этим курсором кроме изменения координат ничего не делаю.

Вот весь код маус мува:
Код AS3:

private function onMouseMove(e:MouseEvent):Void 
        {               
                var p: Point = globalToLocal(new Point(e.stageX, e.stageY));
                _mouseCursor.xPos = p.x;
                _mouseCursor.yPos = p.y;
 
                /*Заставить флеш перерисоваться.
                * Это позволит курсору двигаться заметно быстрее.*/

                e.updateAfterEvent();
        }



Часовой пояс GMT +4, время: 21:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.