Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Оптимизациа ActionScript-а (http://www.flasher.ru/forum/showthread.php?t=60461)

Leo45 09.07.2004 21:10

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

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

Елё 09.07.2004 21:30

коментируешь часть кода и смотришь на загрузку процессора ;)

Leo45 09.07.2004 21:37

и все? :)

Iv 09.07.2004 21:44

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

Leo45 09.07.2004 22:22

Ради бога :)

Iv 09.07.2004 22:57

добрый ты.

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

Iv 10.07.2004 00:11

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

Елё 12.07.2004 18:24

Вложений: 1
Наверное можно еще что нибудь выжать.
но я старался ;)

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 связи. А если это делать в цикле по порядку то достаточно просчитывать только две связи из-за симетрии

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


Часовой пояс GMT +4, время: 08:32.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.