2014-10-12 93 views
0

我最近开始尝试使用webgl。处理越来越多的对象的最佳方法

我见过很多演示,创建数以万计的对象,他们流利地工作(60fps)。

我需要创建一个场景,我从一开始就没有对象,随着时间的推移,这个数字会上升到几千个对象。如何处理这样的情况呢?

我曾经想过在开始时将对象创建为一个巨大的对象,并且只需修改它们的顶点以将它们放置到相机视野中,以便它们需要“天生”时;但是这种解决方法似乎有太多工作要做。

下面是一个例子: http://codepen.io/anon/pen/fmsqB?editors=001

试图使代码尽可能明确,但检查出这部分

function populate(){ 
    if (count < maxcount){ 
    sph = sphere.clone(); 
    scene.add(sph); 
    sphere.position.x = Rand(-10,10); 
    sphere.position.y = Rand(-10,10); 
    sphere.position.z = Rand(-10,10); 
    count +=1; 
    console.log(count); 
    }; 
}; 

你可以看到,即使有几千最低的细分领域, FPS下降的速度非常快(对于我现在使用的机器,它可以降低至20 fps,5-6k球体)

欢迎提出建议。

回答

0

那么,你正在创建单Three.Meshes。 您正在寻找的是一种回拨绘图调用和/或使用更好的内部结构(即Buffergeometry)的方法。请参阅Three.js附带的示例。

您也可以在创建球体后尝试合并球体。看到这里

http://learningthreejs.com/blog/2011/10/05/performance-merging-geometry/

+0

我似乎无法找到buffergeometry清楚地解释发生了什么事情的任何适当的例子。大多数缓冲几何示例只是随机发送三角形。如果我们想复制一个立方体或球体呢? – Mia 2014-10-13 16:47:17

+0

此外,同样适用于合并几何体。如果我为在for循环中创建的每个项目合并几何体和“创建的其余部分”,则在填充所有内容之前需要半分钟。有没有其他解决方法? – Mia 2014-10-13 16:48:25

+0

以及我不知道你的用例。关于BufferGeometry:它只是一些存储信息的数组。深入挖掘以获得不错的表现,但这是一个陡峭的学习曲线。该示例显示如何设置数组以从中绘制数组。你必须阅读代码和WebGL缓冲区了解 http://learningwebgl.com/blog/?p=370 至于合并:也许不合并每个几何创建,也许每50个网格?你需要在那里找到一个甜蜜的地方,这也取决于你的用例和你想做的事情。 – GuyGood 2014-10-13 20:27:47