![]() |
|
||||||||||
|
|||||
|
В общем ситуация такая, есть мобильный проект на Box2D, в нем есть шар - снаряд, который управляется физикой. Решил применить к нему вот этот эффект, естественно пример приведенный там, перевел на ООП, получился такой класс:
/** * http://www.FreeActionScript.com **/ package effects { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BlurFilter; import flash.geom.ColorTransform; import flash.geom.Point; import flash.geom.Rectangle; import game.*; public class BlittTrailer extends Sprite { // canvas bitmap data var private var canvasBitmapData:BitmapData; // canvas bitmap - this will be added to the display list private var canvas:Bitmap; // canvas rectangle - used to save canvas size private var canvasRect:Rectangle; // circle (trailer) bitmap data private var circleBitmapData:BitmapData; // circle rectangle - used to save canvas size private var circleRect:Rectangle; // color transformer - used to make cavas transparent private var colorTransform:ColorTransform; private var _parent:DisplayObjectContainer; private var _ball:BallActor; public function BlittTrailer(parent:DisplayObjectContainer, ball:BallActor) { _parent = parent; _ball = ball; init(); } public function init():void { // create main canvas bitmap data canvasBitmapData = new BitmapData(Main.screenX, Main.screenY, true, 0x333333); canvas = new Bitmap(canvasBitmapData); _parent.addChild(canvas); canvasRect = canvasBitmapData.rect; // create circle trailer bitmap data circleBitmapData = new BitmapData(10, 10, true, 0xFFFFFF); // draw CircleTrailer movieclip, linked from library, inside circle bitmap data circleBitmapData.draw(new CircleTrailer()); // save circle rectangle size circleRect = canvasBitmapData.rect; // create ColorTransformer to modify alpha of bitmap colorTransform = new ColorTransform(); // (make it 99% transparent) colorTransform.alphaMultiplier = .99; } public function removeTrailer():void { _parent.removeChild(canvas); } public function render():void { // lock bitmap data to prevent display from updating while we modify it canvasBitmapData.lock(); // change alpha canvasBitmapData.colorTransform(canvasRect, colorTransform); // draw circle canvasBitmapData.copyPixels(circleBitmapData, circleRect, new Point(_ball.ball.x - 5, _ball.ball.y - 5), null, null, true); // apply blur filter canvasBitmapData.applyFilter(canvasBitmapData, canvasBitmapData.rect, new Point(0, 0), new BlurFilter(8, 8)); //3, 3 // unlock bitmap data canvasBitmapData.unlock(); if (!_ball.ball.stage) _parent.removeChild(canvas); } } } Добавлено через 41 секунду И да - аппаратное ускорение пока не используется. Добавлено через 14 минут Сейчас попробовал включить абсолютно ничем не помогло, только некоторые фильтры слетели((( |
|
|||||
|
А битмпаДата сильно большая?
Первое, что врезалось в глаза, это постоянное создание фильтра blur. Лучше создайте его отдельно, а потом применяйте. И некоторые точки тоже можно создать и использовать по кругу. |
|
|||||
|
битмапДата 480 х 800, за подсказку с фильтром спасибо, не углядел, но ситуацию это не сильно изменило, фпс все равно около 10 - 15
Добавлено через 58 секунд попробую уменьшить размер битмапдаты, может это выправит ситуацию |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Воспользуюсь моментом и задам вопрос, который меня волнует с того момента, как я впервые увидел вот эти эффекты от Starling - их в обычных проектах использовать можно?
|
|
|||||
|
[+4 06.05.14]
|
PainKiller сам писал такой эффект недавно, просто поиграться. Производительность на уровне, даже на очень слабых машинах, выдает макс фпс.
Вот как я делал его, просто костяк. Если будет нужно, буду на работе выкину фул вершн, с эффекторами и т.п. : package com.in4core.utils { import com.greensock.TweenMax; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.DisplayObject; import flash.display.Stage; import flash.events.MouseEvent; /** * ... * @author in4core progression lab */ public final class FlexObject { static private var _flexBitmapData:BitmapData; static private var _stage:Stage; public function FlexObject() { } public static function setInParams(stage:Stage , lifeTime:int = 50):void { _stage = stage; } public static function startFlex():void { _stage.addEventListener(MouseEvent.MOUSE_MOVE , onMove); } static private function onMove(e:MouseEvent):void { var bmp:Bitmap = getMouseFlexBitmap(); _stage.addChild(bmp); bmp.x = e.localX - bmp.width / 2; bmp.y = e.localY - bmp.height / 2; var randX:Number = Math.random() * 160 - 80; var randY:Number = Math.random() * 160 - 80; TweenMax.to(bmp, 1 , { alpha:0 , x:bmp.x + randX , y:bmp.y + randY , scaleX:3 , scaleY:3, blurFilter: { blurX:4 , blurY:4 } , onComplete:removeTarget , onCompleteParams:[bmp] } ); } static private function removeTarget(target:Bitmap):void { _stage.removeChild(target); } public static function createFlex(obj:DisplayObject):void { _flexBitmapData = new BitmapData(obj.width, obj.height, true, 0); _flexBitmapData.draw(obj); } private static function getMouseFlexBitmap():Bitmap { return new Bitmap(_flexBitmapData); } } }
__________________
Марк Tween |
|
|||||
|
Спасибо, попробую этот вариант + на работе пройдусь по проекту скаутом, о результатах отпишусь.
Добавлено через 2 часа 45 минут К сожалению у меня нет возможности подрубиться к скауту с мобильного через вайфай, поэтому смотрел с настольного ПК, запуская приложение в айр дебаг лончере. Итог таков - ф-ция render выполняется за 60 мс, львиную нагрузку в ней выполняют canvasBitmapData.colorTransform(canvasRect, colorTransform); canvasBitmapData.applyFilter(canvasBitmapData, canvasBitmapData.rect, new Point(0, 0), new BlurFilter(8, 8)); колортрансформ вынес в ф-цию init, скорость функции render возросла до 8 мс, но при запуске на мобиле никакой разницы я не ощутил. Придется попробовать версию in4core, хотя че то я на нее смотрю и у меня сомнения берут, что она будет более производительной, твинить блер-фильтры это ресурсоемко. Последний раз редактировалось PainKiller; 30.12.2013 в 13:10. |
|
|||||
|
[+4 06.05.14]
|
Не знаю, глубокие тесты не проводил, но как показывает практика твинМакс довольно быстрый, ну и да естественно нужно сделать контейнер для битмапок и туда пихать, а не на стейдж как в примере я показал.
__________________
Марк Tween |
|
|||||
|
Цитата:
|
|
|||||
|
Именно после своих сомнений, я проверил и - не работает)
А как же оно может срабатывать, если строчка выполниться только один раз в методе init? Ведь надо постоянно применять colorTransform к canvasBitmapData. Ну ладно, чудеса да и только. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|