您的位置:首页 > 财经 > 产业 > 上海建设工程信息服务平台_好看的广告图片_seo优化网站排名_天津百度seo排名优化

上海建设工程信息服务平台_好看的广告图片_seo优化网站排名_天津百度seo排名优化

2024/12/22 14:07:05 来源:https://blog.csdn.net/Thomas_YXQ/article/details/144273200  浏览:    关键词:上海建设工程信息服务平台_好看的广告图片_seo优化网站排名_天津百度seo排名优化
上海建设工程信息服务平台_好看的广告图片_seo优化网站排名_天津百度seo排名优化

在Unity3D开发中,SetActive方法是一个常用的API,用于激活或禁用GameObject。然而,频繁使用SetActive可能会导致一系列性能问题和不必要的资源消耗。以下是对其技术详解及优化方法,包括代码实现。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

技术详解

  1. 性能开销
  • SetActive方法会导致C#层到Native层的穿梭调用,这比C#层内的操作速度慢。频繁调用SetActive可能会导致性能问题,特别是在大量对象需要被激活或禁用时。

  1. Canvas重建
  • SetActive会导致Canvas抛弃其VBO(顶点缓冲对象)数据,重新启用Canvas会使Canvas(包括所有的子Canvas)强制进行rebuild和rebatch进程。如果这种情况发生的非常频繁,增加的CPU使用会造成应用程序的帧率卡顿。

  1. 触发GC(垃圾回收)
  • UI元素的网格顶点数改变会造成堆内存分配,触发GC,导致耗时。这对UI元素进行位置移动不会造成堆内存分配,但是激活和禁用操作会。

  1. 生命周期事件触发
  • SetActive(true)会触发MonoBehaviour.OnEnable()事件,而SetActive(false)会触发MonoBehaviour.OnDisable()事件,即使对象之前已经是激活或禁用状态。这可能会导致不必要的代码执行,增加开销。

  1. UI性能问题
  • SetActive会触发子物体的OnEnableOnDisable方法,而且这两个方法是有GC的,使得整体带来了GC的消耗。

优化方法

  1. 使用变量标识状态
  • 在C#层设置变量来标识相应的GameObject处于Active还是非Active状态,避免对Active的对象进行SetActive(true),避免对非Active的对象进行SetActive(false)

  1. 使用CanvasGroup
  • 通过将UI元素的坐标移动到Canvas的范围之外的方法来显示与隐藏,避免SetActive的耗时以及SendWillRenderCanvases的耗时。也可以通过CanvasGroup组件设置透明度的方式来进行显示与隐藏,这样可以避免SetActive引起的负载。

  1. 优化Canvas分区
  • 将要频繁变化的UI元素与不频繁变化的UI元素放在不同的Canvas中,减少UI元素变化时的耗时。

  1. 使用Scale变换
  • 手游项目中会把频繁需要显示出现的UI的Scale设为0,而不是使用SetActive

代码实现

// 使用变量标识状态
public class GameObjectManager : MonoBehaviour
{
private bool isObjectActive = false;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ToggleGameObjectActive();
}
}
public void ToggleGameObjectActive()
{
if (isObjectActive)
{
gameObject.SetActive(false);
}
else
{
gameObject.SetActive(true);
}
isObjectActive = !isObjectActive;
}
}
// 使用CanvasGroup
public class CanvasGroupManager : MonoBehaviour
{
private CanvasGroup canvasGroup;
void Start()
{
canvasGroup = GetComponent<CanvasGroup>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ToggleVisibility();
}
}
public void ToggleVisibility()
{
canvasGroup.alpha = canvasGroup.alpha == 1 ? 0 : 1;
canvasGroup.blocksRaycasts = canvasGroup.alpha > 0;
}
}
// 使用Scale变换
public class ScaleManager : MonoBehaviour
{
private Vector3 originalScale;
void Start()
{
originalScale = transform.localScale;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ToggleVisibilityByScale();
}
}
public void ToggleVisibilityByScale()
{
transform.localScale = transform.localScale == Vector3.zero ? originalScale : Vector3.zero;
}
}

总结

频繁使用SetActive会导致性能开销、Canvas重建、触发GC、生命周期事件触发等问题。为了避免这些问题,可以使用变量标识状态、CanvasGroup、优化Canvas分区、使用Scale变换等方法进行优化。通过以上代码实现,可以在Unity3D项目中更好地管理GameObject的显示与隐藏,提高游戏性能。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com