PDA

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


Leo45
09.07.2004, 21:10
Народ, я написал флеш-программу, но она ооочень жрет проц. мощь, так вот, может быть есть метод, узнать в какой момент какие переменные засоряют процессор, что-б оптимизировать код.
Спасибо...

З.Ы. исходник не буду выстовлять, т.к. никто не обязан разбираться в моем бордаке, а вот сам swf (http://iluvphp.hostge.com/grid.swf) на всякий, пожарный :-)

Елё
09.07.2004, 21:30
коментируешь часть кода и смотришь на загрузку процессора ;)

Leo45
09.07.2004, 21:37
и все? :)

Iv
09.07.2004, 21:44
как посоветовать способ оптимизации кода, не имея его?
есть базовые принципы, но их описание - довольно большой объем инфы.
нужно смотреть на конкретный код, чтобы дать конкретные советы.

Leo45
09.07.2004, 22:22
Ради бога (http://www.iluvphp.hostge.com/grid .fla) :)

Iv
09.07.2004, 22:57
добрый ты.

дал бы еще ссылку на твою файловую систему
- нет таких прав говорит

Iv
10.07.2004, 00:11
а.. нет
ссылка была с пробелом
удалил пробел, скачалось.

Елё
12.07.2004, 18:24
Наверное можно еще что нибудь выжать.
но я старался ;)

Iv
12.07.2004, 23:37
да, на этот раз полегчало, но даже если убрать один из обходов:for (var i = 1; i<=col; i++) {
for (var j = 1; j<=col; j++) {
var sx, sy, mc, mc2;
mc = field['p'+i+' '+j];
mc.sx = mc.sy=0;
if (mc.left) {
mc2=mc.left
sx = (mc._x-mc2._x+dist)/frict;
sy = (mc._y-mc2._y)/frict;
mc.sx += sx;
mc2.sx -= sx;
mc.sy += sy;
mc2.sy -= sy;
}
if (mc.top) {
mc2=mc.top
sx = (mc._x-mc2._x)/frict;
sy = (mc._y-mc2._y+dist)/frict;
mc.sx += sx;
mc2.sx -= sx;
mc.sy += sy;
mc2.sy -= sy;
}
}
}
// */
for (var i = 1; i<=col; i++) {
for (var j = 1; j<=col; j++) {
mc = field['p'+i+' '+j];
if (!mc.dragged) {
mc._x -= mc.sx;
mc._y -= mc.sy;
}
}
}
// */
field.clear();
field.lineStyle(1, 0, 100);
for (var i = 1; i<=col; i++) {
var mc = field['p'+i+' 1'];
field.moveTo(mc._x, mc._y);
while (mc) {
field.lineTo(mc._x, mc._y);
mc = mc.bottom;
}
var mc = field['p1 '+i];
field.moveTo(mc._x, mc._y);
while (mc) {
field.lineTo(mc._x, mc._y);
mc = mc.right;
}
}
то все равно все довольно коряво. сорри.
смысл в том, что все эти переходы по кадрам - вчерашний день. И не юзабельны и оч трудно читаются.
Я на твоем месте сделал бы класс, тогда все быстро встает на свои места.

Не совсем то, что тебе нужно, потому как вникать в детали поведения твоего исходника влом, (ну нетрезв.. прости :p), но принцип, думаю, будет понятен:#initclip
this.setPointClass = function() {
var PointClass = function () {
arguments.callee.addListener(this);
if (PointClass._listeners[0] == this) {
this.first = true;
}
};
var tmp = PointClass.prototype=new MovieClip();
var centerPoint = {_x:0, _y:0};
tmp.onLoad = function() {
if (this.first) {
centerPoint._x = centerPoint._y=0;
this.onMessage("onCalcCenter", centerPoint);
}
this.x=this._x-centerPoint._x, this.y=this._y-centerPoint._y;
var d = Math.sqrt(this.x*this.x+this.y*this.y);
this.fric = .1-d/1000;
};
Object.registerClass("point_mc", PointClass);
AsBroadcaster.initialize(PointClass);
tmp.onMessage = function() {
PointClass.broadcastMessage.apply(PointClass, arguments);
};
tmp.onPress = function() {
this.onEnterFrame = this.recalcCenterPoint;
var p = this._parent, x, y;
this.onMouseMove = function() {
x=this._x=p._xmouse, y=this._y=p._ymouse;
this.onMessage("onChangeTarget", x-this.x, y-this.y), updateAfterEvent();
};
this.onMouseUp = function() {
this.recalcCenterPoint();
this.onMessage("onChangeTarget", x+this.x, y+this.y);
delete this.onMouseMove, delete this.onMouseUp, delete this.onEnterFrame;
};
};
tmp.recalcCenterPoint = function() {
centerPoint._x = centerPoint._y=0;
this.onMessage("onCalcCenter", centerPoint);
};
tmp.onCalcCenter = function(pt) {
var len = PointClass._listeners.length;
pt._x += this._x/len, pt._y += this._y/len;
};
tmp.onChangeTarget = function(x, y) {
this.xt=x-this.x, this.yt=y-this.y;
};
tmp.onEnterFrame = function() {
var x = centerPoint._x+this.x, y = centerPoint._y+this.y;
this._x += this.xst += (x-this._x)*this.fric, this._y += this.yst += (y-this._y)*this.fric;
this.xst *= .8, this.yst *= .8;
if (PointClass._listeners[0] == this) {
recalcCenterPoint;
}
};
var rm = MovieClip.prototype.removeMovieClip;
tmp.removeMovieClip = function() {
PointClass.removeListener(this), rm.apply(this);
};
};
this.setPointClass();
delete this.setPointClass;
#endinitclip

т.е. каждая точка должна думать о себе.
эээ ... залинкуй point_mc
и накидай их на сцену несколько штук... не важно куда
а код пихни в этот point_mc.

всех благафф

Елё
13.07.2004, 16:43
Код изначально не мой был...
так что я постарался оставить стиль автора
ведь задача оптимизировать, а не написать красиво

про первый цикл действительно тормознул. он совершенно не нужен.. ну а в остальном... мне кажется если заставить точки думать "за себя" то это будет конечно 'красивше'... но почти наверняка медленнее. Это как С++ и С. Конечно, гораздо приятнее делать код объектно ориентированным. Но если ты хочешь что бы код работал быстро про С++ можно забыть.

В данном случае, например, в лучае точки-объекта придется просчитать для каждой точки все 4 связи. А если это делать в цикле по порядку то достаточно просчитывать только две связи из-за симетрии

Но вообще интересно попробовать.. омжет действительно быстрее будет?

Iv
13.07.2004, 17:28
код автора полезен для изучения, для понимания того, чего сам догнать не смог или просто небыло на это времени.
но писать всегда нужно свое.

насчет OOP / не OOP стиля написания, скажу так:
если и в том и вдругом стиле использовать все возможности на все 100%, то OOP будет чуток тормозней, но далеко не настолько, чтобы этому придавать значение.
лучше алгоритм почитстить.