Форум Flasher.ru

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

mikhailk 17.04.2015 16:19

Оптимизация вращения спрайта с детьми без запекания
 
Нужно вращать вокруг геометрического центра спрайт, в котором порядка двух десятков детей, каждый из которых внутри себя содержит бэк (Image) и текстовое поле. Что-то типа колеса фортуны. На устройствах дергается. Умом понимаю, что это из-за последовательного пересчета всего этого зоопарка, значит решение в том, чтобы запечь колесо в одну текстуру, сделать Image и крутить его.

Но может есть какой трюк, чтобы обойтись без запекания?
Цвета секторов и значения текстовых полей все время разные, так что заранее не заготовить.

Вращаю по энтерфрейм 60FPS (или сколько там устройство из себя выжмет), приращение угла 0.01.

Добавлено через 1 час 4 минуты
Кстати, а у нас есть возможность выдернуть битмапдату загруженных изображений текстур?
Чтобы собрать итоговую текстуру по частям.

Попробовал отрисовать в битмапдату собранное колесо целиком как предлагается в этой теме:
http://flasher.ru/forum/showthread.php?t=210617

влетел в ту же проблему с размерами вьюпорта.

caseyryan 17.04.2015 17:57

Цитата:

Кстати, а у нас есть возможность выдернуть битмапдату загруженных изображений текстур?
нет

Проблема с размерами решается переписыванием кода в классе Starling, в методе updateViewPort() (где-то в районе 530й строки) и изменением режима отрисовки на BASELINE_EXTENDED или BASELINE.
Это так, к слову. Я лично от этой идеи отказался совсем
Собственно, можно изменить код на такой:
Код AS3:

if (mProfile == "baselineConstrained") {
        configureBackBuffer(32, 32, mAntiAliasing, true);
} else {
        mClippedViewPort = mViewPort.clone();
}


mikhailk 17.04.2015 18:55

Интересно, попробовал через RenderTexture, но гладкости не получилось.

ShockWave512 18.04.2015 01:42

А с чего вы взяли что там что то пересчитывается?

Sprite + Image + TextField - статичные штуки, если вы не меняете каждый кадр текст или еще чего то.

Пересчитать матрицы для поворота даже с сотнями детей, не должно вызывать нагрузки на CPU.

caseyryan 18.04.2015 09:34

Цитата:

Пересчитать матрицы для поворота даже с сотнями детей, не должно вызывать нагрузки на CPU
Еще как вызовет, и еще какую нагрузку.
На практике, спрайт содержащий множество элементов, пусть даже просто Image, работает медленее, чем тот же спрайт, если у него вызвать метод flatten()

ShockWave512 18.04.2015 09:51

а сколько элементов и полей? сделаю тест вечером

caseyryan 18.04.2015 11:10

Цитата:

а сколько элементов и полей?
Чем больше, тем лучше)
Как было у меня: 3 слоя (спрайта) - задний параллакс, средний слой, который непосредственно под контейнером с персонажами, и передний параллакс. Все эти 3 слоя наполняются объектами Image, которые создаются на основе текстурного атласа. Всего около 200 - 250 элементов. Запускаю игру на телефоне, вижу, что фпс в районе 45 - 50 все время. При перемещении провисает до 35 - 40 (ну, естественно там не только эти спрайты двигались, но не суть). Первое, что сделал для оптимизации - вызывал у всех трех слоев flatten(). Результат - фпс 55 - 60 стабильно.
Что, в принципе, логично. Или программе надо пересчитать одну матрицу, или пробежаться по списку и пересчитать матрицы для всех объектов

mikhailk 18.04.2015 23:21

Цитата:

а сколько элементов и полей? сделаю тест вечером
У меня в контейнере лежит:

1. бэк колеса - текстура с кругом 500х500 (радиус круга 250)
2. 12 треугольных секторов круга, каждый из которых содержит бэк (текстура в виде треугольника с альфой) и текстовое поле с применением нативного фильтра Glow (для эффекта обводки символов).


Но, после того, как я отрисовал колесо со всем зоопарком в RenderTexture, сделал Image и начал его крутить, гладкости вращения все равно не получилось. Поэтому я начинаю думать, что неправильно организовал вращение. Например, вращать не по флешовому ENTER_FRAME, а брать данные для вращения с жонглера.

ShockWave512 18.04.2015 23:27

Tween лучше для вращения.

mikhailk 20.04.2015 10:08

Мне нужно вращать, потом замедлять, потом останавливать с эффектом отскока.
При этом время вращения заранее не известно.

Добавлено через 1 час 5 минут
Нет, чего-то не выходит у меня это вращение. Все равно дергается.

Пробовал через Tween:

Код AS3:

_wheel.flatten();
var rounds : uint = 5;
var tween : Tween = new Tween( _wheel, 3 * rounds );
tween.animate( 'rotation', Math.PI * rounds );
Starling.juggler.add( tween );

Пробовал напрямую к жонглеру привязать:

Код AS3:

wheel.currentRotationSpeed = 0.5;
Starling.juggler.add( _wheel );
 
// в коде класса WheelStarling (implements IAnimatable)
public function advanceTime( time : Number ) : void
{
        this.rotation += _currentRotationSpeed * time;
}


Гладко выглядит только если FPS строго 60. Если хотя бы 45 - уже начинаются совершенно неприличные рывки.


Сам класс WheelStarling:

Код AS3:

package view.starlingCore.gameComponents.misc
{
    import starling.animation.IAnimatable;
    import starling.display.Image;
    import starling.display.Sprite;
 
    public class WheelStarling extends Sprite implements IAnimatable
    {
        private var _currentRotationSpeed : Number;
 
        public function WheelStarling()
        {
            setUp();
        }
 
        private function setUp() : void
        {
            for ( var i : uint = 0; i < 12; i++ )
            {
                addChild( new WheelSectorStarling( i ) );
            }
 
            var spokes : Image = new Image( AssetHolder.getTexture( 'spokes' ) )
            spokes.pivotX = spokes.width / 2;
            spokes.pivotY = spokes.height / 2;
            addChild( spokes );
 
            this.x = spokes.width / 2;
            this.y = spokes.height / 2;
 
            this.flatten();
 
        }
 
        public function advanceTime( time : Number ) : void
        {
            this.rotation += _currentRotationSpeed * time;
        }
 
        public function set currentRotationSpeed( value : Number ) : void
        {
            _currentRotationSpeed = value;
        }
    }
}

Может дело в размерах?
Текстура спиц ('spokes') - это изображение 500х500.


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

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