Форум 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%.

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

Zebestov 24.02.2012 23:25

Вообще это немного странно. Иметь на руках пока еще низкую производительность платформы, не делать ничего для оптимизации процесса, и при этом требовать хорошего FPS.
Во-первых использовать исключительно Bitmap. Во-вторых, если это возможно, кэшировать все положения при вращении с определенным шагом. Другими словами — никакой кучи интерактивных DO, никаких трансформаций.

Astraport 25.02.2012 17:45

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

Es – суббота, 25 февраля 2012 г. в 15:08 LG Pecan (pecan) Версия 1.1.8 русский
Фигня с адоб аир. Так же не позволяет запустить без адоба. Уже замудохалась((

Анна – вторник, 21 февраля 2012 г. в 23:26 HTC Wildfire (buzz) Версия 1.1.8 русский
Не работает на HTC wildfire! После установки требует установить Adobe air, а ее не возможно установить - пишет, что не поддерживается на моем устройстве. Жаль, идея прогибается классная!

И даже при этом люди не ставят 1, а в среднем положительные оценки, пишут письма, хотят пользоваться программой и такой облом:( Так что кроссплатформенности нормальной нет у Air.

Добавлено через 2 минуты
Я хотел в блоге написать большую статью про разработку под Андроид, но сейчас передумал. Пока не стоит точно.

Добавлено через 13 минут
Ещё хотел спросить. Может быть есть возможность где-то скачать APK с разными версиями AIR для Андроид? Они же часто обновляются.

Хоть дать возможность пользователям проверить - вдруг какая-нибудь версия запустится.

Zebestov 25.02.2012 17:59

Astraport, ты сейчас говоришь об Air приложениях, упакованных в формат .apk?

Astraport 25.02.2012 18:00

Я говорю об приложении Adobe AIR https://market.android.com/details?id=com.adobe.air
Оно глючит у многих, хотя соответствует модели телефона.

Zebestov 25.02.2012 18:06

Если я не ошибаюсь, с некоторых порт Air приложения для Androida теперь идут как и для iOS — без необходимости устанавливать Adobe Air.

Astraport 25.02.2012 18:17

Кажется это только для десктопов, про Android не слышал. Но даже, если это и так у меня приложение весит 16 Мб, а защищенное маркетом 32 Мб. Итак все что можно сжимаю, выкидываю. Если в дистрибутив вложить ещё Air, то это не менее 7 Мб приплюсуется. Не каждый имеет Wi-Fi.

Добавлено через 1 минуту
Да и вообще, какая разница? Это же тот же Air который глючит у юзера, но только под моей упаковкой. Также сначала будет ставиться он и также глюкнет.

Zebestov 25.02.2012 18:41

Цитата:

Сообщение от Zebestov (Сообщение 1065406)
...Air приложения для Androida теперь идут как и для iOS — без необходимости устанавливать Adobe Air.

Цитата:

Сообщение от Astraport (Сообщение 1065415)
Кажется это только для десктопов

Ты вообще читаешь комментарии?

Цитата:

Сообщение от Astraport (Сообщение 1065415)
Да и вообще, какая разница?

Очевидная.
Цитата:

Сообщение от Astraport (Сообщение 1065415)
Это же тот же Air который глючит у юзера, но только под моей упаковкой. Также сначала будет ставиться он и также глюкнет.

Сначала проверь (приведи уже имеющийся пример), затем утверждай.

Astraport 25.02.2012 18:54

Цитата:

Ты вообще читаешь комментарии?
Спокойнее. Поискал - это действительно возможно для Андроид.
Цитата:

Сначала проверь (приведи уже имеющийся пример), затем утверждай.
Возможно и рискну.

Добавлено через 29 минут
Кстати:
Export application with embedded AIR runtime Select this option if you want to embed the AIR runtime within the APK file while exporting the application package. Users can then run the application even on a device that does not have AIR already installed on it.

http://help.adobe.com/en_US/flex/mob...7bfa-8000.html

Не нахожу такой опции в FB 4.5

Добавлено через 34 минуты
Вот нет у меня такой опции:
http://content.screencast.com/users/...6_11-23-11.png

Хотя документ по ссылке выше для SDK 4.5.
Кроме того, а как быть при упаковке ADT? Я использую nativeExtentions и они не пакуются иначе.

PlutDem 26.02.2012 02:24

Цитата:

Сообщение от Zebestov (Сообщение 1065295)
Вообще это немного странно. Иметь на руках пока еще низкую производительность платформы, не делать ничего для оптимизации процесса, и при этом требовать хорошего FPS.
Во-первых использовать исключительно Bitmap. Во-вторых, если это возможно, кэшировать все положения при вращении с определенным шагом. Другими словами — никакой кучи интерактивных DO, никаких трансформаций.

Извините, но на экране 400 растрированных спрайтов, в каждом кадре, в цикле for, смещаем их на один пиксель по оси y, в итоге - 24 фпс. Не знаю как вы, а я не вижу, что тут еще можно оптимизировать. Кстати, только что проверил, наличие вращения и использование cacheAsBitmapMatrix не влияет на количество фпс.

СлаваRa 26.02.2012 02:40

Цитата:

Извините, но на экране 400 растрированных спрайтов, в каждом кадре, в цикле for, смещаем их на один пиксель по оси y
надеюсь, не каждый отдельно.

PlutDem 26.02.2012 03:01

Цитата:

Сообщение от СлаваRa (Сообщение 1065561)
надеюсь, не каждый отдельно.

Именно, в реальном приложении объекты будут двигаться отдельно, не все, но половина точно. К тому же, при растеризации, двигая как контейнер, так и сами спрайты, разницы в фпс не заметил.

Zebestov 26.02.2012 14:24

Цитата:

Сообщение от Astraport (Сообщение 1065432)
Не нахожу такой опции в FB 4.5

Ага. Тоже не нашел. Вот и еще одна причина, по которой мне пока не интересен андроид.


@PlutDem
Цитата:

Сообщение от Zebestov (Сообщение 1065295)
Во-первых использовать исключительно Bitmap

Цитата:

Сообщение от PlutDem (Сообщение 1065559)
Извините, но на экране 400 растрированных спрайтов

Что извинить? Неспособность отличать Bitmap от Sprite?

Цитата:

Сообщение от Zebestov (Сообщение 1065295)
Во-вторых, если это возможно, кэшировать все положения при вращении с определенным шагом

Цитата:

Сообщение от PlutDem (Сообщение 1065559)
проверил, наличие вращения и использование cacheAsBitmapMatrix не влияет на количество фпс

Я говорил про другое кеширование. Либо prerendered spritesheet, либо предварительное кеширование непосредственно во время выполнения.

PlutDem 26.02.2012 23:58

Цитата:

Сообщение от Zebestov (Сообщение 1065617)
Что извинить? Неспособность отличать Bitmap от Sprite?

Что спрайт, что битмап- разницы в фпс никакой. Проверил.

Zebestov 27.02.2012 13:14

Ну а с вращением что? Пробовал закешировать каждые 10-20 градусов?
В конечном счете, если задачу нельзя решить подобными способами оптимизации, то нужно отложить ее до появления Stage3D на мобильных платформах. Вроде недолго осталось.

Astraport 01.03.2012 12:36

Цитата:

Ага. Тоже не нашел. Вот и еще одна причина, по которой мне пока не интересен андроид.
В общем в 4.6 билдере это есть. Кроме того, очень просто билдить ANE. Очень удобно, без всех этих ANT и ADT.
Размер APK увеличился на 4 Мб. Буду ждать отзывов от юзеров, отпишусь через неделю здесь.

Для полного счастья не хватает чтобы SecureSWF мог обфусцировать APK с нативными расширениями. А то поддержку APK в новой версии объявили, а какой в этом смысл, если ошибку при обфускации выдает (я долго мучил их техподдержку, ответили что пока не поддерживается).


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

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