只有当我第一次接触一个物体时,才会出现统一-滞后



所以我有一个检测脚本,看起来像这样:

IEnumerator Detect()
{
while (true)
{
var collision = Physics2D.OverlapCircle(transform.position, radius, layerMask);
if (collision != null)
{
var obj = collision.GetComponent<IDetectionObject>();
if (lastDetectedObject != obj)
{
obj.Ping();
lastDetectedObject = obj;
}
}
yield return new WaitForSeconds(interval);
}
}

这个脚本将触发(ping(一个对话玩笑,并将玩笑传递给玩家。玩家将运行以下代码:

public void Say(string banter, float duration)
{
currentBubble = bubbleManager.GetBubble();
currentBubble.SetText(banter);
currentBubble.BindToTransform(transform, () => currentBubble = null);
currentBubble.SetDuration(duration);
}

BubbleManager.cs脚本使用unity中的PoolObject,这是代码:

private void Awake()
{
bubblePool = new ObjectPool<BanterBubble>(() =>
{
return Instantiate(bubblePrefab, transform);
}, bubble =>
{
bubble.gameObject.SetActive(true);
}, bubble =>
{
bubble.gameObject.SetActive(false);
}, bubble =>
{
Destroy(bubble);
}, false, 10, 20);
}
public BanterBubble GetBubble()
{
var bubble = bubblePool.Get();
bubble.Init(this);
return bubble;
}
public void ReleaseBubble(BanterBubble bubble)
{
bubblePool.Release(bubble);
}

好吧,现在问题来了。每当我测试玩我的游戏时,当玩家检测到IDetectionObject接口时,它总是滞后的。但这只是第一次。

在那之后,游戏将顺利运行,即使我触发了这么多IDetectionObjects。滞后非常严重,所以我真的想解决这个问题。

我已经做了什么

  • 使用Instantiate((而不是从PoolObject中获取对象,后者是BubbleManager,滞后仍然发生在第一次。之后总是一帆风顺
  • 构建游戏并进行游戏。是的。。这种滞后现象仍然存在于构建游戏中
  • 使用调试。是的,滞后已经消失了。所以我认为问题在于如何实例化我的对象

我怀疑什么

  • Bubble是一个UI对象,所以它必须使用画布来渲染,也许实例化画布对象很重
  • 也许我的Unity版本不稳定?我使用Unity 2022.1.10f1

当画布中的一个元素发生变化时,整个画布将重新生成。

"许多用户在一张包含数千个元素的画布上构建整个游戏的UI。当它们改变一个元件时,它们可能会经历花费数毫秒的CPU尖峰";来自团结文档。

相关内容

  • 没有找到相关文章

最新更新