[英]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 時花費了多少時間:
PS 如果還沒有,請確保 boid 使用的是 CircleCollider2D,這對於 Unity 來說是最容易計算的。
PPS 您可能需要仔細檢查是否確實調用了if(boid == this)
。 我認為Physics.Overlap...
忽略了這個對撞機。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.