c#Unity 3D - 1000个多维数据集实例化脚本

时间:2014-09-01 19:50:16

标签: c# unity3d

为什么以下脚本使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无法使用,我怎样才能让它真正合理地工作?

4 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是使用Oclussion Culling。这是一个“不渲染”活动凸轮不可见的对象的系统。

以下是有关它的Unity信息。

Oclussion Culling at Unity Manual (PRO ONLY)

但是,此功能仅适用于Unity Pro用户,如果您有免费版本,则应该查找自定义Oclussion Culling脚本,如下所示:

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