从对象文字与函数的Javascript性能提升

时间:2013-03-27 03:13:39

标签: javascript html5 resources game-development

所以,让我们在这里思考一下。让我们假设你有一个完整的MMO,你想要放在一起。当然,这涉及来自怪物,物品,spritesheets,tilemaps,对话,角色等的大量资源。在典型的游戏引擎中,您可以基于某些任意指示符(例如地图)加载或卸载这些资源或"区"。

这是否有Javascript版本?例如,你可以在游戏循环运行时使用。

(伪代码)

If playerPosition = theRightPlace {
    Load Resources for Next Zone
    Unload Resources for Previous Zone
}

这样做是否有性能提升?或者你应该只为游戏加载所有资源并完成它?比如在某些区域我有一个UglyMonster类,在另一个区域我有UglierMonster。

我可以通过John Resig的经典继承类结构来实例化这两个类(在我点击这个对话启动器之前我已经用完了,这对于这种程序来说很方便)

var UglyMonster = Monster.extend({
    Stuff why it is ugly;
    Make a position!
    Attack player!!!
});

var Monster1 = new UglyMonster();

或功能

function UglyMonster(name, position) {
    Create Ugly Monster!!!! Attack player!
    Stuff why it is ugly
}

var Monster1 = new UglyMonster('Fred', 100);

如果我将它们全部声明为变量,游戏中的所有怪物都会坐在全局变量中,不是吗?有没有办法声明变量而不实际构建它们?我是Javascript中整个继承游戏的新手,所以也许我错过了一些明显的东西。

处理这类浮动类的最佳方法是什么?离开他们?删除它们?通过函数实例化?它有明显的区别吗?

我希望我已经清楚地说明了我希望实现的目标。谢谢!

2 个答案:

答案 0 :(得分:2)

我不完全确定你在问什么,但是

function UglyMonster(name, position) {
   ...
}

var UglyMonster = function (name, position) {
    ...
}

是等效表达式。函数是Javascript中的对象。在这两种情况下,这些函数都保存为变量,并作为属性附加到全局对象上。

这两种方法不会有明显的性能差异。

至于

  
    

有没有办法声明变量而不实际构建它们?

  

您可以在不定义变量的情况下声明变量。只需var x;。或者,您可以声明一个类构造函数,而无需立即实例化该类的对象。你刚刚定义了一个实际上还没有运行过的函数。

更新

关于如何在javascript中读取函数的更多背景信息。

当javascript引擎解释新范围时,它首先将代码中的所有变量声明提升到当前范围的顶部(全局范围或当前函数)。那些变量然后“存在”但未定义。然后它处理函数声明,因为它们默认移动到顶部。

所以下面的代码

var x = 3+2;

var UglyMonster = function (name, position) {
    ...
}

function UglyMonster2(name, position) {
   ...
}

被解释为它是这样写的:

var UglyMonster, UglyMonster2,x;

UglyMonster2 = function(name, position) {
   ...
}

x = 3+2;

UglyMonster = function (name, position) {
    ...
}

重要的是要注意在这个例子中实际上没有运行任何函数。他们刚刚被定义了。在运行

之前,不会运行任何函数并且不会创建UglyMonster实例

new UglyMonster()。如果你正在创造许多怪物,那么尽可能长时间地阻止创造这些怪物可能是有价值的。最后,性能取决于许多事情,唯一可靠的方法是测试它并自己尝试。

答案 1 :(得分:1)

这是很多问题!让我们一个接一个地去。

我应该加载和卸载我的资源吗?

我相信游戏引擎会将资源从磁盘加载到内存。在浏览器JavaScript中,您无法从磁盘读取,您必须从网络中读取,而且速度很慢。因此,如果您遇到严重的内存使用问题,请仅加载/卸载(使用浏览器工具检查)。

如果我将它们全部声明为变量,游戏中的所有怪物都会坐在全局变量中

如果你说function UglyMonster不同,那就不是了。它也在全球范围内。如果要保持全局范围干净,请将代码包装在一个立即调用的函数表达式中:

(function(){}(
    // your code here
));

有没有办法声明变量而不实际构建它们?

不确定您的意思,但您可以定义对象文字:

var Monster = {
    attack : function() {  },
    eyes : 5
};

您还可以使用Object.create

继承任何对象
var UglyMonster = Object.create(Monster);

处理这类浮动类的最佳方法是什么?离开他们?删除它们?通过函数实例化?它是否会产生明显的差异?

我不知道你在这里问的是什么! :)