AIMP4: Skin Engine — оптимизации

Прошлые статьи по теме:

  1. AIMP4: Skin Engine
  2. AIMP4: Skin Engine — элементы управления. Часть 1
  3. AIMP4: Skin Engine — элементы управления. Часть 2
  4. AIMP4: Skin Engine — пользовательские локализации
  5. AIMP4: Skin Engine — графика

 

Многопоточная обработка

Ни для кого не секрет, что в современном мире преобладают многоядерные компьютеры, даже телефоны сейчас выпускают с 4-х ядерными процессорами. Поэтому отдельное внимание я уделил распараллеливанию алгоритмов, что используются не только в скин-движке, но и во всем плеере. Что же касается скин-движка, распараллеливанию подверглись два самых медленных алгоритма: вывод текста на полупрозрачном фоне и размытие.

Рендеринг

Заливка цветом

Фоновые элементы TASELayoutTexture, TASELayoutContainer и TASELayoutSplitView обзавелись свойством Color, которое позволяет залить фон элемента выбранным цветом (в том числе полупрозрачным), тем самым уменьшив расход памяти и повысив скорость отрисовки. Новое свойство будет полезным для скинов с монотонными фоновыми текстурами.

Прозрачные кадры

Некоторые элементы имеют строгий набор кадров, например: 1-ый кадр — фон, 2-ой кадр — «крышка», 3-ий кадр — маска. Но что делать, если нам нужна маска, но не нужна «крышка»? Правильно — делаем второй кадр полностью прозрачным. Но в таком случае второй кадр будет накладываться поверх содержимого элемента в момент отрисовки, хотя по сути он несет никакой полезной информации.

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

Расшаривание текстур

В скин-движке версии 3.50 впервые была введена упаковка одинаковых ресурсов в скомпилированном файле обложки, этот подход позволил немного уменьшить размер получаемого скина, если в нем использовались одинаковые ресурсы, в частности, текстуры.

В 4-ой версии я пошел дальше — теперь одинаковые текстуры хранятся в памяти плеера в единичном экземпляре, даже если используются несколькими элементами. Так же, как и раньше, упаковка одинаковых текстур происходит на этапе комплияции скина.

Недавно я упоминал, что новые свойства для отражения содержимого элемента позволят сэкономить на ресурсах. Пришло время прояснить этот момент.  Бывают ситуации, когда два элемента отличаются друг от друга лишь отражением текстуры или порядком кадров (в случае TASEAnimator-а). В этом случае, более оптимальным будет задать одну и туже текстуру обоим элементам, и с помощью свойств элемента настроить нужный вид отображения. Таким образом вы сэкономите как на размере скина, так и на использовании им оперативной памяти.

Например, после введения этого функционала, объем потребляемой памяти стандартным скином «Pandemic» уменьшился на 10%.

AIMP4: Skin Engine — оптимизации: 6 комментариев

  1. Zhenya

    В 4-ой версии я пошел дальше — теперь одинаковые текстуры хранятся в памяти плеера в единичном экземпляре, даже если используются несколькими элементами. Так же, как и раньше, упаковка одинаковых текстур происходит на этапе комплияции скина.

    То есть текстуры будут автоматически сравниваться во время компиляции, и повторяющиеся отбрасываться?
    Или нужно будет вручную как-то «отмечать» повторяющиеся текстуры?

    Куда-то подевались записи в блоге с номерами 545, 546. А на предыдущей странице интервалы между записями ещё больше.

    1. Artem Автор записи

      То есть текстуры будут автоматически сравниваться во время компиляции, и повторяющиеся отбрасываться?

      Да

      Куда-то подевались записи в блоге с номерами 545, 546. А на предыдущей странице интервалы между записями ещё больше.

      На сколько я понимаю, движок хранит промежуточные редакции статей

Добавить комментарий