Просмотр полной версии : Оптимизациа ActionScript-а
Народ, я написал флеш-программу, но она ооочень жрет проц. мощь, так вот, может быть есть метод, узнать в какой момент какие переменные засоряют процессор, что-б оптимизировать код.
Спасибо...
З.Ы. исходник не буду выстовлять, т.к. никто не обязан разбираться в моем бордаке, а вот сам swf (http://iluvphp.hostge.com/grid.swf) на всякий, пожарный :-)
коментируешь часть кода и смотришь на загрузку процессора ;)
как посоветовать способ оптимизации кода, не имея его?
есть базовые принципы, но их описание - довольно большой объем инфы.
нужно смотреть на конкретный код, чтобы дать конкретные советы.
Ради бога (http://www.iluvphp.hostge.com/grid .fla) :)
добрый ты.
дал бы еще ссылку на твою файловую систему
- нет таких прав говорит
а.. нет
ссылка была с пробелом
удалил пробел, скачалось.
Наверное можно еще что нибудь выжать.
но я старался ;)
да, на этот раз полегчало, но даже если убрать один из обходов: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.
всех благафф
Код изначально не мой был...
так что я постарался оставить стиль автора
ведь задача оптимизировать, а не написать красиво
про первый цикл действительно тормознул. он совершенно не нужен.. ну а в остальном... мне кажется если заставить точки думать "за себя" то это будет конечно 'красивше'... но почти наверняка медленнее. Это как С++ и С. Конечно, гораздо приятнее делать код объектно ориентированным. Но если ты хочешь что бы код работал быстро про С++ можно забыть.
В данном случае, например, в лучае точки-объекта придется просчитать для каждой точки все 4 связи. А если это делать в цикле по порядку то достаточно просчитывать только две связи из-за симетрии
Но вообще интересно попробовать.. омжет действительно быстрее будет?
код автора полезен для изучения, для понимания того, чего сам догнать не смог или просто небыло на это времени.
но писать всегда нужно свое.
насчет OOP / не OOP стиля написания, скажу так:
если и в том и вдругом стиле использовать все возможности на все 100%, то OOP будет чуток тормозней, но далеко не настолько, чтобы этому придавать значение.
лучше алгоритм почитстить.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.