3D паралакс слои, препятствующие частоте кадров Flash - PullRequest
0 голосов
/ 18 ноября 2009

Я создал эффект Паралакса во Flash 10, где у меня есть около 5 слоев, каждый из которых расположен на отдельной оси Z. Эти 5 слоев были сгруппированы в символ, поэтому при перемещении символа вокруг его осей x и y слои перемещаются в трехмерной перспективе, как и ожидалось.

Нам нужно динамически визуализировать текст на каждом слое, но проблема в том, что я использую addChild () для добавления textFields к этим слоям для отображения текста, и это приводит к резкому замедлению частоты кадров, примерно до 12 кадров в секунду.

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

Как я мог получить больше производительности от этого? Было бы лучше использовать что-то вроде PixelBender (то есть, если я могу динамически визуализировать текст в PixelBender), или здесь вам поможет 3D-движок, такой как Away3D или Papervision?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Визуализация текста в pixelbender была бы совершенно сумасшедшей. Есть гораздо более простой способ.

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

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

class Parallax
{
    public var sprite:DisplayObject;
    public var offset:Number = 1;

    public function ParallaxedSprite(sprite:DisplayObject, offset:Number) {
        this.sprite = sprite;
        this.offset = offset;
    }

}

Как только этот класс создан, мы добавляем каждый из клипов / спрайтов, которые мы хотим параллаксить в массив:

var _sprites:Array = [  new ParallaxedSprite(foo, 1), 
                        new ParallaxedSprite(bar, .75), 
                        new ParallaxedSprite(baz, .5) ];

(квадратные скобки - сокращение для создания массива)

Затем, каждый кадр мы перебираем по списку и устанавливаем смещения соответственно:

var offsetX:Number = 100;
var offsetY:Number = 100;

for each (var parallax:Parallax in _sprites) {
    parallax.sprite.x = offsetX * parallax.offset;
    parallax.sprite.y = offsetY * parallax.offset;
}

И, наконец, чтобы получить последнее повышение скорости, установите свойство cacheAsBitmap для ваших спрайтов:

foo.cacheAsBitmap = true;
bar.cacheAsBitmap = true;
baz.cacheAsBitmap = true;

Обратите внимание, что cacheAsBitmap ускорит отрисовку ваших спрайтов до тех пор, пока они не преобразуются, но как только вы преобразуете их с этим набором, у вас появятся дополнительные затраты на воссоздание этого кэша, поэтому, если вы планируете вращать / масштабировать много лучше оставить.

0 голосов
/ 18 ноября 2009

Попробуйте свести к минимуму «перерасход». Overdraw - это количество раз, когда вы перерисовываете пиксель (или область) на экране, пока не будет визуализирован последний кадр.

Итак, предположим, что у вас есть 5 слоев параллакса, и первый полностью непрозрачен, а рисование остальных 4 - полная трата времени.

Определяя, какие части ваших слоев видны, и рисуя только эти области, вы сохраняете много «перерисовок» и тем самым ускоряете его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...