Поиск…


Векторная графика

Векторные графические изображения представлены множеством данных, которые должны вычисляться ЦП (векторные точки, дуги, цвета и т. Д.). Все, кроме простых фигур с минимальными точками и прямыми линиями, будет потреблять огромное количество ресурсов ЦП.

Существует флаг «Кэш как битмап», который может быть включен. Этот флаг хранит результат рисования векторного объекта DisplayObject для более быстрого перерисовки. Ловушка этого заключается в том, что если есть какие-либо преобразования, применяемые к объекту, все это нужно перерисовать и повторно кэшировать. Это может быть медленнее, чем вообще не включать его, если применяются кадровые преобразования (вращение, масштабирование и т. Д.).

Как правило, рендеринг графики с использованием растровых изображений намного более эффективен, чем использование векторной графики. Библиотеки, такие как flixel, используют это для рендеринга спрайтов на «холсте» без снижения частоты кадров.

Текст

Текст рендеринга потребляет много CPU. Шрифты отображаются так же, как векторная графика, и содержат множество векторных точек для каждого символа. Изменение кадрового покрова приведет к ухудшению производительности. Флаг «Cache as bitmap» чрезвычайно полезен, если используется правильно, что означает, что вы должны избегать:

  • Часто изменяйте текст.
  • Преобразование текстового поля (поворот, масштабирование).

Простые методы, такие как перенос текстовых обновлений в оператор if будут иметь большое значение:

if (currentScore !== oldScore) {
    field.text = currentScore;
}

Текст можно визуализировать с помощью антиалиасированного рендерера, встроенного в Flash, или с помощью «шрифтов устройства». Использование «шрифтов устройства» делает визуализацию текста намного быстрее, хотя при этом текст кажется зазубренным (aliased). Кроме того, шрифты устройства требуют, чтобы шрифт был предварительно установлен вашим конечным пользователем, или текст может «исчезнуть» на ПК пользователя, хотя он выглядит отлично на вашем компьютере.

field.embedFonts = false; // uses "device fonts"

Вектор и для каждого массива vs и для

Использование Vector.<T> Типа и for each цикла является более производительным , чем обычный массив и for цикла:

Хорошо:

var list:Vector.<Sprite> = new <Sprite>[];

for each(var sprite:Sprite in list) {
    sprite.x += 1;
}

Плохой:

var list:Array = [];

for (var i:int = 0; i < list.length; i++) {
    var sprite:Sprite = list[i];

    sprite.x += 1;
}

Быстрое удаление элементов массива

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

Когда вы splice() массив, индекс последующих элементов в этом массиве должен быть уменьшен на 1. Этот процесс может потреблять большой кусок времени, если массив большой, а объект, который вы удаляете, ближе к началу этого массива ,

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

Пример:

function slowRemove(list:Array, item:*):void {
    var index:int = list.indexOf(item);
    
    if (index >= 0) list.splice(index, 1);
}

function fastRemove(list:Array, item:*):void {
    var index:int = list.indexOf(item);

    if (index >= 0) {
        if (index === list.length - 1) list.pop();

        else {
            // Replace item to delete with last item.
            list[index] = list.pop();
        }
    }
}

Векторы вместо массивов

Flash Player 10 представил тип Vector. <*>, Который был быстрее, чем массив. Однако это не совсем так. Только следующие типы Vector быстрее, чем аналоги Array, благодаря тому, как они реализованы в Flash Player.

  • Vector.<int> - вектор 32-битных целых чисел
  • Vector.<uint> - вектор 32-разрядных целых без знака
  • Vector.<Double> - вектор 64-битных поплавков

Во всех других случаях использование массива будет более эффективным, чем использование векторов, для всех операций (создание, манипуляция и т. Д.). Однако, если вы хотите «сильно напечатать» свой код, вы можете использовать Vectors, несмотря на замедление. FlashDevelop имеет синтаксис, который позволяет выпадающим /*ObjectType*/Array завершения кода работать даже для массивов, используя /*ObjectType*/Array .

var wheels:Vector.<Wheel> // strongly typed, but slow

var wheels:/*Wheel*/Array // weakly typed, but faster

Повторное использование и объединение графики

Создание и настройка объектов Sprite и TextField во время выполнения может быть дорогостоящим, если вы создаете сотни тысяч из них на одном кадре. Поэтому общий трюк - это объединение этих объектов для последующего повторного использования. Помните, что мы просто не пытаемся оптимизировать время создания ( new Sprite() ), а также конфигурацию (настройку свойств по умолчанию).

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

var pool:Array = [];

if (pool.length > 0){

    // reuse an existing TextField
    var label = pool.pop();

}else{
    // create a new TextField
    label = new TextField();
    
    // initialize your TextField over here
    label.setDefaultTextFormat(...);
    label.multiline = false;
    label.selectable = false;
}

// add the TextField into the holder so it appears on-screen
// you will need to layout it and set its "text" and other stuff seperately
holder.addChild(label);

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

foreach (var label in allLabels){
    label.parent.removeChild(label); // remove from parent Sprite
    pool.push(label); // add to pool
}

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow