佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1223|回复: 23

AS杂症集。

[复制链接]
发表于 12-5-2007 06:31 PM | 显示全部楼层 |阅读模式
先声明。。我用mx(6.0) 版本






1. 关于flash object
===================


请问。。

如果我instantiate 一个object..

那当我不要那个object了要怎样free 掉它??
如果reference to object set 成其它东西。。那那个原本的object是否会自动被gc 清理掉???
比如
a=new object();
b=new object();
a=b;
那原本被a 指的object还占memory吗??





以下 是我正在做着的东西


首先。。有个xml object会每分钟取一些资料。。
取了之后,会把东西塞进一个array里。。
然后我有个function会每 5 秒去process那个array..
问题是process完后,我要clear掉那个obj from我的array..
该怎么做


myXML.onLoad=function()
{
        //trace(myXML.toString());
        
        var story=myXML.firstChild.nextSibling.childNodes[1]
        while (story!=null)
        {
                //trace(story.attributes["id"]);
                //trace(story.attributes["diggs"]);
                //trace(story.childNodes[1].childNodes[0]);
                //trace(story.attributes["link"]);
               
                myStory = new Object();
                myStory.id = story.attributes["id"];
                myStory.digg=story.attributes["diggs"];
                myStory.title=story.childNodes[1].childNodes[0];
                myStory.link=story.attributes["link"];
                                                                                       
                queuetail+=1;
                queue[queuetail]=myStory;
               
                story=story.nextSibling.nextSibling;
               
        }
        
} //onload




我是怕说memory usage 会过高。。
所以我想要deaalocate..

function ProcessQueue()
{
        if (queueTail>queueHead)
        {
                var myStory=queue[queueHead];
                trace(myStory.id);
               
                queue[queueHead]=null;  //<--- will this help??
               
                queueHead+=1;
        }
}

[ 本帖最后由 tensaix2j 于 17-1-2008 11:00 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 13-5-2007 03:11 PM | 显示全部楼层
只要variable被定義之後就肯定會佔住記憶體, 如果覺得不必再用到的話可以使用 delete 刪掉該variable. 很容易就可以從測試中辨別

var a:Object = new Object();
a.nn = "abc";
var b:Object = new Object();
b = a;
delete a;
trace(b.nn);
trace(a);




另一問題是, 你每分鐘更新你的XML, 那麼另一個使用interval每5秒做更新XML資料, 這不是很耗CPU的計算?

應當是更新了XML之後直接呼叫你的process即可做到即時更新而不是用setInterval不斷更新. 這很容易造成CPU過量的計算
回复

使用道具 举报

 楼主| 发表于 13-5-2007 03:24 PM | 显示全部楼层
原帖由 super-tomato 于 13-5-2007 03:11 PM 发表
另一問題是, 你每分鐘更新你的XML, 那麼另一個使用interval每5秒做更新XML資料, 這不是很耗CPU的計算?

應當是更新了XML之後直接呼叫你的process即可做到即時更新而不是用setInterval不斷更新. 這很容易造成CPU過量的計算

.


不是的。。
因为。。我拿了一个list的story后

我要一个一个去animate。。(elapse by 5 seconds)
而不是一次过。。
process 不是更新。。是去queue里拿一个story来animate.



概念是这样
我的xml每分钟去抓story。。(不是一个而是一次很多个)

然后放进queue里

process每五秒去queue抓一个story来animate..
我想要的是animate好了之后干掉这个object from我的queue..



这是我的prototype..
my Digg Visualization

故事是这里抽的。。
http://services.digg.com/stories ... F%2Fapidoc.digg.com

[ 本帖最后由 tensaix2j 于 13-5-2007 03:45 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 13-5-2007 03:47 PM | 显示全部楼层
原帖由 super-tomato 于 13-5-2007 03:11 PM 发表
只要variable被定義之後就肯定會佔住記憶體


真的是这样吗?
如果没任何variable point去那一块记忆体也不会自动release吗?
回复

使用道具 举报

发表于 13-5-2007 04:03 PM | 显示全部楼层
如果是這樣的概念, 那麼一分鐘就有60, 也就是你只有一分鐘可以處理30筆story, 如果XML所載入的資料大於 30 筆的話, 你的bug就會出現了.

我覺得應該把已經做過的story從array中pop掉, 那麼永遠只讀第一筆的情況下就可以解決問題.


AS和C++不太一樣, 沒有pointer的寫法, 所以b = a並不是指向a的記憶體位置, 但也不像JAVA會在沒用的情況下把沒用的release掉. object A只要一被定義就會暫駐記憶體的一塊位置並賦予null空值, 而真正被release的話則是undefined(即在記憶體中無定義)
回复

使用道具 举报

 楼主| 发表于 13-5-2007 04:15 PM | 显示全部楼层
原帖由 super-tomato 于 13-5-2007 04:03 PM 发表
如果是這樣的概念, 那麼一分鐘就有60, 也就是你只有一分鐘可以處理30筆story, 如果XML所載入的資料大於 30 筆的話, 你的bug就會出現了.

我覺得應該把已經做過的story從array中pop掉, 那麼永遠只讀第一筆的情 ...



2. 关于 Queue using Array.
===========================


所以我才想到用queue 来做好象buffer

如果那次有60笔的story.. 通通先丢进queue里。。
我一次只拿一个story来process。。。

我不清楚flash有没有built in the queue..但我是用array 的。。

我是用自订义的array,然后用var queuehead 和queuetail来记住头跟尾。

[ 本帖最后由 tensaix2j 于 13-5-2007 11:00 PM 编辑 ]
回复

使用道具 举报

Follow Us
 楼主| 发表于 13-5-2007 04:23 PM | 显示全部楼层
p/s:

digg那里的更新每秒上下变化无穷。
但他们只允许我们每分钟request一次。。

不听话的话直接ban ip..

www.digg.com
回复

使用道具 举报

发表于 13-5-2007 04:30 PM | 显示全部楼层
在為了保持資料的情況下, 把xml的資料push進Array中, 然後由process這個函數把Array[0]資料更新後, 再Array.shift刪掉第一筆, 之後的第二筆就會挪到第一筆去, 這樣不斷循環, 所以只要判斷Array的長度大於0就代表有資料要進行更新, 也不用再定義 queueHead+=1; 減少任何增加記憶體的負擔量

按F1搜索Array相關函數的說明就可以了解該怎麼依需求變化
回复

使用道具 举报


ADVERTISEMENT

发表于 13-5-2007 04:52 PM | 显示全部楼层
原帖由 super-tomato 于 13-5-2007 04:30 PM 发表
在為了保持資料的情況下, 把xml的資料push進Array中, 然後由process這個函數把Array資料更新後, 再Array.shift刪掉第一筆, 之後的第二筆就會挪到第一筆去, 這樣不斷循環, 所以只要判斷Array的長度大於0就代表有 ...



例子:
var myArray:Array = new Array();

//pushArray 當作是讀取外部XML, 每次增加10筆資料
function pushArray() {
for(var i=0; i<10; i++) {
  var obj:Object = new Object(); //定義在function內的variable不需要特意刪除, 只要function結束, variable 自動會被destroy
  obj.n = random(10);
  myArray.push(obj);
}
}

//popArray 當做是更新資料
function popArray() {
if(myArray.length) {
  var o:Object = myArray.shift();
  trace("myArray.length = "+myArray.length+", myArray[0] = "+o.n);
}
}

pushArray();

trace("Trace out scene variables & functions : ");
for(var i in this) trace(i);
trace("---------- End Trace -------------");

setInterval(pushArray, 9000);  //每9秒執行pushArray
setInterval(popArray, 1000);   //每秒執行popArray
回复

使用道具 举报

 楼主| 发表于 13-5-2007 05:09 PM | 显示全部楼层
这个真的很棒
非常谢谢您了。。。

这个应该正是我想找的queue(FIFO)..
如果是stack (LIFO)的话呢?。。应该用什么
回复

使用道具 举报

发表于 13-5-2007 05:19 PM | 显示全部楼层
LIFO的話把myArray.shift()換成myArray.pop()就可以了啊, 主要看所需要求更換array的函數即可
回复

使用道具 举报

 楼主| 发表于 13-5-2007 05:25 PM | 显示全部楼层
对对对 。。哈哈。。。。我想到了之后。来不及删就被你回了。
谢谢
回复

使用道具 举报

 楼主| 发表于 13-5-2007 09:55 PM | 显示全部楼层
如果flash array连hash table 都可以办到那就perfect 了。。
回复

使用道具 举报

 楼主| 发表于 13-5-2007 10:16 PM | 显示全部楼层
3. For each
=======================


请问

for (var i=0;i<DuggQueue.length;i++)
{
      var myDigg = DuggQueue[i];
      trace(myDigg.name);
  ...
     ...
     ...

}

是否可以这样从写。。

for (var myDigg in DuggQueue)   //Is this equivalent to foreach?
{
      trace(myDigg.name);
     ...
      ...
}







.....

[[i] 本帖最后由 tensaix2j 于 13-5-2007 11:01 PM 编辑 [/i]]
回复

使用道具 举报

 楼主| 发表于 13-5-2007 11:01 PM | 显示全部楼层
4.  String.replace
====================

请问,flash 有没有 string.replace("searchcha","replacment")
这东西?

[ 本帖最后由 tensaix2j 于 13-5-2007 11:02 PM 编辑 ]
回复

使用道具 举报

发表于 14-5-2007 01:02 PM | 显示全部楼层
String.prototype.replace = function(sourceStr:String, replaceStr:String) {
        return this.split(sourceStr).join(replaceStr);
}

//上面的繼承方式放在frame上, 之後那裡都可以如下這般使用

var a = "aaabbccbbddbb";
a = a.replace("bb", "vv");
trace(a);
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 14-5-2007 10:13 PM | 显示全部楼层
split了join 有时不work..
是不是版本的问题?

[ 本帖最后由 tensaix2j 于 14-5-2007 10:17 PM 编辑 ]
回复

使用道具 举报

发表于 15-5-2007 03:12 AM | 显示全部楼层
split和join只要是Flash 5或以上版本都可以使用
不能Work的情況大概就是低於版本或你的搜索關鍵字沒根據大小寫
回复

使用道具 举报

 楼主| 发表于 15-5-2007 09:04 AM | 显示全部楼层
帮我看看这是怎么回事。
data type在作怪?

回复

使用道具 举报

发表于 15-5-2007 11:17 AM | 显示全部楼层
var aaa = x.firstChild.childNodes[1];
trace(aaa);
aaa = aaa.replace("t", "xxx");  //注意用法, 該replace會回傳而不是修改本身aaa
trace(aaa);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 26-9-2025 06:49 AM , Processed in 0.141063 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表