PDA

Просмотр полной версии : Оптимизация использования ресурсов


AlexCooper
23.02.2011, 10:50
Здравствуйте.
Ответьте пожалуйста на мои несколько вопросов на счёт оптимизации использования ресурсов Flash-плеером.
Может кто рылся или знает какие из этих вариантов более быстродействующей и менее ресурсоёмкие, или вообще нет разницы.
1. Аттач мувиклипа, к примеру объект с 4 подклипами у которых разные кейфреймы, но при атаче используется лишь одна.
1.1. Лучше атачить только нужный подклип
1.2. Родителський объект разбить на 4 кейфрейма, и после атачча использовать готуандСтоп
1.3. В родительском объекте при атаче выгружать или скрывать ненужные подклипы

2. Использовать централизованное хранение данных
function setRegister(object:String,define:String)
{
if (eval('register.'+object)!='[object Object]')
register[object] = new Object();

if (define)
register[object] = (Number(define)==define) ? Number(define) : define;
}

function getRegister(object:String)
{
return register[object];
}

3. А так же имеет ли смысл данная запись
function Define()
{
this.register = new Object();

setRegister('library');
setRegister('library.people','people_item');

setRegister('link');
setRegister('link.container','cont');
setRegister('link.peoplebox',getRegister('link.container')+'.peoplebox');
setRegister('link.peopleitem',getRegister('link.peoplebox')+'.items');
}

function Init()
{
Define();

//..........

for (peopls in peopleBox)
{
var cast :MovieClip = eval(getRegister('link.peopleitem'));
var depth :Number = cast.getNextHighestDepth();
var podcast:MovieClip = cast.attachMovie(getRegister('library.people'),'p_'+peopls,depth);

// set property for podcast
podcast._x = 0;
podcast._y = cast._height + 10;
//.......

delete podcast;
delete depth;
delete cast;
}
}
Init();
Суть в том что путя к мувиклипам берутся из "реестра" и присваиваются буферному мувику. Или же для ЦПУ проще такой алгоритм
for (peopls in peopleBox)
{
eval('cont.peoplebox.items').attachMovie('people_item','p_'+peopls,cont.peoplebox.items.getNextHighestDepth());

// set property for item
eval('cont.peoplebox.items.p_'+peopls)._x = 0;
eval('cont.peoplebox.items.p_'+peopls)._y = cont.peoplebox.items._height + 10;
//.......

}
Буду рад, если подскажите еще чё интересное что экономит время ЦПУ на обработку алгоритмов.

dark256
23.02.2011, 11:21
1. Чем меньше приаттаченного лишнего - тем лучше. Если даже элемент клипа имеет _visible=false, флэш его все равно прорисовывает. Это видно по Redraw Regions.

2. Про реестр вообще ничего не понял.
Если вам нужен массив с путями к клипам, то и храните эти пути. А все что надо из доп данных - вешайте себе прямо в клип.

мой_клип1.блок_данных.имя_свойства_1
мой_клип1.блок_данных.имя_свойства_2
мой_клип1.блок_данных.имя_свойства_3

И так далее. Как бы.

AlexCooper
23.02.2011, 11:39
Реестр я использую как массив (а точнее объект) данных, у меня он хранит практически всё. Очень удобно при написании кода. Ненужно запоминать длинные имена, нужно к примеру изменить свойство н-объекта,
eval(getRegister('link.н-объект')).prop = val; да и если какие коррективы вводятся достаточно изменить данные в реестре. Так же 100% доступность данных при разных "глубинах". + Трасировку всех данных можно произвести в два щелчка, но суть вопроса не в этом, есть ли разница между записями
var item :MovieClip = eval(clip);
item.prop1= val1;
item.prop2= val2;
......
item.propN= valN;
и
eval(clip).prop1= val1;
eval(clip).prop2= val2;
..............
eval(clip).propN= valN;

Добавлено через 1 минуту
Или Я слишком заморочился?)

Добавлено через 5 минут
За п1. Спасибо

Stargazer
23.02.2011, 12:25
Прежде всего, могу предположить, что вам на самом деле не нужна подобная оптимизация. Если вы чувствуете, что ваша работа потребляет слишком много ресурсов - то, вероятно, ресурсы расходуются по каким-то другим причинам, нежели те пункты, что вы привели.


По-первому вопросу. Я считаю, что dark256 недостаточно обосновал своё мнение.

Я работаю с флешем постоянно уже 3 года и, можно сказать, что я профессионал в этом, однако я замеров такого рода не производил.

Насколько я знаю, флеш не стремится хранить в памяти те подклипы, которых в данный момент нет в кадре (не visible=false, а именно нет). Если вы перейдёте на другой кадр - флеш, по идее, освободит ненужные теперь подклипы и отправит их к сборщику мусора, и займётся созданием новых клипов, которые появились в этом кадре.

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


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

AlexCooper
23.02.2011, 12:53
2 Stargazer: Спасибо за изучение вопроса и ответ.
На данном этапе в фулскрине мувик при наделению мною максимальной нагрузки (перемещение всей сцены) Деспетчер задач показывает до 30% нагрузки на ЦП и при нормальном режиме до 10%, правда это еще малая часть проекта но считаю пока не плохим результатом.

Котяра
23.02.2011, 14:15
Самый главный совет: Переходите на AVM2 (as3).Там тоже нужна оптимизация, но во первых - сам рендер гораздо быстрее, во вторых - гораздо больше возможностей по разделению в самом языке.

Хемуль
23.02.2011, 14:21
На данном этапе в фулскрине мувик при наделению мною максимальной нагрузки (перемещение всей сцены) Деспетчер задач показывает до 30% нагрузки на ЦП
Редкие флешки, даже созданные грамотными разработчиками, показывают хорошую производительность в полноэкранном режиме, если внутри них производится анимация более-менее приличного количества обьектов. Котяра вам верный совет дал - переходите на более современные версии Flash-платформы, будет быстрее. Но всё равно не сильно надейтесь на то, что полноэкранная флешка будет "летать".

AlexCooper
23.02.2011, 14:51
На счёт полноэкранного режима я полностью с Вами согласен. Да и за АS3 согласен, но перейти смогу уже ближе к лету, когда закончиться контракт, сейчас же абсолютно нет времени и возможности переходить на третью версию экшена, а очень хочется, потому приходиться извращаться и подымать производительность по самым мелким "деталюшкам".

Hauts
23.02.2011, 15:10
1. Чем меньше приаттаченного лишнего - тем лучше. Если даже элемент клипа имеет _visible=false, флэш его все равно прорисовывает. Это видно по Redraw Regions.

Если cacheAsBitmap = true у элемента, то не перерисовывает.