Вход

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


wvxvw
17.01.2007, 01:26
Доброго времени суток!

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

Итак, вопрос №1:
Имеется клип сформированный из однотипных элементов который можно описать как
"абвгд"; а,б,в,г,д,е...;
"абвгд"; а,б,в,г,д,е...;
"абвгд"; а,б,в,г,д,е...;
"абвгд"; а,б,в,г,д,е...;
Где "абвгд" - неменяющийся параметр, а второй параметр во время игры все время изменяется (уменьшается)
Вопрос в следующем, какой, с точки зрения быстродействия самый оптимальный способ отображения информации?
- аттачить нужное количество клипов?
- создать один клип с максимально возможным количеством клипов и если 1 клип не нужно отображать
1. уменьшать _alpha до 0
2. изменять _visible
3. создать клип с двумя кадрами и переключатся между ними (один кадр содержит информацию, другой - пустой)
Возможно есть другой вариант?

Вопрос №2:
Нужно сравнить 2 массива, члены которых тоже являются массивами.
Массив1: [[a, b, c, d], [a, b, c, d], [a, b, c, d]];
Массив2: [[a, d, c, f], [d, c, b, e], [e, j, a, c]]
В результате проверки не нужно узнавать какой из элементов "подмассива" массива соответствует другому в другом массиве, достаточно просто знать, что в первом и втором "подмассивах" имеются одинаковые члены.
Что лучше в таком случае?
for(i=0; i<_arr1.length; i++){
for(ii=0; ii<_arr2.length; ii++){
if(_arr1[i]==_arr2[i]){
// что-то сделать
break;
}
}
}
или
var _str = _arr1.join(",");
for(i=0; i<_arr2.length; i++){
if(_str.indexOf(_arr2[i])>-1){
// что-то сделать
}
}

Вопрос №3:
Слышал о том, что while работает быстрее чем for, есть ли действительно разница? Слышал еще и довольно странное мнение, что цикл вида
for(i=10; i>0;){
i--;
}Будет выполнятся быстрее чем
for(i=0; i<10; i++){
} Так ли это?

Вопрос №4:
Что быстрее перебрать циклом, свойства объекта или члены массива, узлы ХМЛя (мало ли, а вдруг...)?

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

Заранее спасибо.

miramax
17.01.2007, 02:02
№1 - не совсем понял вопроса, но навярняка visible.
№2 - если элементов много, то вызов метода - смерть . В АС3 это особенно заментно. В больших циклах нужно избегать indexOf();
№3 - В АС3 самый быстрый цикл

var i:int = 0
while(i<9999999)
{
// statements
i+=1 // именно i+=1
}
засчёт типизации в АС3 наблюдается афигенное ускорение. В АС2 разницы не замечал.
№4 - свойства объекта или элементы массива - разницы в АС2 нет. Лучше проверять свойства экземпляра класса (в ас3 у экземпляров классов будет многократное ускорение).
В больших циклах я стараюсь избегать использование методов и .... массивов =)
код

obj.x+=1 // где obj - экземпляр класса, в котом объевлен член x
// с точным типом var x:Number;
В АС3, сработает на порядок быстрее, чем

obj['x']+=1 // где obj , массив
В АС1/2 разницы нет.
З.Ы. - В АС2 все объекты -нетипизированные массивы. Поэтому большого смысла в такой оптимизации нет.

etc
17.01.2007, 03:14
В АС2 разницы не замечал.
И не заметишь :D. Её не существует. Как и AS2 в принципе.

aksios
17.01.2007, 10:07
Начет visible: надо еще stop добавлять, иначе будет кушать ресурс.

Nirth
17.01.2007, 10:50
З.Ы. - В АС2 все объекты -нетипизированные массивы. Поэтому большого смысла в такой оптимизации нет.

В AS1-2 все объекты это не массивы, а Хэш таблицы.

chingachgoog
17.01.2007, 13:15
вопрос №1 - вариант 3 - переход на пустой кадр.

Nirth
17.01.2007, 13:19
Вопрос первый вариант - "- аттачить нужное количество клипов"

wvxvw
17.01.2007, 13:43
Спасибо за ответы.

chingachgoog
Интересно было бы узнать почему. Дело в том, что проект мне достался "по наследству", и в нем очень много вещей, которые бы я делал именно меняя свойства клипа (перекрашивание, изменение формы и т.п.) сделаны именно переходом на другой кадр.

Попробую переформулировать первый вопрос. Похоже, получилось не понятно:
Есть много фактически одинаковых клипов состояших из какого-то фона и текстбокса. Их количество в течение игры меняется от макс. 288 до мин. 0, смена происходит раз в 3 секунды.
Вот собственно, хочу выяснить как, с найменьшей нагрузкой на процессор можно менять их состояние (заполнен\пустой).
С аттачем есть определенные сложности, чтобы их аттачить в нужном порядке приходится запускать еще 1 цикл (который не нужно запускать в случае, если они все уже существуют).

chingachgoog
17.01.2007, 15:36
Я имел в виду производительность связанную с появлением/убиранием мувиков со сцены.
Варианты с _alpha и _visible не катят, т.к. мувики продолжают нагружать процессор (например там идет анимация).
Вариант с аттачем уже лучше, но более сложен в реализации, чем вариант с пустым кадром. Что оптимальнее - через пустой кадр или аттач - не знаю.

PS покадровая анимация практически всегда быстрее чем программная или твиновая.