Javascript:复合与原型设计

时间:2011-12-12 09:05:47

标签: javascript html5

我正在开发一个Javascript中的小游戏框架,并且已经完成了大部分库和低级别的东西,所以我没有把注意力集中在游戏对象系统上。在我以前的Java游戏框架中,我使用了非常好的组合,并且我将整个对象框架暴露给JS的事实激励我开始研究这个项目。在Java中,组合工作得非常好,因为您不再需要处理类型转换,或者至少非常少,因此所有内容都可以通过相同的管道传递。

然而,在Javascript中,因为它使您能够动态地向对象添加数据和方法,我想知道是否最好跳过整个组合结构,但这里的主要问题是性能。在数组中存储对象列表并迭代它们(并直接调用它们的方法)非常快,并且具有简单事件传播/冒泡的额外好处,因为通过原型构建的对象需要通过巨型程序运行检查列表,看它是否包含各种方法/数据..我认为对于非实时应用程序,这工作正常,但不是当您需要每秒30次渲染数百个对象时。我打算为这两个设计编写一些测试,但你们有没有对此有任何意见?

注意:这是一个html5框架。

1 个答案:

答案 0 :(得分:2)

这个问题太广泛了,无法回答。我会尝试将其缩小到两位:

  

但这里的主要问题是表现。

首先,在遇到问题后关注性能。

  

作为由via组成的对象   原型设计需要通过一个巨大的检查列表来查看   如果它包含各种方法/数据。

对于两个人来说,这不是真的。您可以非常轻松地为每个mixin添加一个标记方法 - 有效地将您的巨型列表折叠为一个且只有一个。

例如:

Renderable = {
  isRenderable: true
  // render magic
}

myGameObject.extend(Renderable);

<强>更新

您也可以考虑采用面向事件的方法。这将允许您触发Render事件,并且订阅的每个游戏对象都将自行呈现。不,如果声明。像(伪)的东西:

RenderManager.subscribe = function(subscriber) {
    this.subscribers.push(subscriber)
}
RenderManager.render = function() {
    // loop over all subscribers and render with them
}

// when initializing, add game objects to the render system
RenderManager.subscribe(myGameObject);

// then from your main game loop
RenderManager.render();