Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.04.2015, 16:19
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 1  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По умолчанию Оптимизация вращения спрайта с детьми без запекания

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

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

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

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

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

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

Старый 17.04.2015, 17:57
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Кстати, а у нас есть возможность выдернуть битмапдату загруженных изображений текстур?
нет

Проблема с размерами решается переписыванием кода в классе Starling, в методе updateViewPort() (где-то в районе 530й строки) и изменением режима отрисовки на BASELINE_EXTENDED или BASELINE.
Это так, к слову. Я лично от этой идеи отказался совсем
Собственно, можно изменить код на такой:
Код AS3:
if (mProfile == "baselineConstrained") {
	configureBackBuffer(32, 32, mAntiAliasing, true);
} else {
	 mClippedViewPort = mViewPort.clone();
}

Старый 17.04.2015, 18:55
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 3  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Интересно, попробовал через RenderTexture, но гладкости не получилось.

Старый 18.04.2015, 01:42
ShockWave512 вне форума Посмотреть профиль Отправить личное сообщение для ShockWave512 Посетить домашнюю страницу ShockWave512 Найти все сообщения от ShockWave512
  № 4  
Ответить с цитированием
ShockWave512

Регистрация: Dec 2007
Адрес: NA
Сообщений: 741
Отправить сообщение для ShockWave512 с помощью Skype™
А с чего вы взяли что там что то пересчитывается?

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

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

Старый 18.04.2015, 09:34
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Пересчитать матрицы для поворота даже с сотнями детей, не должно вызывать нагрузки на CPU
Еще как вызовет, и еще какую нагрузку.
На практике, спрайт содержащий множество элементов, пусть даже просто Image, работает медленее, чем тот же спрайт, если у него вызвать метод flatten()

Старый 18.04.2015, 09:51
ShockWave512 вне форума Посмотреть профиль Отправить личное сообщение для ShockWave512 Посетить домашнюю страницу ShockWave512 Найти все сообщения от ShockWave512
  № 6  
Ответить с цитированием
ShockWave512

Регистрация: Dec 2007
Адрес: NA
Сообщений: 741
Отправить сообщение для ShockWave512 с помощью Skype™
а сколько элементов и полей? сделаю тест вечером

Старый 18.04.2015, 11:10
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

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

Старый 18.04.2015, 23:21
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 8  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
а сколько элементов и полей? сделаю тест вечером
У меня в контейнере лежит:

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


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

Старый 18.04.2015, 23:27
ShockWave512 вне форума Посмотреть профиль Отправить личное сообщение для ShockWave512 Посетить домашнюю страницу ShockWave512 Найти все сообщения от ShockWave512
  № 9  
Ответить с цитированием
ShockWave512

Регистрация: Dec 2007
Адрес: NA
Сообщений: 741
Отправить сообщение для ShockWave512 с помощью Skype™
Tween лучше для вращения.

Старый 20.04.2015, 10:08
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 10  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Мне нужно вращать, потом замедлять, потом останавливать с эффектом отскока.
При этом время вращения заранее не известно.

Добавлено через 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.


Последний раз редактировалось mikhailk; 20.04.2015 в 11:15.
Создать новую тему Ответ Часовой пояс GMT +4, время: 01:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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