[英]Performance issue instantiating prefabs in unoccupied area in unity 2D
我有一個草預制件,它在創建預制件網格一段時間后在其周圍的 8 個位置之一中實例化自身。 目前,我使用每個預制件 8 個觸發器對撞機檢查其他草預制件。 請看下面的截圖:
問題是在僅實例化其中的一堆之后,unity 會變慢。
我願意接受有關性能改進的任何建議。
這是我的代碼:
using UnityEngine;
public class GrassController : MonoBehaviour
{
[SerializeField] private float growthRate = 1.1f;
[SerializeField] private float maxSize = 1f;
[SerializeField] private float reproduceEffort = 0.1f;
[SerializeField] private GameObject prefab;
[SerializeField] private GameObject sprite;
[SerializeField] private ReproduceHitBoxController[] reproduceHitBoxes;
[SerializeField] private float size = 0f;
private float initialSize = 0.1f;
private void Awake()
{
size = initialSize;
ApplyGrowth();
}
private void FixedUpdate()
{
if (size < maxSize) Grow();
else Reproduce();
}
private void Grow()
{
size *= growthRate;
if (size >= maxSize) size = maxSize;
ApplyGrowth();
}
private void ApplyGrowth()
{
sprite.transform.localScale = new Vector3(size, size, sprite.transform.position.z);
}
private void Reproduce()
{
var reproduceHitBox = reproduceHitBoxes[Random.Range(0, reproduceHitBoxes.Length)];
if (reproduceHitBox.tagInCollider == true) return;
Instantiate(prefab, reproduceHitBox.transform.position, Quaternion.identity);
size -= reproduceEffort;
}
}
編輯:似乎對性能的主要拖累都是物理檢查。 有沒有辦法檢查某個區域中性能更高的其他游戲對象?
禁用植物渲染組件。 沒有出現在屏幕上。
我目前在分析器中看到的內容。
Physics
是 Unity 的一個非常寬泛的術語,它告訴您Nvidia Physx正在使用中。 它負責“Performant*”碰撞檢查,這就是您目前看到的。
因為關於 Physx 的工作原理,對於“附近”的對象,您基本上是在每個FixedUpdate
上檢查“each-with-each”。
分析器中有更多關於 Physix 子系統當前在此給定幀跨度上占用 800 毫秒的信息。
如何解決這個問題
停止對 Unity Physics 永遠不會移動的所有內容使用碰撞、碰撞器和觸發器。 而是使用巧妙的數據結構來檢查“草是否在對象旁邊”而不進行“每個與每個”的檢查
就我個人而言,我現在會選擇第 4 位,當 Grow 的成本會為低端平台產生滯后峰值時,我會擴展到第 2 位或第 3 位。 (3-5ms或更多)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.