Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Производительность 2D приложений под Android на AIR (http://www.flasher.ru/forum/showthread.php?t=175818)

PlutDem 24.02.2012 20:34

Производительность 2D приложений под Android на AIR
 
Наблюдаю очень низкую производительность на HTC Desire S ARM7. При перемещении и повороте 500 спрайтов выдает 5-10 фпс. Нормально ли это? Если нет то как можно улучшить производительность?
Код AS3:

package 
{
        import flash.desktop.NativeApplication;
        import flash.display.Shape;
        import flash.events.Event;
        import flash.geom.Matrix;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.text.TextField;
        import flash.ui.Multitouch;
        import flash.ui.MultitouchInputMode;
        import flash.utils.*;
 
        [SWF(width = "480", height = "800", backgroundColor = "#ffffff")]
        /**
        * ...
        * @author PlutDem
        */

        public class Main extends Sprite
        {
                public var lastfrTime:Number;
                public var cirks:Array = new Array;
                public var textf:TextField = new TextField;
                public function Main():void
                {       
                        addChild(textf);
                        for (var i:int; i < 500; i++){
                                cirks[i] = new Sprite;
 
                                cirks[i].graphics.lineStyle(1);
                                cirks[i].graphics.beginFill(0xdddddd,1);
                                cirks[i].graphics.drawRect(30, 0, 10, 50);
                                addChild(cirks[i]);
                                cirks[i].x = i;
                                cirks[i].y = i;
                        }
 
                        addEventListener(Event.ENTER_FRAME, ojbup);
                        addEventListener(Event.ENTER_FRAME, frlistener);
 
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
                        stage.addEventListener(Event.DEACTIVATE, deactivate);
 
                        Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
 
                        stage.frameRate = 30;
                }
 
                public function ojbup(e:Event):void {
 
                        for (var i:int; i < 500; i++){
 
                                cirks[i].x += 1;
                                cirks[i].y += 1;
                                cirks[i].rotation += 5;
                        }
 
                }
                public function frlistener(e:Event):void {
                        var now:Number = getTimer();
                        var elapsed:Number = now - lastfrTime;
                        var frPerSecond:Number = Math.round(1000/elapsed);
                        lastfrTime = now;
                        textf.text = ""+frPerSecond;
 
 
 
                }
 
                private function deactivate(e:Event):void
                {
                        // auto-close
                        NativeApplication.nativeApplication.exit();
                }
 
        }
 
}


Astraport 24.02.2012 21:07

А чем не устраивает 30 FPS? Для мобил вполне нормально.

http://help.adobe.com/en_US/as3/mobi...ng_content.pdf
http://blog.newmovieclip.com/2010/11...on-on-android/
http://sierakowski.eu/list-of-tips/8...roid-game.html
http://www.indieflashblog.com/unders...or-mobile.html

PlutDem 24.02.2012 21:19

Цитата:

Сообщение от Astraport (Сообщение 1065270)

Меня не устраивает столь малое количество спрайтов, способное находиться на экране без ущерба производительности (30 фпс). Ожидал, хотя бы 500 спрайтов, но AIR захлебывается уже на 150.

Astraport 24.02.2012 21:21

Растируйте

PlutDem 24.02.2012 21:29

Цитата:

Сообщение от Astraport (Сообщение 1065275)
Растируйте

Это не поможет. Если бы были сложные векторные объекты, то это дало бы ощутимый прирост, а тут...:( сотня жалких шейпов, их растрирование только еще больше понизит производительность.

Astraport 24.02.2012 21:38

Я не пойму. Вы задаете в коде frameRate = 30 - получаете 30 FPS.
Что не устраивает?

Добавлено через 9 минут
Проверил ваш код на Гэлекси II
ФПС начал падать только после 400. И не ниже 25. Но плавность движения все равно остается нормальной.

Zebestov 24.02.2012 21:50

Цитата:

Сообщение от PlutDem (Сообщение 1065277)
...сотня жалких шейпов, их растрирование только еще больше понизит производительность.

Можно узнать, откуда такие идеи?
Рекомендую попробовать.

PlutDem 24.02.2012 21:52

Цитата:

Сообщение от Astraport (Сообщение 1065278)
Я не пойму. Вы задаете в коде frameRate = 30 - получаете 30 FPS.
Что не устраивает?

Виноват, некорректно представил проблему. При 500 спрайтах фпс где около 5-10. Если их растрировать и включить GPU, то фпс будет уже около 20-22, но увы не 30.

Astraport 24.02.2012 22:19

Попробуйте вместо Sprite - Shape, если получится, должно дать прирост производительности примерно на 50%.

Добавлено через 7 минут
Попробовал для каждого спрайта.
Код AS3:

var matrix:Matrix = new Matrix(); 
cirks[i].cacheAsBitmapMatrix = matrix;
cirks[i].cacheAsBitmap = true;

Значительно хуже чем без кэширования. ФПС упало до 5.
Может нужно как-то по другому делать?

PlutDem 24.02.2012 22:27

Цитата:

Сообщение от Astraport (Сообщение 1065283)
Попробуйте вместо Sprite - Shape, если получится, должно дать прирост производительности примерно на 50%.

Тест синтетический, в реальном приложении будут использоваться спрайты.:(


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

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