Javascript:复合设计vs原型设计

Javascript: composite vs prototype design

本文关键字:原型 vs Javascript 复合      更新时间:2023-09-26

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

然而,在Javascript中,因为它提供了向对象动态添加数据和方法的能力,我想知道是否最好跳过整个组合结构,但这里的主要问题是性能。将对象列表存储在数组中并遍历它们(并直接调用它们的方法)非常快,并且具有易于事件传播/冒泡的额外好处,而通过原型构建的对象需要通过大量检查列表来查看它是否包含各种方法/数据。我认为对于非实时应用程序,这工作得很好,但当你需要每秒渲染30次以上的数百个对象时,就不是了。我将为这两种设计编写一些测试,但你们中有人对此有什么意见吗?

这个问题太宽泛了,很难回答。我试着把它缩小到两位:

但是这里的主要问题是性能。

首先,在出现问题后关注性能。

作为由原型设计需要通过一长串的检查来检验如果它包含各种方法/数据

对于两个,这是不正确的。你可以很容易地为每一个mixins添加一个flag方法——有效地将你的大列表压缩为一个且只有一个。

例如:

Renderable = {
  isRenderable: true
  // render magic
}
myGameObject.extend(Renderable);

您可能还想考虑面向事件的方法。这将允许你触发Render事件,并且每个订阅的游戏对象都将简单地呈现自己。没有if语句。类似于(pseudoy):

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();