Форум 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=181497)

Rembrant 25.06.2012 13:40

Тряска экрана
 
Добрый день. Занимаюсь созданием в приложении эффекта тряски экрана (от взрыва). Если ставить сдвиг координат "поля боя" просто по таймеру или энтерфрейму, на слабых компах приложение подтормаживает из-за величины этого самого поля боя.
Хотелось бы услышать мнение спецов, как лучше реализовать такой эффект с точки зрения именно производительности.

ChuwY 25.06.2012 13:46

1. Трясти битмапу со снимком чуть больше видимой облсти, например, совсем не напряжно.
Снимок можно обновлять, если важна анимация.
2. Или битмапу держать на месте, а "трясти" -- вырезая кусок с разными сдвигами и поворотами с помощью матрицы, передаваемой в Bitmapdata:draw

Rembrant 25.06.2012 14:27

Странно, почему-то битмапа даёт такой же результат. При том, что отрисовываю её только раз.

ChuwY 25.06.2012 14:40

Покажите код отрисовки и тряски, коли не слишком секретен.

-De- 25.06.2012 14:44

Скрывайте всё, кроме битмапы при тряске.

Rembrant 25.06.2012 14:50

отрисовываю и ставлю таймер:
Код AS3:

        private static var _count:uint = 4;
        private static var _view:DisplayObjectContainer;
        private static var _bitmapData:BitmapData;
        private static var _bitmap:Bitmap;
        private static var _timer:Timer;
 
        public static function doShake(view:DisplayObjectContainer):void
        {
                _view = view;
                _bitmapData = new BitmapData(stageWidth, stageHeight, true, 0xFFFFFF);
                _bitmapData.draw(_view);
                _bitmap = new Bitmap(_bitmapData);
                _view.parent.addChild(_bitmap);
                _view.visible = false;
 
                _timer = new Timer(50, _count);
                _timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);
                _timer.start();
        }

и двигаю по таймеру:
Код AS1/AS2:

        private static function timerHandler(event:TimerEvent):void
        {
                if (_timer.currentCount == _count)
                {
                        _view.parent.removeChild(_bitmap);
                        _view.visible = true;
                        return;
                }
 
                if (_timer.currentCount % 2 != 0)
                        _bitmap.y -= 20;
                else
                        _bitmap.y += 20;
        }

вот и всё.

ChuwY 25.06.2012 15:43

Странно. Это должны быть НУ УЖ ОЧЕНЬ слабые машины, чтобы затормозить от такой операции.
Может, вызываете doShake чаще, чем кажется или где-то еще утекает?
Очень быстрый способ это BitmapData:copyPixels.
Для такой простоя тряски подойдет.
Сохраняете исходную битмапку и на каждом кадре строгаете новую.
Ну или можно отрисовать две и менять их у битмапы.

-De- 25.06.2012 15:52

А если битмапу не добавлять, тормоза уйдут?
И у вас оно трясётся тольько 4 раза - это довольно мало. А отрисовка в битмапу и удаление/добавление старого - вообще-то ёмкая операция. Попробуйте тряхнуть раз 100. Если будет трястись энергичнее - видно для 4-й трясок способ плохой %)

Rembrant 25.06.2012 16:21

ChuwY, машина не слабая, но есть возможность разворачивать приложение на весь экран. Вот тогда на мониторе 1600*900 особенно заметно. И даже если я оставляю 4 встряски, за это время происходит анимация, то есть мне нужно перерисовывать битмапу каждый раз, и copyPixels не прокатят.

-De-, да, тогда тормоза уйду. Если трясти 100 раз, эффект тот же, или даже чуть лучше.


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

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