PDA

Просмотр полной версии : [...] Падение fps в неактивном режиме


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

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

а также

stage.frameRate = 30;

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

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

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
Всем привет.
Заметил что в фоне приложение перестает работать. Был слеплен анализатор, который выводит логи в файл. Оказывается air принудительно занижает fps после нескольких минут работы до 0, что мне совсем не нужно. Что я пробывал:

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

а также

stage.frameRate = 30;


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

}


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

var fps:int = framesNumber / ((getTimer() - startTime) / 1000)
чем у объекта stage геттер frameRate (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Stage.html#frameRate) не нравится?


Есть идеи?
Есть достаточно функциональный велосипед (http://www.monsterdebugger.com/) для отладки, который сам использую.