处理越来越多的对象的最佳方法
问题描述:
我最近开始尝试使用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球体)
欢迎提出建议。
答
那么,你正在创建单Three.Meshes。 您正在寻找的是一种回拨绘图调用和/或使用更好的内部结构(即Buffergeometry)的方法。请参阅Three.js附带的示例。
您也可以在创建球体后尝试合并球体。看到这里
http://learningthreejs.com/blog/2011/10/05/performance-merging-geometry/
我似乎无法找到buffergeometry清楚地解释发生了什么事情的任何适当的例子。大多数缓冲几何示例只是随机发送三角形。如果我们想复制一个立方体或球体呢? – Mia 2014-10-13 16:47:17
此外,同样适用于合并几何体。如果我为在for循环中创建的每个项目合并几何体和“创建的其余部分”,则在填充所有内容之前需要半分钟。有没有其他解决方法? – Mia 2014-10-13 16:48:25
以及我不知道你的用例。关于BufferGeometry:它只是一些存储信息的数组。深入挖掘以获得不错的表现,但这是一个陡峭的学习曲线。该示例显示如何设置数组以从中绘制数组。你必须阅读代码和WebGL缓冲区了解 http://learningwebgl.com/blog/?p=370 至于合并:也许不合并每个几何创建,也许每50个网格?你需要在那里找到一个甜蜜的地方,这也取决于你的用例和你想做的事情。 – GuyGood 2014-10-13 20:27:47