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
Есть идеи?
Зачем вам это нужно?
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/) для отладки, который сам использую.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.