![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Нужно вращать вокруг геометрического центра спрайт, в котором порядка двух десятков детей, каждый из которых внутри себя содержит бэк (Image) и текстовое поле. Что-то типа колеса фортуны. На устройствах дергается. Умом понимаю, что это из-за последовательного пересчета всего этого зоопарка, значит решение в том, чтобы запечь колесо в одну текстуру, сделать Image и крутить его.
Но может есть какой трюк, чтобы обойтись без запекания? Цвета секторов и значения текстовых полей все время разные, так что заранее не заготовить. Вращаю по энтерфрейм 60FPS (или сколько там устройство из себя выжмет), приращение угла 0.01. Добавлено через 1 час 4 минуты Кстати, а у нас есть возможность выдернуть битмапдату загруженных изображений текстур? Чтобы собрать итоговую текстуру по частям. Попробовал отрисовать в битмапдату собранное колесо целиком как предлагается в этой теме: http://flasher.ru/forum/showthread.php?t=210617 влетел в ту же проблему с размерами вьюпорта. |
|
|||||
|
Цитата:
Проблема с размерами решается переписыванием кода в классе Starling, в методе updateViewPort() (где-то в районе 530й строки) и изменением режима отрисовки на BASELINE_EXTENDED или BASELINE. Это так, к слову. Я лично от этой идеи отказался совсем Собственно, можно изменить код на такой: |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Интересно, попробовал через RenderTexture, но гладкости не получилось.
|
|
|||||
|
А с чего вы взяли что там что то пересчитывается?
Sprite + Image + TextField - статичные штуки, если вы не меняете каждый кадр текст или еще чего то. Пересчитать матрицы для поворота даже с сотнями детей, не должно вызывать нагрузки на CPU. |
|
|||||
|
Цитата:
На практике, спрайт содержащий множество элементов, пусть даже просто Image, работает медленее, чем тот же спрайт, если у него вызвать метод flatten() |
|
|||||
|
а сколько элементов и полей? сделаю тест вечером
|
|
|||||
|
Цитата:
Как было у меня: 3 слоя (спрайта) - задний параллакс, средний слой, который непосредственно под контейнером с персонажами, и передний параллакс. Все эти 3 слоя наполняются объектами Image, которые создаются на основе текстурного атласа. Всего около 200 - 250 элементов. Запускаю игру на телефоне, вижу, что фпс в районе 45 - 50 все время. При перемещении провисает до 35 - 40 (ну, естественно там не только эти спрайты двигались, но не суть). Первое, что сделал для оптимизации - вызывал у всех трех слоев flatten(). Результат - фпс 55 - 60 стабильно. Что, в принципе, логично. Или программе надо пересчитать одну матрицу, или пробежаться по списку и пересчитать матрицы для всех объектов |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
1. бэк колеса - текстура с кругом 500х500 (радиус круга 250) 2. 12 треугольных секторов круга, каждый из которых содержит бэк (текстура в виде треугольника с альфой) и текстовое поле с применением нативного фильтра Glow (для эффекта обводки символов). Но, после того, как я отрисовал колесо со всем зоопарком в RenderTexture, сделал Image и начал его крутить, гладкости вращения все равно не получилось. Поэтому я начинаю думать, что неправильно организовал вращение. Например, вращать не по флешовому ENTER_FRAME, а брать данные для вращения с жонглера. |
|
|||||
|
Tween лучше для вращения.
|
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Мне нужно вращать, потом замедлять, потом останавливать с эффектом отскока.
При этом время вращения заранее не известно. Добавлено через 1 час 5 минут Нет, чего-то не выходит у меня это вращение. Все равно дергается. Пробовал через Tween: _wheel.flatten(); var rounds : uint = 5; var tween : Tween = new Tween( _wheel, 3 * rounds ); tween.animate( 'rotation', Math.PI * rounds ); Starling.juggler.add( tween ); 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: 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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|