为什么以下脚本使Unity运行非常缓慢且无法使用?
public Transform brick;
public int gridWidth=10;
public int gridDepth=10;
public int gridHeight=10;
void Start() {
for (int y = 0; y < gridHeight; y=y+2)
{
for (int z = 0; z < gridDepth; z=z+2)
{
for (int x = 0; x < gridWidth; x=x+2)
{
Instantiate (brick, new Vector3 (x, y, z), Quaternion.identity);
}
}
}
}
在变换中,我放置了一个基本上是刚体立方体的预制件。
如果我删除包含z int的For-Loop,它运行正常(因此10x10网格/ 100个立方体就可以了)。但是,使用z int循环它会中断(10x10x10网格/ 1000个立方体)
如果不使Unity无法使用,我怎样才能让它真正合理地工作?
答案 0 :(得分:1)
我认为最好的解决方案是使用Oclussion Culling。这是一个“不渲染”活动凸轮不可见的对象的系统。
以下是有关它的Unity信息。
Oclussion Culling at Unity Manual (PRO ONLY)
但是,此功能仅适用于Unity Pro用户,如果您有免费版本,则应该查找自定义Oclussion Culling脚本,如下所示:
请记住,这只是我在网上找到的一个脚本,可能会有更好的脚本。无论如何,用该剧本的创作者的话说:
在我的测试场景中,脚本的绘制调用/ tris / verts减少了80%,渲染器循环速度提高了85%,代价是帧速率降低了12%(从75到66 FPS) 。虽然这对于被绘制调用陷入困境的场景非常有用,但我对任何可以减少脚本开销以使其适合一般用途的反馈感兴趣。
值得一试。
答案 1 :(得分:0)
我想你可以从预制件上取下刚体;只留下盒子对撞机并将其设为static。首先,这将使Unity有效batch draw calls。 PhysX将能够利用broad phase并提高碰撞检测的性能。
答案 2 :(得分:0)
我可能对这个例子看得太过分了,但它似乎就像你试图模仿“块状”渲染的体素一样。
虽然对于非常简单的示例立方体可能有效,但是对于实例化,渲染和物理系统保持跟踪的数量有明确限制,即使进行剔除也是如此。
您应该使用一种方法来渲染体素,这些体素会生成预定义大小的区域(通常称为“块”)的单个网格。这允许对每种材料进行单次绘制调用,固有剔除比任何可以自动生成的任何内容都快(因为它是生成网格的“自由”副作用),删除多个碰撞器的开销,以及更多。
这是听起来比实际更令人生畏的任务。有numerous tutorials可以满足您的需求。我还发现these three sources写得特别好。
我个人不建议单独使用遮挡剔除和批处理来尝试使用当前的方法,因为它仍然是一种非常低效的方法。另请注意,Unity Pro的遮挡剔除设计为预先计算,因此在您的情况下无效。
答案 3 :(得分:0)
SPAWN CUBE OF CUBES。
public Transform cubePrefab;
public int rows,columns,depth;
public float padding;
// Use this for initialization
void Start () {
for(int i =0; i < depth; i ++) {
for(int j=0;j< columns;j++){
for(int k=0; k < rows;k++){
Vector3 pos = new Vector3(k * padding,j * padding,i * padding);
//print(pos);
Transform foo = (Transform) Instantiate(cubePrefab,pos,Quaternion.identity);
}
}
}
}