Форум Flasher.ru

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

alexandrratush 25.06.2015 17:16

Ошибка при повторном Event.CONTEXT3D_CREATE
 
Добрый день! В некоторых случаях при старте приложения несколько раз возникает событие Event.CONTEXT3D_CREATE. После чего все графические элементы как бы сдвигаются. С чем это связано и как это обойти? Спасибо!

AlexCooper 26.06.2015 14:45

Хм... по простому такого не было) Код в студию

alexandrratush 26.06.2015 15:23

Код AS3:

private function init(e:flash.events.Event = null):void
        {
            if (e != null) removeEventListener(flash.events.Event.ADDED_TO_STAGE, init);
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.addEventListener(flash.events.Event.RESIZE, onResizeHandler);
        }
 
        private function onResizeHandler(e:flash.events.Event):void
        {
            if (stage.stageWidth == stage.fullScreenWidth && stage.stageHeight == stage.fullScreenHeight)
            {
                _logger.log("Main: onResizeHandler complete");
                stage.removeEventListener(flash.events.Event.RESIZE, onResizeHandler);
                initStarlingAndContext();
            }
        }
 
        private function initStarlingAndContext():void
        {
            var iOS:Boolean = SystemUtil.platform == "IOS";
            var stageArea:Rectangle = new Rectangle(0, 0, StarlingRoot.STAGE_WIDTH, StarlingRoot.STAGE_HEIGHT);
            var fullScreenArea:Rectangle = new Rectangle(0, 0, stage.fullScreenWidth, stage.fullScreenHeight);
            var viewPort:Rectangle = RectangleUtil.fit(stageArea, fullScreenArea, ScaleMode.SHOW_ALL);
 
            _scaleFactor = calculateScaleFactor(viewPort.width);
            Starling.multitouchEnabled = true;
            Starling.handleLostContext = true;
            RenderTexture.optimizePersistentBuffers = iOS;
 
            _starling = new Starling(StarlingRoot, stage, viewPort, null);
            _assetManager = new AssetManager(_scaleFactor);
            _context = new ApplicationContext(this, _starling, _assetManager, _logger);
            _starling.antiAliasing = 1;
            _starling.stage.stageWidth = StarlingRoot.STAGE_WIDTH;
            _starling.stage.stageHeight = StarlingRoot.STAGE_HEIGHT;
            _starling.enableErrorChecking = Capabilities.isDebugger;
            _starling.showStats = true;
            _starling.addEventListener(starling.events.Event.ROOT_CREATED, starlingRootCreatedHandler);
            _starling.addEventListener(starling.events.Event.CONTEXT3D_CREATE, starlingContext3dCreateHandler);
            _starling.addEventListener(starling.events.Event.FATAL_ERROR, starlingFatalErrorHandler);
            _starling.simulateMultitouch = true;
            _starling.start();
        }
 
        private function starlingRootCreatedHandler(e:starling.events.Event):void
        {
            _logger.log("Main: Starling root created");
            _rootCreated = true;
            initApplication();
        }
 
        private function starlingContext3dCreateHandler(e:starling.events.Event):void
        {
            _logger.log("Main: Starling Context3d created");
            _contextCreated = true;
            initApplication();
        }
 
        private function initApplication():void
        {
            if (_rootCreated && _contextCreated)
            {
                if (!_initApplication)
                {
                    _initApplication = true;
                    _logger.log("Main: init application, scaleFactor: " + _scaleFactor);
                    var root:StarlingRoot = _starling.root as StarlingRoot;
                    root.initApplication(_scaleFactor);
                } else
                {
                    _logger.error("Main: init application already");
                }
            }
        }
 
        private function starlingFatalErrorHandler(e:starling.events.Event):void
        {
            _logger.fatal("Starling Fatal Error: " + JSON.stringify(e.data));
        }

Лог два раза выводит Main: Starling Context3d created. Возникает при публикации приложения, когда телефон заблокирован. После снятия с блока, в некоторых случаях вылетает этот баг. И вся сцена как будто сдвигается в сторону. Устройство Android, запускаю с IDEA.

alexandrratush 26.06.2015 15:32

Вложений: 1
Только что попробовал запускать приложение с телефона, и ставить на блок. С пятого раза вылетел этот баг.
По логам видно, что уже началась отрисовка окна авторизации, и опять возникло это событие. Внизу видно кнопки авторизации, которые не посередине, и не того размера, который нужен.
Скрин с мобильного:
Вложение 31665

AlexCooper 26.06.2015 20:26

мейби
Код AS3:

stage.addEventListener(Event.DEACTIVATE, stage_deactivateHandler, false, 0, true);
 
private function stage_deactivateHandler(event:Event):void
{
        this._starling.stop();
        this.stage.addEventListener(Event.ACTIVATE, stage_activateHandler, false, 0, true);
}
 
private function stage_activateHandler(event:Event):void
{
        this.stage.removeEventListener(Event.ACTIVATE, stage_activateHandler);
        this._starling.start();
}


alexandrratush 26.06.2015 20:42

Спасибо за ответ, попробовать смогу только во вторник. Тогда и отпишусь.:)

AlexCooper 26.06.2015 21:02

сдвиг скорее всего из-за onResize или OrientEvent

ShockWave512 27.06.2015 11:07

У вас каждый раз создается новый экземпляр старлинг при ресайзе нативного стейджа. Естественно он выдает новый контекст каждый раз.

При ресайзе стейджа, надо менять размеры зоны вьюпорта и стейджа самого старлинга. Из-за этого и будут смещатся элементы отрисовки.

AlexCooper 27.06.2015 14:34

Цитата:

Сообщение от ShockWave512 (Сообщение 1184157)
При ресайзе стейджа, надо менять размеры зоны вьюпорта и стейджа самого старлинга. Из-за этого и будут смещатся элементы отрисовки.

Собственно товарищ ShockWave512 говорит о
Код AS3:

stage.addEventListener(flash.events.Event.RESIZE, stage_resizeHandler, false, int.MAX_VALUE, true);

Код AS3:

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) {}
}


alexandrratush 27.06.2015 18:55

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


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

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