Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [...] Падение fps в неактивном режиме (http://www.flasher.ru/forum/showthread.php?t=211466)

alecsisk 07.09.2015 15:06

Падение fps в неактивном режиме
 
Всем привет.
Заметил что в фоне приложение перестает работать. Был слеплен анализатор, который выводит логи в файл. Оказывается air принудительно занижает fps после нескольких минут работы до 0, что мне совсем не нужно. Что я пробывал:
Код AS3:

URLRequestDefaults.idleTimeout = ApplicationSettings.IDLE_TIMEOUT; // 1000 * 60 * 60000
//NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;
NativeApplication.nativeApplication.executeInBackground = true;
NativeApplication.nativeApplication.idleThreshold = 85000;

а также
Код AS3:

stage.frameRate = 30;

по таймеру, по onDeactivate

Ничего из вышеперечисленного мне не помогло. Fps все равно проседает до 0. Смотрю fps так:
Код AS3:

var fps:int = framesNumber / ((getTimer() - startTime) / 1000)

air sdk compiler: 18.0.0.180
air installer: 18.0.0.199

Есть идеи?

illuzor 07.09.2015 15:57

Зачем вам это нужно?
AIR и FlashPlayer понижают фпс для экономии ресурсов и батареи.

AlexCooper 08.09.2015 04:24

Цитата:

Сообщение от alecsisk (Сообщение 1186450)
Всем привет.
Заметил что в фоне приложение перестает работать. Был слеплен анализатор, который выводит логи в файл. Оказывается air принудительно занижает fps после нескольких минут работы до 0, что мне совсем не нужно. Что я пробывал:
Код AS3:

URLRequestDefaults.idleTimeout = ApplicationSettings.IDLE_TIMEOUT; // 1000 * 60 * 60000
//NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;
NativeApplication.nativeApplication.executeInBackground = true;
NativeApplication.nativeApplication.idleThreshold = 85000;

а также
Код AS3:

stage.frameRate = 30;


Я в ручную выполняю это действие. Суть в том, что-бы при переходе в трей, минимализировать расход ресурсов. Если этого не сделать, системный сборщик мусора может удалить приложения из трея, для освобождения памяти. К примеру Андроид, если ему не хватает оперы для активного процесса, начинает убивать фоновые. По списку от наибольшего к наименьшему кол-ву выделяемых ресурсов системой. Иногда такое возникает даже при переходе/открытии браузера из приложения
Код AS3:

public function enable(stage:Stage, view:Class):void {
        Debug.log( 'StarlingService enable');
        if (!_starling) {
 
                Starling.handleLostContext = true;
                Starling.multitouchEnabled = true;
 
                _starling = new Starling(view, stage);
 
                _starling.addEventListener(starling.events.Event.ROOT_CREATED, onStarlingEvent);
 
                _starling.addEventListener(starling.events.Event.CONTEXT3D_CREATE, onStarlingEvent);
                _starling.addEventListener(starling.events.Event.FATAL_ERROR, onStarlingEvent);
                _starling.addEventListener(starling.events.Event.PARSE_ERROR, onDebugEvent);
                _starling.addEventListener(starling.events.Event.IO_ERROR, onDebugEvent);
                _starling.addEventListener(starling.events.Event.TEXTURES_RESTORED, onDebugEvent);
 
                _starling.simulateMultitouch = true;
                _starling.antiAliasing = 0;
                _starling.showStats = false;
 
                _starling.enableErrorChecking = false;
                _starling.start();
 
                this.stage = stage;
 
                this.stage.addEventListener(flash.events.Event.RESIZE, stage_resizeHandler, false, int.MAX_VALUE, true);
 
 
                NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvokeEvent);
                // "solt"
                if(Capabilities.cpuArchitecture == "ARM" || sleepMode ) {
                        NativeApplication.nativeApplication.addEventListener(flash.events.Event.DEACTIVATE, stage_deactivateHandler, false, 0);
                }
        }
}
 
protected function onInvokeEvent(event:InvokeEvent):void
{
        Debug.log('Invoke'+event.reason+' :: '+event.arguments)
}
 
private function onDebugEvent(e:starling.events.Event):void
{
        Debug.log('onDebugEvent > '+e.data+':'+this);
}
 
private function onStarlingEvent(e:starling.events.Event):void
{
        Debug.log(e.data+' > '+e.type+' : '+this);
 
        switch (e.type) {
                case starling.events.Event.CONTEXT3D_CREATE:
                        contextCreated = true;
                        break;
 
                case starling.events.Event.ROOT_CREATED:
                        rootCreated = true;
                        break;
 
                case starling.events.Event.FATAL_ERROR:
                        Debug.alert(this,e.type);
                        return;
        }
        if (contextCreated && rootCreated)
                this.dispatchEvent( new flash.events.Event(BaseStarlingService.STARLING_ON_READY ) );
}
 
public function get starling():Starling {
        return _starling;
}
 
private function stage_resizeHandler(event:flash.events.Event):void
{
        _starling.stage.stageWidth = this.stage.stageWidth;
        _starling.stage.stageHeight = this.stage.stageHeight;
 
        const viewPort:Rectangle = _starling.viewPort;
 
        viewPort.width = this.stage.stageWidth;
        viewPort.height = this.stage.stageHeight;
        try
        {
                _starling.viewPort = viewPort;
        }
        catch(error:Error) {}
}
 
private function stage_deactivateHandler(event:flash.events.Event):void
{
        _starling.stop(true);
 
        Starling.current.nativeStage.frameRate = .1; // Starling.current.nativeStage = stage reference
 
        NativeApplication.nativeApplication.addEventListener(flash.events.Event.ACTIVATE, stage_activateHandler, false, 0, true);
}
 
private function stage_activateHandler(event:flash.events.Event):void
{                       
        NativeApplication.nativeApplication.removeEventListener(flash.events.Event.ACTIVATE, stage_activateHandler);
 
        Starling.current.nativeStage.frameRate = 60;
 
        _starling.start();
 
        if  (  this.stage )  this.stage.quality = this.stage.quality ;
 
}

Цитата:

Сообщение от alecsisk (Сообщение 1186450)
Ничего из вышеперечисленного мне не помогло. Fps все равно проседает до 0. Смотрю fps так:
Код AS3:

var fps:int = framesNumber / ((getTimer() - startTime) / 1000)


чем у объекта stage геттер frameRate не нравится?

Цитата:

Сообщение от alecsisk (Сообщение 1186450)
Есть идеи?

Есть достаточно функциональный велосипед для отладки, который сам использую.


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

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