![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Здравствуйте
У меня задание собрать из секвенции рендеров крутящуюся машинку. Причем, она разделена на бампер, стекла, колеса итд. То есть для каждой из деталей по 36 картинок секвенции поворота авто. Как быстрее будет работать "поворот" машинки: - сложить все в кучу и менять visible - addChild/removeChild определенной части машинки Для наглядности прикрепил 2 скрина. Красным выделяется та часть авто, на которую наведена мышка. P.S. Я пока сделал смену visible, но при первом повороте наблюдаю тормоза. После первого прохода по секвенции (поворота авто) тормоза пропадают. Причем, если поворот влево полностью прошел, тормоза пропали для поворота влево, для того чтобы пропали торомоза при повороте вправо нужно прогнать один раз этот поворот вправо. |
|
|||||
|
А менять битмапдату у битмапы?
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
|
надо попробовать, спасибо за совет.
|
|
|||||
|
.
|
Попробуйте перед отображением машинки пробежаться и вызвать Bitmap#bitmapData у всех Loader#content или ссылок на них. Просто так, дернув этот геттер. Есть мнение, что при этом реально происходит разворачивание битмапдаты в ОЗУ.
|
|
|||||
|
К сожалению, ни один из способов не дал ощутимого прироста в производительности.
Я сделал смену битмап даты у битмапы + дернул .bitmapData свойство у каждой из битмап после создания. Выявилась еще одна проблема: подозреваю что GC убивает битмапы, которые на данный момент содержатся в массиве, но не показываются. Такое может быть ? Также хотел бы спросить, возможно какой-нибудь Stage3D фрэймворк показал бы производительность повыше, при операции смены больших картинок друг другом ? |
|
|||||
|
Banned
Регистрация: Mar 2013
Сообщений: 1,864
|
По ответу складывается впечатление, что Вы немного не так поняли.
Нужно после загрузки всех картинок, вынуть из них BitmapData и сложить в массив. Затем создать одну Bitmap и каждый кадр, вместо addChild(img), делать bitmap.bitmapData = bitmapDatas[i];. Добавлено через 5 минут И ещё вопрос - Вы сказали, что каждый кадр ( машина в целом виде ), состоит из нескольких картинок. Много их? Вы их в общею BitmapData отрисовываете? Добавлено через 11 минут Вам как минимум нужно вытащить все BMD и сложить их в массив. Дальше не понятно, у Вас части машин меняются? То есть стекла, фары, колеса? Это я спрашиваю для того, что нужно все части полюбому отрисовать в один кадр. И вот если части не меняются, то первичный массив с частями можно удалить и удалить из памяти все BMD. А дальше сделать одну BM и каждый кадр присваивать его bmd, bmd полной машины из массива. Больше уже не чего вроде и сделать нельзя. И если это не поможет, то Starling. |
|
|||||
|
Машинка в один момент времени это от 5 до 10 частей в зависимости от модели
- колеса - передние фары - задние фары - итд То есть если 36 кадров на один поворот вокруг своей оси, то 5-10 * 36 = столько картинок нужно загрузить для одного поворота машины с таким набором частей. Каждую из деталей нужно менять, подгружая наборы рендеров. Каждую из деталей нужно окрашивать. Должна иметься возможность кликнуть на машинку и та часть, на которую кликнули (капот, допустим) должна выделиться (цветом, например). Общую битмап дату я не отрисовываю по вышеперечисленным причинам. Все битмапы (правда, не BMD) я складываю в массив, верно. Затем в зависимости от текущего кадра подставляю в капот элемент массива капота (kapotBitmap.bitmapData = kapotBitmaps[currentFrame].bitmapData) На данный момент проблема в очень больших рендерах (1024x600) для каждой из частей каждой из картинок. Я заказчику указал на то что "воздух" в рендерах нужно вырезать, надеюсь это увеличит производительность. Про GC ничего не известно в данной картине ? P.S. Как вы думаете Старлинг пошустрее будет ? |
|
|||||
|
Banned
Регистрация: Mar 2013
Сообщений: 1,864
|
Тут вот какое дело - я Вам советую, то, что кажется разумным, но сам я такого не делал
![]() я говорю, как бы я сделал. Смотрите - первое что нужно выяснить, занимает ли в памяти место, сто процентная прозрачность. Если да, то зачем тогда иметь битмапдату разразмером 1024x600, когда на ней 300х300 только нарисовано. Значит нужно обрезать максимум, и вычислить координаты. Это уже плюс к производительности. Второе - с самого начала и до конца, модели частей имеют одну и туже форму, значит можно создать 36 кадров, на каждом из которых будет отрисована вся машина, но только каждый элемент своего цвета. Допустим, большая часть - черного цвета, чуть поменьше - на одну циферку больше чем черный цвет. Это получится карта для кликов, кликнув по по машине, Вы будете брать цвет с этих битмапдат и смотреть куда кликнули. Это даст шанс отрисовывать все части в одну битмапдату. Битмапдаты которые с настоящей машиной перерисовывать каждый кадр смысла нет, только когда что-то изменится. Вам нужно прям отдельные класса рендера писать. Так что лучше старлинг использовать. Добавлено через 41 минуту Перечитал Ваши слова ещё раз и - в массивах хранить BMD, все части одного кадра отрисовывать в одну BMD, у единственной BM менять по кадрам bmd на отрисованный кадр. |
|
|||||
|
Антон Карлов в своих статьях говорил о том, что один цельный объект, пусть огромный, но обрабатывается быстрее, чем если бы он состоял из сотни мелких.
__________________
There is no thing in this world that is not simple. |
|
|||||
|
В целом, производительность выросла после того как я убрал "воздух" из каждой из PNG для каждой из деталей. Теперь нет тормозов и мороки с первым "прогоном" цикла картинок. Что касается одной БМД (BMD), ну, хз, как она мне пригодится если после остановки пользователь должен иметь возможность выбрать или фары или капот или еще что-то. Замечу также что пользователь должен иметь возможность у этих капотов итд сменить цвет. То есть для того чтобы сделать в одной БМД мне нужно будет:
1) прогнать один круг из ВСЕХ частей, создав 36 БМД смерженых(merge layers, грубо говоря) кусков в одну машинку 2) если воспроизведение поставили на паузу, опять накладывать все части авто друг на друга чтобы дать возможность выделать мышкой капот итд на машинке Стоит ли это сложностей связанных с дополнительным программированием, не совсем уверен... Хотя, нужно попробовать. P.S. Если не в массив а в вектор запихнуть БМД-шки, теоретически еще побыстрее будет доступ ? |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:30. |
|
|
« Предыдущая тема | Следующая тема » |
|
|