|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
[+4 06.05.14]
|
Об оптимизации графики(растр/вектор) и анимаций
Коллеги вот такой вопрос к игроделам, которые собаку на этом съели, что будет быстрее работать. У самого очень мощный комп, и тесты провести сложновато.
Рендерим 100 кадров 3д анимации, просто тупо 100 картинок, размером от 100*100 до 300*300 например. Загоняем во флеш. Запускаем таймер на 50-100 мс 1) Мы добавим сразу все 100 картинок в спрайт и будем менять visible по очереди. 2) Мы будем делать addChild/removeChild 3) До импорта, создаем одну большую битмапу как спрайтшит ( получается если 100 картинок по 300 (10х10) , 3000 * 3000 битмапка) добавляем ее и под маской меняем x-y битмапки 4) Аналогично пунтк 3, только добавляем одну битмапку 300*300 и потом методом draw из большой получаем bitmapData которую скармливаем этой битмапке. 5) ваш варинат Какой из варинатов будет самым шустрым? ( мне кажется 1й будет быстрее, так как мы сразу забиваем память нужным кол-вом, и держим ее пока анимируем, чем например посл варинат, так как каждые 50 мс делать draw будет напрягать проц еще, - но могу сильно ошибаться ) -------------- Отдельный вопрос по шейпам (статика). Допустим мне надо зарисовать ( программно ) 1000 шейпов, различные фигуры. Будет ли правильным после такой зарисовки, сделать draw общего контейнера и добавить как одну битмпаку, а зарисованные шейпы просто удалить, заодно вписав их в null ?
__________________
Марк Tween |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
5)Загнать большую битмапдату в Bitmap и выставить ей scrollRect.По идеи это оптимизированный метод как раз для таких задач.
Цитата:
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
draw() медленный, самым шустрым считается copyPixels().
__________________
Reality.getBounds(this); |
|
|||||
[+4 06.05.14]
|
Цитата:
Цитата:
__________________
Марк Tween Последний раз редактировалось in4core; 04.03.2018 в 22:51. |
|
|||||
Lorem ipsum
|
А если сделать массив из 100500 экземпляров BitmapData и при каждой итерации bitmapData одной единственной Bitmap будет ссылаться на текущий кадр?
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
Думаю copyPixels и scrollRect дадут одинаковые результаты, но у copyPixels оверхед по памяти меньше. Тесты никто за тебя делать не будет. |
|
|||||
[+4 06.05.14]
|
Цитата:
__________________
Марк Tween |
|
|||||
Каждый кадр отрисовать в отдельную битмапдату, кинуть их все в массив. Дальше в одной bitmap менять битмапдату на значение из массива. Чем плох этот способ по сравнению с маской и скроллом?
Добавлено через 6 минут Пример кода 5-ти летней давности, нарезает длинную .png c кадрами на битмадаты и затем проигрывает их. package engine.graphic { import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.TimerEvent; import flash.geom.Point; import flash.geom.Rectangle; import flash.utils.Timer; /** * ... * @author Bletraut */ public class AnimatedBitmap extends Bitmap { private var _currentFrame:uint = 0; private var _totalFrames:uint = 0; private var _frameSize:Rectangle = new Rectangle(0, 0, 0, 0); private var _animationTimer:Timer; private var _animationDelay:Number = 100; private var ON_PLAY:Boolean = true; private var ON_PAUSE:Boolean = false; private var _framesCache:Vector.<BitmapData> = new Vector.<BitmapData>(); // Set & Get public function get currentFrame():uint { return _currentFrame; } public function get totalFrames():uint { return _totalFrames; } public function get frameSize():Rectangle { return _frameSize; } public function get animationDelay():Number { return _animationDelay; } public function set animationDelay(n:Number):void { if (ON_PAUSE) return; _animationDelay = n; if (_animationTimer.hasEventListener(TimerEvent.TIMER)) _animationTimer.removeEventListener(TimerEvent.TIMER, onTick); _animationTimer = new Timer(_animationDelay); _animationTimer.addEventListener(TimerEvent.TIMER, onTick); if (ON_PLAY) _animationTimer.start(); } public function AnimatedBitmap(bitmapData:BitmapData, frame:Rectangle) { super(null, "auto", false); _frameSize = frame; createCache(bitmapData, _frameSize); _animationTimer = new Timer(_animationDelay); _animationTimer.addEventListener(TimerEvent.TIMER, onTick); _animationTimer.start(); ON_PLAY = true; } public function play():void { if (ON_PAUSE) return; ON_PLAY = true; _animationTimer.start(); } public function stop():void { if (ON_PAUSE) return; ON_PLAY = false; _animationTimer.stop(); } public function pause():void { if (ON_PAUSE) { if (ON_PLAY) _animationTimer.start(); ON_PAUSE = false; } else { var f:Boolean = ON_PLAY; this.stop(); ON_PLAY = f; ON_PAUSE = true; } } public function gotoAndPlay(frame:uint = 0):void { if (frame >= _totalFrames || ON_PAUSE) return; _currentFrame = frame; this.bitmapData = _framesCache[_currentFrame]; this.play(); } public function gotoAndStop(frame:uint = 0):void { gotoAndPlay(frame); this.stop(); } private function onTick(e:TimerEvent):void { _currentFrame = (_currentFrame + 1 < _totalFrames) ? _currentFrame + 1 : 0; this.bitmapData = _framesCache[_currentFrame]; } private function createCache(src:BitmapData, frame:Rectangle):void { var w:int = Math.floor(src.width / frame.width); var h:int = Math.floor(src.height / frame.height); for (var i:int = 0; i < h; i++) { for (var j:int = 0; j < w; j++) { var b:BitmapData = new BitmapData(frame.width, frame.height, true, 0x000000); b.copyPixels(src, new Rectangle(j * frame.width, i * frame.height, frame.width, frame.height), new Point(0, 0)); _framesCache.push(b); } } _totalFrames = _framesCache.length; } } }
__________________
Я заклинаю вас действовать иначе. Последний раз редактировалось Bletraut; 05.03.2018 в 01:34. |
|
|||||
Пример портянки с кадрами
__________________
Я заклинаю вас действовать иначе. |
|
|||||
Для одинаковых объектов можно создать глобальный массив с кадрами-битмапдатами, но возможно для этого уже есть отдельная оптимизация в самом ФП, я не проверял.
__________________
Я заклинаю вас действовать иначе. |
Часовой пояс GMT +4, время: 07:07. |
|
« Предыдущая тема | Следующая тема » |
|
|