[Starling] Тормози меня плавно!
Запись от dimarik размещена 28.10.2014 в 22:34
После выхода из бакграунда с потерей контекста на андроид-устройствах встретился с довольно неприятной Starling-фичей. Она называется QuadBatch#registerPrograms(). Эта штука начинает заново компилить в AGAL то, что она уже разок скомпилила. На выхлопе мы получаем офигевший GC от мусора, производимым AGALAssembler, в основном, от операций над String, полем которым является листинг шейдеров, представленных в этой самой QuadBatch#registerPrograms(), а также сам процесс компила в ByteArray.
Итого. Повторный компил + уборка мусора = 50% + 50% в относительном сравнении.
Я вышел из положения, сделав предварительно скомпиленный файл с этими же шейдерами и lazy initialization запрашиваемых программ. Файл с программами заэмбеддил в приложение (Embed[source="shaders.sdr"]).
З.Ы. конструкция типа
каждый новый вызов вне блока создаст новый массив из [true, false]. Очень неприятно, что это во вложенных вызовах O(n^2).
Всего комментариев 7
Комментарии
28.10.2014 23:12 | |
Я пару слов знаю, что тут написаны. И одно вроде понял.
Можно было еще в названии добавить "(просто о сложном)", чтобы добить мою самооценку. :о)) |
29.10.2014 00:15 | |
GBee - ну так это тематическая вещь о Старлинге. Если ты знаком с ним и работаешь с ним, то тебе не должно быть непонятно. А если ты не в теме - то плакать о самооценке не стоит )))
|
30.10.2014 00:25 | |
Димка, ты начал выражаться непонятно, как программист прям.
|
30.10.2014 12:19 | |
dimarik, я имел в виду в рантайме силами движка. Можно, конечно, просто кэшировать результат на случай потери контекста.
|
30.10.2014 19:41 | |
Новый Контекст просит загрузить в него программу, созданную в его контексте, простите за каламбур. Программа3д просит загрузить в нее шейдеры в виде ByteArray. Это все что я знаю. А каким способом они будут получены и когда — сгенерированы ли в рантайме или созданы заранее — ее не интересует. Для фильтров, например, я воспользовался созданием в рантайме и кэшированием.
По поводу сложности O(n^2), как вы думаете, сколько будет создано массивов в приведенном ниже псевдокоде? for each (a in new Array(2) ) { for each (aa in new Array(2) ) { for each (aaa in new Array(2) ) { } } } Я могу быть неточен в определении сложности. Кому интересно, есть хорошая статья на хабре. |
|
Обновил(-а) dimarik 30.10.2014 в 21:40
|
Последние записи от dimarik
- Memory allocation на Vector.<IInterface> (07.05.2015)
- [Starling] Тормози меня плавно! (28.10.2014)
- [Starling идиотизмы] Об интерактивных событиях (02.10.2014)
- О типах исключений. (23.04.2014)
- Немного о Vector и ByteArray (28.03.2014)