Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Как избавиться от мерцания объекта при его движении (http://www.flasher.ru/forum/showthread.php?t=74227)

Кроликов 15.01.2006 00:48

Как избавиться от мерцания объекта при его движении
 
Вложений: 1
Прошу пардону если тема уже обсуждалась, но поиск по слову "мерцание" ничего не дал.

Простейший пример. Треугольник движется по вертикали со скоростью 5 пикселей в секунду. Движение задается таким кодом:

Код:

_root.onEnterFrame = function()
{
        strelka._y -= 5;
        if(strelka._y <= 0)strelka._y = 200;
}

При таком движении нижняя сторона треугольника мерцает-мигает-раздваивается... вобщем анимация получается не очень плавной. При более сложном движении мерцать будут все стороны объекта. Как можно избавиться от такого раздваивания? Варианты "уменьшить скорость перемещения" и "увеличить количество кадров в секунду" не устраивают.

Пример флэшки в прикреленном файле.

Буньков Максим 15.01.2006 11:26

Я думаю просто идет высокая нагрузка на процессор и можно попробывать решить проблему используя не событие onEnterFrame а функцию setInterval совместно updateAfterEvent

Кроликов 15.01.2006 13:29

Вложений: 1
Хммм... Попробовал сделать как ты сказал, код получился таким:
Код:

function moveStrelka()
{
        strelka._y -= 5;
        if(strelka._y <= 0)strelka._y = 200;
        updateAfterEvent();
}

setInterval(moveStrelka, 10);

но при этом разницы при отрисовке между первым и выторым вариантом не увидел...

Фактически получается что в первом случае я задаю FPS через интерфейс Флэша, а во втором случае – вручную, через параметр функции setInterval(), так что не ясно почему должна снизиться нагрузка на процессор, ведь и в первом и во втором случае частоту кадров можно сделать одинаковой...

ЗЫ и еще один вопрос. Я с Акшн Скриптом стал разбираться недавно, поэтому пока не знаю некоторых элементарных вещей, например, есть ли какая-то общепринятая оптимальная частота кадров для флэш-ролика? Просто пробовал менять на этом тестовом примере частоту кадров от 12 до 120 кадров в секунду, в первом случае получается "раздваивание", во втором – нагрузка на процессор достигает 50-60% и это на таком не загруженном кодом и объектами примере:((

Добиться нормального соотношения "анимация/нагрузка на процессор" устанавливая другие FPSы не удалось, поэтому думаю, может я что-то неправильно делаю? Ведь на том же miniclips.com куча флэш-игр, с нормальной анимацией и нагрузкой на проц не больше 20-30%...

Nirth 15.01.2006 14:08

Насчет частоты кадров, поищи у Роста в блоге ( flash-ripper.com ) он писал, но возможно придеться перерыть не один десяток страниц.

Кроликов 20.01.2006 18:33

Всё-таки еще раз подниму этот вопрос. Есть вот такой простой пример: http://www.knod.ru/wave.swf

Вот код, который рисует эту волну:
Код:

// Объявляю переменные
var screenHeight: Number;
var steps: Number;
var step: Number;
var i: Number;
var X = Array(), Y = Array();
var dX: Number;

// Задаю начальные значения переменных
screenHeight = 400;
steps = 13;
step = 50;
dX= 2;

// Расчет параметров волны
for(i = 0; i <= steps; i++){
        Y[i] = screenHeight - 20 - Math.random() * step;
        X[i] = i * step - step;
}

// Отрисовка волны
function wave()
{
        clear();
        for(i = 0; i <= steps; i++)X[i] -= dX;
       
        lineStyle (4, "0x000000", 100);
        moveTo(-step, screenHeight);
        beginFill("0x0000FF");
        lineTo(X[0], Y[0]);
        for(i = 0; i <= steps - 1; i++)curveTo(X[i], Y[i], (X[i+1] + X[i]) / 2, (Y[i+1] + Y[i]) / 2);
        lineTo(X[steps], screenHeight);
        endFill();                       
       
        // Если координата Х уехала за пределы экрана, сдвигаю все координаты на 1 вправо
        // и генерирую новую крайнюю правую координату
        if(X[0] <= -10 )
        {
                for(i = 1; i <= steps; i++)
                {
                        X[i - 1] = X[i];
                        Y[i - 1] = Y[i];
                }
                Y[steps] = screenHeight - 20 - Math.random() * step * 2;
                X[steps] = X[steps - 1] + step;
        }
       
}

// main
setInterval(wave, 10);

С таким сетинтервалом отрисовка идет со скоростью 100 кадров в секунду, но при этом все-равно наблюдается раздвоение "волны", которое особенно заметно на линиях которые близки к перпендикуляру. Есть ли какие-то средства для борьбы с этим эффектом?

MIX-er 20.01.2006 18:38

а ты не подулал что он ресует тоже не моментально?

Кроликов 20.01.2006 18:47

Цитата:

Сообщение от MIX-er
а ты не подулал что он ресует тоже не моментально?

Подумал, дальше-то что? Какое предлагаешь решение проблемы? Можно ли реализовать двойниую буферизацию во флэше?

Кроликов 20.01.2006 18:50

К тому же обычно, если не использовать двйную буферизацию, мерцает весь экран, целиком, а не отдельные объекты на нем... То есть создается впечатление что не в этом дело... Хотя я могу ошибаться...

Antares 20.01.2006 18:58

Класс Tween -- плавнее движение вам сделать не удастся.

Кроликов 20.01.2006 19:10

Спасибо, сейчас покапаюсь.


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

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