PDA

Просмотр полной версии : Вопрос оптимизации


Ravanger
31.08.2007, 14:09
Доброго времени суток, форумчане!

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

исходник прилагаю
17601

прошу не судить строго, это мой первый опыт
Зарание благодарен

что, желающих нет?

Блин, че, посмотреть тяжело?

etc
02.09.2007, 19:04
Плюс за ап темы.
Здесь вам никто ничего не должен, это не служба поддержки, вам ответят только тогда, когда захотят.

DarkLight
02.09.2007, 19:24
1) зачем ставить интервалы в 10 мс и при этом фпс 12?
2) у меня использование процессора колеблется в пределах 18-25%, имхо приемлимо.

CrazyFlasher
02.09.2007, 19:54
у меня не тормозит. 10-15%
P.S. флэш почти не нагружает оперативку...больше всего процессор

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

Ravanger
03.09.2007, 12:01
__etc извини, не буду больше

ребят, сначала не нагружает, но стоит монстрам появится раз в 4-5 й начинает подтормаживать

немного не понял по поводу интервалов, ты про какие?

Mr. Fixit
03.09.2007, 14:13
вы сами написали код?

Ravanger
04.09.2007, 12:36
Да, сам, правда спрайт монстра спер, надоели летающие треугольники))

CrazyFlasher
04.09.2007, 12:57
ребят, сначала не нагружает, но стоит монстрам появится раз в 4-5 й начинает подтормаживать

а removeMovieClip используете?

Ravanger
04.09.2007, 14:01
а removeMovieClip используете?

да, в том то и дело, что я не знаю, что вызывает тормоза...

Ravanger
07.09.2007, 11:13
еще аопрос, как поставить у мувика который распологается на столе руками глубину больше чем у мувиков которые аттачатся, или прийдется его так же аттачить?

Psycho Tiger
07.09.2007, 13:31
removeMovieClip(eval("unit"+m));

Омг, не знал что так кто то ещё пишет...
А игра для 1 раза очень хорошая...

Вот нашел, возможный баг:
Врагу засадили пулю:

createDeadBody(unitArr[m]._x, unitArr[m]._y);
removeMovieClip(eval("unit"+m));
MonsterOnField--;

Юнит упал, создаем мертвое тело:

function createDeadBody(bodyX:Number, bodyY:Number):Void {
dead[deadCounter] = attachMovie("deadBody", "deadBody"+deadCounter, deadCounter);
dead[deadCounter]._x = bodyX;
dead[deadCounter]._y = bodyY;
dead[deadCounter].timer = getTimer();
cleanTable();
deadCounter++;
}

Мы вызвали функцию клинТэйбл(), давайте посмотрим, что же делает она:


function cleanTable():Void {
for (var i = 0; i<dead.length; i++) {
if (getTimer()-dead[i].timer>2000) {
removeMovieClip(eval("deadBody"+i));
delete dead[i];
}
}
}

Красиво и элегантно, функция вызвается сразу после убийства.
Итого:
1) Труп будет лежать (невидимый из за анимации, но все же) даже когда пройдет 2 секунды - он исчезнет только после следуйщего вызова функции (т.е. при следуйщем убийстве)
2) Этот пункт мне нравится больше всего =)) при убийстве мы пихаем в масив dead трупов... после убираем их трупов но... из масива то мы не убираем их! Итого, после 5-6 раза, цикл вместо своего 20 раз при убийстве противника крутиться 100+ раз) Вот тебе и тормоза =Ъ

ARTur2
07.09.2007, 13:32
_root.клип_который_лежит_на_сцене.swapDepths(1000);

Это по поводу глубины

Psycho Tiger
07.09.2007, 13:33
Млин, извиняюсь, поправочка: мы убиваем лишь номер трупа и его значения, т.е. у нас масив будет идти так
dead[0]=...
dead[1]=... // убиваем
dead[2]=...

После получается что масив у нас вот такой:
dead[0]
dead[2]

deadCounter мы не понижаем на единицу, поэтому после 5-6 раза длина масива и будет равна 100+... почти тоже самое что я написал выше, но все же... поправа есть поправка)

Ravanger
07.09.2007, 15:33
removeMovieClip(eval("unit"+m));

Омг, не знал что так кто то ещё пишет...


а как правильно, вернее как пишут сейчас?))

по поводу массива благодарю, не учел, исправлю

_root.клип_который_лежит_на_сцене.swapDepths(1000);


Это по поводу глубины


Благодарю!

Psycho Tiger
08.09.2007, 16:32
Вместо eval("unit"+m) пишут mc["unit"+m]
Т.к. mc у тебя _root (т.е. главная стцена), то _root["unit"+m]

Все же, пиши как хочеш, все эти стандарты ООП... Работает, и ладно, а компилятор сам вставит все как надо в 90% случаев, ИМХО

Насчет swapDepth, если у вас флэш 7+, то разумнее было бы использовать
mx.behaviors.DepthControl.bringToFront(your_mc);
Почему разумнее? Ибо в большем проекте, вы можете просто позабыть, что глубина 1000 у вас уже занята, что приведет к нежелательному эффекту, тут же все будет работать на ура.

Ravanger
08.09.2007, 16:42
да, с занятой глубиной уже столкнулся, особенно с теми мувиками глубина которых изменяется динамически... Спасибо!

кста, по поводу cleanTable() он у меня в той функции вызывался только при отладке(функция другой вид имела), она также в _root.onEnterFrame() и нормально себя чувствует, просто тот вызов забыл убить)

Kikasso
09.09.2007, 06:52
function createDeadBody(bodyX, bodyY){
trup = attachMovie("deadBody", "deadBody"+deadCounter, deadCounter);
trup._x = bodyX;
trup._y = bodyY;
trup.timer = getTimer();
dead.push(trup);
cleanTable();
deadCounter++;
}
function cleanTable():Void {
var arr = new Array();
var trup;
var t = getTimer() - 2000;
while( dead.length ){
trup = dead.pop();
if( trup.timer > t )arr.push( trup )
else trup.removeMovieClip();
}
dead = arr;
}
Типизацию сами поставите. И выставьте fps в 31.
И мне не нравятся 13-14 строчки. Зачем time добавлено к массиву мертвых?
Остальное не смотрел.

etc
09.09.2007, 12:01
Kikasso, какой смысл в типизации в AS1? :)

Psycho Tiger
09.09.2007, 16:07
Видать, я совсем отупел...
Насколько я понимаю, типизация - это когда каждая переменная раскладывается по типам, т.е. мы не можем из бывышего Number`a сделать String.
Если я прав,то она нужна везде, особенно в ас 1, ибо она заставляет работать программу быстрее.
Ыть. Сам рекомендую, а юзая менее чем в 10% случаев XD

Mr. Fixit
09.09.2007, 16:08
извиняюсь, что отвечаю(т.к. не у меня спросили), но типизация никакой роли для AS1 не играет, но для понимания разработчиком, к какому типу переменная относиться знать желательно, да и для будущего использования в AS2 полезно. ;)

etc
09.09.2007, 16:14
Видать, я совсем отупел...
Насколько я понимаю, типизация - это когда каждая переменная раскладывается по типам, т.е. мы не можем из бывышего Number`a сделать String.
Если я прав,то она нужна везде, особенно в ас 1, ибо она заставляет работать программу быстрее.
Ыть. Сам рекомендую, а юзая менее чем в 10% случаев XD
В AS1 особого смысла в использовании нет. В AS2 — потому что так правильно. А на деле никакой типизации в AS1/AS2 нет. В принципе, типизацию писать в AS1 коде можно, даже может помочь в поиске ошибок, но только простых, какие легко отлавливает компилятор. На практике простые ошибки случаются редко и типизация в данном случае роли не играет.

Mr. Fixit
09.09.2007, 17:53
типизация существует для понятного кода девелоперу, и для отладчика, который правильнее покажет проблему ошибки...

etc
09.09.2007, 18:09
типизация существует для понятного кода девелоперу, и для отладчика, который правильнее покажет проблему ошибки...
Что такое «проблема ошибки»?
Лишь в некоторых случаях использование типизации поспособствует отлову ошибки, но таких случаев довольно мало и они довольно тривиальные.

Mr. Fixit
09.09.2007, 18:37
Что такое «проблема ошибки»?
это тавтология, кажеццо

Kikasso
09.09.2007, 18:58
Kikasso, какой смысл в типизации в AS1? :)
У автора в исходнике стояла. А вообще самые простые ошибки дольше всего искать.))

Mr. Fixit
09.09.2007, 19:01
Смотря какие ошибки :Р

Psycho Tiger
10.09.2007, 10:31
Странно... а какую роль оно играет в ас2?

etc
10.09.2007, 10:42
Для AS2 есть нормальные инструменты для разработки, которые учитывают типизацию. Кроме того, в AS2 применение типизации обязательно, даже если она работает также, как в AS1.

CrazyFlasher
10.09.2007, 12:00
class Haha {
private var num:Number;

public function Haha() {
this["num"] = "hello"
trace(num);
}
}

типизация в АС2.0 - лирика ;-)

etc
10.09.2007, 13:22
class Haha {
private var num:Number;

public function Haha() {
this["num"] = "hello"
trace(num);
}
}

типизация в АС2.0 - лирика ;-)
Обмануть компилятор можно (ведь AS2 совместим с AS1 по байткоду). Можешь не использовать типизацию в AS2, если считаешь её бесполезной. И в AS3 тоже можно не использовать типизацию. В AS1 типизация — что запорожцу движок от BMW. О какой типизации может идти речь, если код, графика, данные лежат в куче? В AS2 — другое дело.

CrazyFlasher
10.09.2007, 15:30
нее...я ЗА типизацию...и даже в АС1.0. Код более читабельный и приятный для просмотра и работы

Ravanger
11.09.2007, 16:30
я еще с паскаля в школе привык типизировать переменные) хорошая практика, хотя в случае скриптовых языков и не очень полезная