簡體   English   中英

OverlapCircleAll優化

[英]OverlapCircleAll optimization

我已經統一制作了 boid,但是當嘗試渲染 1000 個時,性能非常糟糕,在我的更新 function 中,我使用 Physics.OverlapCircleAll 檢查所有周圍的 boid。 有什么辦法可以做到這一點更優化? 這是我的更新 function:

void Update()
    {
        Collider2D[] hitColliders = Physics2D.OverlapCircleAll(Position, radius,layerMask.value);
        List<Boid> boids = hitColliders.Select(o => o.GetComponent<Boid>()).ToList();
        boids.Remove(this);
        Flock(boids.ToArray());
    }

絕對地。 Physics.OverlapCircleAll 每次調用都會產生大量垃圾。 您正在尋找的是Physics.OverlapCircleNonAlloc ,它使用緩沖區不會產生任何垃圾:

Collider2D[] hitsBuffer = new Collider2D[30]; //limit the amout of possible boid interations

void Update()
{
    int numHits = Physics2D.OverlapCircleNonAlloc(Position, radius, hitsBuffer, layerMask.value);
    Flock(hitsBuffer,numHits);
}

void Flock(Collider2D[] hitsBuffer, int numHits){

    for(int i = 0; i < numHits; i++){
        var boid = hitsBuffer[i].GetComponent<Boid>();
        if(boid == this)
            continue;
        //flocking algorith here
    }
}

請注意,在上面的代碼中,每幀都沒有創建額外的 arrays,這非常昂貴。 要檢查在查看 Profiler 時花費了多少時間:

  • 橙色是“物理”,計算重疊
  • 青色是“腳本”,代碼中的計算,即植絨算法
  • 深綠色是 'GarbageCollector',處理 arrays 創建和銷毀每一幀

PS 如果還沒有,請確保 boid 使用的是 CircleCollider2D,這對於 Unity 來說是最容易計算的。

PPS 您可能需要仔細檢查是否確實調用了if(boid == this) 我認為Physics.Overlap...忽略了這個對撞機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM