Форум 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=179481)

Silicium 15.05.2012 22:48

За счет чего достигается плавность движения в твинере?
 
За счет чего достигается плавность движения в твинере? При изменении координаты по enterFrame-у спрайт (даже один) движется заметно прерывисто. С помощью твина он движется плавно. Какими средствами это реализовано в нем?

Aquahawk 15.05.2012 22:53

Какого твина, примеры, сравнения. Напишите тест, откройте исходные коды и выложите билд, тогда может и посмотрим что у вас не так и насоветуем сделать лучше. А как в вакууме никто ничего делать на будет, и флуда на 10 страниц разведём, и ответа не найдём. Я когда делал руками всё нормально твинилось.

Silicium 15.05.2012 23:01

Да у меня все так, Aquahawk)) Из общих соображений интересуюсь.
Цитата:

При изменении координаты по enterFrame-у спрайт (даже один) движется заметно прерывисто.
с этим Вы спорить ведь не будете?
Цитата:

С помощью твина он движется плавно.
с этим тоже.

Сравнить объективно тут никак не получится, все это видно "на глаз".

Aquahawk 15.05.2012 23:50

Цитата:

этим Вы спорить ведь не будете?
Буду.
Приведите примеры пожалуйста где это видно на глаз. О каких твинерах вы говорите, нативных, motionTween который или программных, типа твинлайта? Я никогда не замечал разницы, ведь чужие твинеры написаны тем же кодом и тем же образом что и я пишу. Не думайте что все обладают теми же мыслями как и вы. В пример покажите простейший, а там посмотрим. Я не могу сказать почему что-то происходит, когда у меня оно не происходит. Тут я мог бы наваять свой пример, но мне лень. Раз вы вопрос задали, так и обозначье проблему чётко, вида: фот флешка, вот два спрайта, вот так тормозит, а так нормально. Или вы потроллить пришли, а ответ вам не нужен?

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

Добавлено через 4 минуты
и вообще: Talk is cheap. Show me the code. Torvalds, Linus (2000-08-25).

expl 16.05.2012 00:13

Можно попробовать следующий порядок действий:
1. Открываем файл http://www.elizabethpocztaruk.com.br...k/TweenNano.as
2. Пытаемся использовать, убеждаемся что работает плавно.
Если работает _не_ плавно, нужно сказать какой твинер использовали и он у Вас работал плавно
3. Если работает плавно - читаем код
4. Видим, что там балуются подпиской на тот же ENTER_FRAME и функцией getTimer()
5. Если не стало понятнее - задавайте сюда вопросы/ищите ответы на офсайте greensock/на худой хонец можно потеребить авторов, правда, не уверен, что у них есть желание обяснять как оно работает.

Aquahawk 16.05.2012 00:16

Мне уже самому интересно, просто покажите где тормозит и найдём и объясним что и как.

Silicium 16.05.2012 02:07

Тест
 
Вложений: 1
Не дергается нативный флексовый твин. Начинаю думать, что ошибся веткой.

Aquahawk 16.05.2012 11:35

Ничего не ошиблись, флекс написан на AS3 и нет вещей которые нельзя повторить. Вечером посмотрю исходник.

Добавлено через 2 минуты
Вот с такого теста и надо было начинать тему.

Silicium 16.05.2012 13:28

Цитата:

Вот с такого теста и надо было начинать тему.
Согласен. Я не сразу заметил, что это касается (пока) только флексового твина. По дефолту думал, что это общая вещь.

MoHaX 16.05.2012 16:52

Ммм прямо интересно, надо тоже глянуть:)

Zebestov 16.05.2012 17:23

Похоже на то, что tween работает на таймере, а в обработчике используется updateAfterEvent().

Добавлено через 6 минут
Код AS3:

import flash.display.Shape;
import flash.utils.Timer;
import flash.events.TimerEvent;
 
var shape:Shape = new Shape();
shape.graphics.lineStyle(1.2);
shape.graphics.drawCircle(0, 0, 50);
shape.x = 100;
shape.y = 200;
stage.addChild(shape);
 
var timer:Timer = new Timer(16);
        timer.addEventListener(TimerEvent.TIMER, onTimer);
        timer.start();
 
var step:Number = 3;
var right:Number = 480;
var left:Number = 70;
 
function onTimer(event:TimerEvent):void
{
        shape.x += step;
 
        if (shape.x >= right)
        {
                shape.x = right;
                step = -step;
        }
        else if (shape.x <= left)
        {
                shape.x = left;
                step = -step;
        }
 
        // эта заветная строчка делает все плавным
        event.updateAfterEvent();
}

Открываем Flash IDE, в первый кадр вставляем этот код, и для пущей убедительности до неприличия уменьшаем fps в настройках (например до 12).

Aquahawk 16.05.2012 17:45

Т.е. получается что они умудряются произвести несколько рендеров графики за один фрейм?

Zebestov 16.05.2012 17:51

Для того и существует этот метод :)

Котяра 16.05.2012 18:52

не стоит им злоупотреблять вообще-то.

Zebestov 16.05.2012 18:53

не стоит. но он есть ) и применили в данном примере именно его.

Aquahawk 16.05.2012 19:03

вообще интересная штука, можно получается практически иметь разный fps в разных частях флешки. Надо будет попробовать поизвращаться, что будет если сделать очень низкий fps, близкий к нулю, как себя плеер поведёт.

Zebestov 16.05.2012 19:09

Мы отвлекаемся. Данная возможность была упомянута исключительно в контексте вопроса автора.

Aquahawk 16.05.2012 19:29

ну ответ то найден, они просто обновляют графику чаще чем тикают фреймы. Движение на 4 пикселя за фрейм конечно дёргается, а если за фрейм перерисовать графику 4 раза то нормально будет. Другой вопрос в том что будет когда таких твинеров станет не 3, а 300 на экране.

Zebestov 16.05.2012 19:54

Цитата:

Сообщение от Aquahawk (Сообщение 1079894)
вопрос в том что будет когда таких твинеров станет не 3 а 300 на экране.

Код AS3:

import flash.display.Shape;
import flash.utils.Timer;
import flash.events.TimerEvent;
 
var shapeArray:Array = [];
var phaseArray:Array = [];
var ratioArray:Array = [];
 
var shape:Shape;
for (var i:int = 0; i < 300; i++)
{
        shape = new Shape();
        shape.graphics.lineStyle(2, uint(Math.random() * 0xffffff));
        shape.graphics.drawCircle(0, 0, Math.random() * 20 + 10);
        stage.addChild(shape);
 
        shapeArray.push(shape);
        phaseArray.push(Math.random() * Math.PI);
        ratioArray.push(Math.random() * 4 - 2);
}
 
var phase:Number = 0;
 
var timer:Timer = new Timer(16);
        timer.addEventListener(TimerEvent.TIMER, onTimer);
        timer.start();
 
function onTimer(event:TimerEvent):void
{
        var i:int = shapeArray.length;
        while (i--)
        {
                shape = shapeArray[i];
                shape.x = Math.sin((phase + phaseArray[i]) * ratioArray[i]) * 200 + 275;
                shape.y = Math.cos( phase + phaseArray[i])                  * 150 + 200;
        }
 
        phase += 0.025;
 
        // эта заветная строчка делает все плавным
        event.updateAfterEvent();
}


Silicium 16.05.2012 21:59

Огромное спасибо за ответ. Оказалось, вопрос был задан не напрасно)
Aquahawk, если что интересного "наизвращаешь" - сообщи обязательно.

Aquahawk 16.05.2012 23:16

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

etc 17.05.2012 00:41

Цитата:

Сообщение от Aquahawk (Сообщение 1079923)
а чего искать то, ответ нашли, я такое не применяю, мысль об этом была, но пока был на работе Zebestov меня опередил.

У нас курсоры все на updateAfterEvent работают.

Aquahawk 17.05.2012 00:56

кстати и хинты можно на него повесить

etc 17.05.2012 01:01

Цитата:

Сообщение от Aquahawk (Сообщение 1079933)
кстити и хинты можно на него повесить

Тоже висят.


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

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