Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Наиболее оптимальный способ вращения битмапа (http://www.flasher.ru/forum/showthread.php?t=209990)

mikhailk 12.01.2015 12:41

Наиболее оптимальный способ вращения битмапа
 
Есть условно битмап 600х600 (что-то типа колеса), который надо вращать вокруг центра в контейнере 1000х800. Пробовал разные варианты - на слабых машинах на небольшой скорости вращения дергания присутствуют в любом случае. На большой скорости проблем нет, но есть необходимость плавного вращения на небольшой скорости.

Нет ли у кого готового решения?


PS. "Слабая машина", на которой тестирую: Intel Atom 1.6ГГц, 1.75Гб, WinXP
PPS. Нужен нативный флеш, Starling отпадает

in4core 12.01.2015 13:24

mikhailk - а твинером пробовали вращать?

mikhailk 12.01.2015 14:12

пробовал по таймеру и энтерфрейму с коррекцией времени по кадрам.
твинером - нет, не пробовал.

Попробовал TweenNano. Эффект тот же, что и при энтерфрейме с коррекцией по времени.
Подозреваю, тут нужно какое-то нетрадиционное решение.

ЗЫ. Пробовал, кстати, не только крутить битмап (спрайт с битмапом), но и, например, рендерить в битмапдату и показывать ее. На слабых машинах все тормозит.

in4core 12.01.2015 14:44

1) TweenMax
2) BlitMask
3) Blitmask.bitmapMode = false
(контейнер под блит маск. Контейнер спрайт, графика битмап в нем )
Попробуй именно такую конфигурацию.

Zebestov 12.01.2015 16:01

eaze-tween

nubideus 12.01.2015 16:24

Цитата:

на слабых машинах на небольшой скорости вращения
лаги есть везде вне зависимости от железа
Цитата:

Нужен нативный флеш
drawTriangles, или руками юзай stage3d.
решения нет, садись на мак и плюй на юзера, везде так делают. (на маке нет лагов)

mikhailk 12.01.2015 16:28

Цитата:

drawTriangles, или руками юзай stage3d.
Речь идет о старых компах с графическими картами, которые Stage3D не поддерживают.

Цитата:

eaze-tween
ок, попробую

nubideus 12.01.2015 16:46

Цитата:

которые Stage3D не поддерживают.
ну ок а 10 плеер они поддерживают?
http://help.adobe.com/en_US/FlashPla...rawTriangles()
Цитата:

Runtime Versions: Flash Player 10, AIR 1.5

mikhailk 12.01.2015 17:10

Не, это сложно.
Поищу более простой вариант.

Кстати, в свое время была такая тема, как использование врезок на си для оптимизации отдельных вещей, но что-то я не нагуглил ничего.

in4core 12.01.2015 17:15

mikhailk - я дал вам решение, пробовали? Специльано для слабых компов, у меня лично прокатывает на битмапах больше 1500 размером

mikhailk 12.01.2015 17:54

да-да, сейчас как раз проверяю.
вроде крутится.

Zebestov 12.01.2015 18:11

Вложений: 2
И все же для тестов попробуй на слабом компе вот это.
bitmapRotationTest.swf   (47.6 Кб)

mikhailk 12.01.2015 19:06

интересно, но на слабом компе все равно подтормаживает

Zebestov 12.01.2015 19:10

ясно ) ну, надо же было убедиться!

in4core 12.01.2015 20:18

Цитата:

да-да, сейчас как раз проверяю.
вроде крутится.
То есть удачно?

mikhailk 13.01.2015 11:08

Короче, на мощной/современной машине крутится в любом варианте.
На слабой/старой/убитой машине крутится с рывками так же в любом варианте.

Начинаю думать, что чудес не случилось.

nubideus 13.01.2015 11:55

mikhailk, ну если не хочешь drawTriangles юзани rotationZ += 0.0001 (как там включать 3d рендер? вроде достаточно было scaleZ = 1)

mikhailk 13.01.2015 14:02

Цитата:

ну если не хочешь drawTriangles
Трианглы, кстати, рулят.
Только изображение получается в зеркальном отражении по горизонтали.
В примере - так же.

Zebestov 13.01.2015 14:32

Это я набокопорил с координатами =) вектор vertices неправильно собран.
Вот исправленный код метода drawImage:

Код AS3:

function drawImage():void
{
        var a0:Number = angle + diagonalAngle;
        vertices[0] = Math.cos(a0) * diagonalSemiLength + center.x;
        vertices[1] = Math.sin(a0) * diagonalSemiLength + center.y;
 
        var a1:Number = angle + Math.PI - diagonalAngle;
        vertices[2] = Math.cos(a1) * diagonalSemiLength + center.x;
        vertices[3] = Math.sin(a1) * diagonalSemiLength + center.y;
 
        var a2:Number = angle - Math.PI + diagonalAngle;
        vertices[4] = Math.cos(a2) * diagonalSemiLength + center.x;
        vertices[5] = Math.sin(a2) * diagonalSemiLength + center.y;
 
        var a3:Number = angle - diagonalAngle;
        vertices[6] = Math.cos(a3) * diagonalSemiLength + center.x;
        vertices[7] = Math.sin(a3) * diagonalSemiLength + center.y;
 
        canvas.graphics.clear();
        canvas.graphics.beginBitmapFill(image, null, false, true);
        canvas.graphics.drawTriangles(vertices, indices, uvtData);
}


mikhailk 13.01.2015 14:39

Да, так все работает. Фенкс.

nubideus 13.01.2015 16:09

mikhailk, и че прям не лагает?

mikhailk 13.01.2015 18:40

На слабых машинах подтормаживает, как я и говорил выше.
Но изменился характер подтормаживания.
Разница как бы между "медленно работает" и "хаотично дергается".

elder_Nosferatu 13.01.2015 22:32

Если трансформация заключается в обычном myDisplayObject.rotation = newAngleValue, то никакие твинеры не спасут ибо как не крути а они сложнее обычной подписки на Event.ENTER_FRAME. А значит и производительности эти твинеры не прибавят.

Если на древнем железе есть визуальные лаги, то спасти может только пререндеринг, но такой подход скушает много памяти (картинка то габаритная). Но если колесо изображено схематически и может быть поделено на несколько визуально идентичных секторов, то можно сократить расход памяти, отрисовав несколько положений колеса не в диапазоне 0..360 градусов, а в 0..360/n градусов, где n - количество секторов.

Zebestov 13.01.2015 22:40

elder_Nosferatu, и это все не принесет нам ни грамма выигрыша. Если кусков не 4 (по 90 градусов), то мы просто превратим отрисовку двух треугольников в отрисовку два-по-360/n треугольников. Говоря другими словами, мы сделаем пререндер сектора, потратим память (а колесо вращается мееедленно, памяти уйдет мнооого), намучаемся со стыковкой швов и в конечном счете проиграем даже в скорости.

В данном случае смещение баланса в сторону избыточной информации не принесет прироста производительности.

in4core 14.01.2015 00:45

Цитата:

Если трансформация заключается в обычном myDisplayObject.rotation = newAngleValue, то никакие твинеры не спасут ибо как не крути а они сложнее обычной подписки на Event.ENTER_FRAME. А значит и производительности эти твинеры не прибавят.
Проверно на личном опыте - твинМакс + блитМаск дает прирост чуть ли не в 200% против интер_фрейм при работе с битмапами больших размеров. Или большими спрайтами с частями битмап, причем самой простейшей анимацией х++, y++

elder_Nosferatu 14.01.2015 02:21

@Zebestov
Я писал об отрисовке всего колеса, а не его сектора. А значит и склеивать ничего не прийдется. О секторах я завел разговор только потому, что если, к примеру, колесо разделено спицами на 5 72-градусных идентичных секторов, то поворот на 72 градуса будет выглядеть также, как и на 144 и на 216 и на 360 градусов, а поворот на 5 градусов такой же, как и на 77 и на 149... градусов. А это значит, что нет смысла рисовать вид колеса в положениях от 0 до 360, достаточно будет от 0 до 72

Zebestov 14.01.2015 03:57

elder_Nosferatu, понял. Но тогда памяти действительно уйдет многовато — все колесо хранить.

nubideus 14.01.2015 09:32

elder_Nosferatu, а чем это поможет если и там и там нужно рисовать картинку с поворотом?

mikhailk 14.01.2015 10:27

Цитата:

Проверно на личном опыте - твинМакс + блитМаск дает прирост чуть ли не в 200% против интер_фрейм при работе с битмапами больших размеров. Или большими спрайтами с частями битмап, причем самой простейшей анимацией х++, y++
При анимации смещения, наверняка, так и есть.
При анимации вращения вариант с трианглами оказался визуально производительнее.


Цитата:

Если на древнем железе есть визуальные лаги, то спасти может только пререндеринг, но такой подход скушает много памяти (картинка то габаритная).
Да, естественно.
Но в силу ряда причин пререндеринг может быть невозможен.

Например, на колесо наносятся дополнительные маркеры, перекрашиваются сектора и все такое прямо во время вращения. Модифицировать одну битмапдату на лету проблем нет. Пересобрать все 360 битмапдат - это уже затратная операция.

elder_Nosferatu 15.01.2015 02:01

@nubideus
Погуглите значение слова "пререндеринг" :)
Если перед анимированием закешировать разные состряния, то вместо их отрисовки по нужде можно использовать готовые состояния из кеша.

nubideus 15.01.2015 12:33

elder_Nosferatu, в первом случае вращается растровая картинка.
в твоем случае вращется растровая анимация.

да, rotation в твоем случае изменяется не каждый кадр, но зато каждый кадр сменяется кадр анимации и его нужно повернуть.
его не нужно поворачивать только в начале анимации, когда первый сегмент не кончился.
смысл кешировать матричные преобразования если кеш потом будет трасформироваться той же матрицей? другое дело если кеш не будет вращаться, но тогда придется хранить все 360 градусов.


Цитата:

Погуглите значение слова "пререндеринг"
я тебя спрашивал что такое пререндеринг?
ты предлагаешь забить 300 мегабайт из 1.75Гб, при этом профита в производительности не будет.
зачем этот троллинг? иди погугли "когда нужно использовать пререндеринг".

Zebestov 15.01.2015 14:14

nubideus, не заводись так.
Профит в производительности будет, потому что не будет никаких трансформаций — тупо блиттинг (потому что пререндеринг). Но цена этого прироста — перерасход памяти на хранение достаточно немалого количества картинок для медленно вращающегося колеса.

nubideus 15.01.2015 15:22

Цитата:

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

Zebestov 15.01.2015 15:52

Цитата:

Сообщение от nubideus (Сообщение 1177568)
я думал он про произвольные изображения

Не, он потом пояснил, что речь идет об экономии памяти благодаря повторяемости, которая позволит отрендерить не весь цикл, а лишь одну его долю.

mikhailk 15.01.2015 18:23

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

Так что пререндеринг штука безусловно хорошая, но не для решаемой задачи.


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

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