[英]c# Unity 3D - 1000 cube instantiation script
為什么以下腳本使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無法使用的情況下合理地工作呢?
我認為最好的解決方案是使用Oclussion Culling。 這是一個“不渲染”活動凸輪不可見的對象的系統。
這是關於它的Unity信息。
但是,此功能僅適用於Unity Pro用戶,如果您具有免費版本,則應查找定制的Oclussion Culling腳本,如下所示:
請記住,這只是我在網上找到的腳本,可能還有更好的腳本。 無論如何,用該腳本的創建者的話來說:
在我的測試場景中,腳本使繪制調用/ tris / verts減少了80%以上,渲染循環速度提高了85%以上,但幀速率降低了12%(從75 FPS降至66 FPS)。 雖然這對於因繪制調用而陷入困境的場景非常有用,但我對任何可以減少腳本開銷以使其適合一般使用的反饋都非常感興趣。
可能值得檢查一下。
我可能在這個例子中看得太遠了,但是似乎您正在嘗試模擬“塊狀”渲染的體素。
雖然對於一個非常簡單的示例,多維數據集可能會起作用,但是即使實例化,您也可以實例化,渲染並讓物理系統保持跟蹤,但有一定的限制。
您應該使用一種渲染體素的方法,該方法生成具有預定義大小(通常稱為“塊”)的區域的奇異網格。 這樣就可以對每種材料進行一次繪制調用,其固有的剔除速度比可以自動生成的任何內容都要快(因為它是生成網格物體的“免費”副作用),消除了多個對撞機的開銷,並且還有很多更多 。
這個任務聽起來比實際要艱巨得多。 有許多教程可以滿足您的需求。 我還發現這 三個 資源寫得特別好。
我個人不建議嘗試單獨使用遮擋剔除和批處理來獲得當前的工作方式,因為這仍然是效率極低的方法。 還要注意,Unity Pro的遮擋剔除是經過預先計算的,因此在您的情況下將不起作用。
散開立方體的立方體。
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);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.