如何从对象和类中清除javascript中的浏览器内存?

时间:2013-05-04 08:51:45

标签: javascript jquery memory browser asynchronous

我用三个场景制作任务游戏。玩家可以从一个场景移动到另一个场景并返回。 (如众所周知的经典任务:Neverhood,Machinarium,The Monkey Island的诅咒) 每个场景都有自己的对象,类和图形元素包。以下是查看一个场景的脚本的方法。

<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="js/jquery.gamequery-0.5.0.2.js"></script>

<!-- ////////////////////////////////////////////////
    ///////////                 Charecters            ////////////////////
     /////////////////////////////////////////////////////////////// -->

    <script type="text/javascript" src="js/charecters/player.js" id="player_anime"></script>
    <script type="text/javascript"  src="js/charecters/mama.js" ></script>


    <!-- ////////////////////////////////////////////////
  ///////////                 Scene globals            ////////////////////
   /////////////////////////////////////////////////////////////// -->
    <script type="text/javascript" src="js/scene_globals/scene2/audio.js"></script>
    <script type="text/javascript" src="js/scene_globals/scene2/background.js" ></script>
    <script type="text/javascript" src="js/scene_globals/scene2/scene.js"></script>

    <!-- ////////////////////////////////////////////////
   ///////////                 Game controls            ////////////////////
    /////////////////////////////////////////////////////////////// -->


    <script type="text/javascript" src="js/game_control.js"></script>

我想异步加载每个场景的脚本,以解决内存使用问题。但我意识到,即使我销毁所有脚本并为下一个场景加载其他脚本,对象和图形元素仍然留在内存中。

以下是一般算法:

1)为第一个场景加载图形和脚本。 2)用户传递第一个场景 3)擦除第一个场景的所有对象,脚本和图形 4)加载第二个场景的所有需求

还有另一种方法可以实现:我可以将每个场景的所有内容都放入iframe,而不是异步解决方案。所以当iframe重新加载到下一个场景时所有对象和图形擦除。但这是另一个问题 - 如何在父页面的iframe中使用所有对象和图形。 (我有一些互动)

我希望我糟糕的英语能够很好地解决问题。

等待恩惠建议。

2 个答案:

答案 0 :(得分:0)

一般来说,你不能

但是,您可以使用一些提示和常用技术来触发垃圾回收。

首先,使用delete运算符来删除对象的属性。它与delete等语言中使用的C++运算符无关,但可以用于将来不需要变量的情况。这将删除对此变量的每个引用,但不会直接删除此变量包含的值。意思是:

// creating the property i in the global object
i = 0;

obj = {
  x : 10,
  y : 20
};

delete i;
// deletes the property i from the global object
// At this point, you are giving a hint to the garbage collector that he 
// can now free the memory associated with i because it is no 
// longer referenced.

delete obj.x; // removes the property 'x' of obj
obj.x = 10; // undefined reference to 'x' in obj

接下来的事情可能就是对变量进行智能管理。例如:

var array = [1, 2, 3];
// using array and the values contained by array ...
array = null;
// this will give a hint to the garbage collector that currently, 
// the value pointed by array ( [1,2,3] ) is not referenced to anymore 
// and can be freed.

请注意,您不能在Javascript中(与其他托管语言一样)明确地释放变量或对象的内存。在绝大多数情况下,垃圾收集器都会表现得非常好。

在您的情况下,为什么不使用延迟资源加载,以便您可以按需加载每个场景所需的代码?这将具有在页面加载方面更快的优点,并且您不再担心您的问题。

答案 1 :(得分:0)

我的目标是采用这样的策略:

  • 采用Module Pattern
  • 编写一个适用于所有场景的静态通用模块
  • 对于每个场景,编写一个包含适当构造的模块的javascript文件,该模块包含特定于该场景的所有数据/函数。
  • 在广义框架中包含为所需场景加载(使用例如JSONP)适当模块的方法。

使用模块模式,通常可以确保模块不会“覆盖”另一个同名的模块。但是,在这种情况下,这正是您想要的。

在加载新模块时,垃圾收集将在删除“覆盖”模块后进行。

由于javascript的垃圾收集有点懒惰,你可以在加载新场景之前使用delete命令强制它。您需要做的唯一规定是确保将模块定义为外部project命名空间的属性(与模块模式一样)。

正确实现后,您只需将一个成员放在全局命名空间中(对于每个实用程序/库对象(如jQuery)加一个或多个成员)。