相关文章推荐
暴躁的石榴  ·  OpenCV ...·  3 月前    · 
温暖的卡布奇诺  ·  HTML canvas ...·  1 周前    · 
完美的苦瓜  ·  Pcap_loop函数-CSDN博客·  1 年前    · 
体贴的李子  ·  Matlab - ...·  2 年前    · 
目标给你一个关于怎么去设置Canvas(画布)工作的建议

现在,我们做一个简单的例子,让我们对这些选项一个一个的测试,以便我们能更好去了解它。

1.Screen Space Camera

首先,我们创建一个Unity工程,并且进一步的理解它:

C#脚本: MoveCamera.cs

在你的Scene视图下创建一个Canvas

设置它的Renderer mode(渲染模式)选项为:Screen Space - Camera

拖拽Main Camera到该选项条上去

initialPosition = transform.position; targetPosition = new Vector3 (transform.position.x + Random.Range ( -5 , 5 ), transform.position.y + Random.Range ( -5 , 5 ), transform.position.z); initialZ = transform.eulerAngles.z; targetZ = initialZ + Random.Range ( -50 , 50 ); moveCamera = true ; lerpSpeed = 0 ; if (moveCamera) { CameraMovementMethod (); private void CameraMovementMethod () lerpSpeed = Mathf.SmoothDamp (lerpSpeed, 1.0f , ref velocity, smoothTime); cam.transform.position = Vector3.Lerp (initialPosition, targetPosition, lerpSpeed); cam.transform.eulerAngles = new Vector3 ( 0 , 0 , Mathf.LerpAngle (initialZ, targetZ, lerpSpeed));

为脚本中的Cam参数赋值(把Main Camera拖拽上去)

你可以在上图中看到,有许多与Canvas的函数都被调用了,特别是CanvasRender.OnTransformChanged调用的次数最多

每当相机移动或者旋转,与Canvas相关的函数就会被调用将近50次。

NoteCalls的数值取决于在Canvas里使用UI元素的数量

我们可以更好的理解下面这张GIF图:

如上图所示,在游戏场景中Canvas跟随相机一起移动。因此,这便导致在Canvas里的UI元素在Unity引擎中必须重新定位,所以UI元素越多,需要消耗的性能就越高。

那么解决方案是什么?

2. Screen Space Overlay

现在,改变Canvas的渲染模式为 Screen Space Overlay,并且重复上面的步骤,然后在Profiler的Search中输入Canvas,注意数据的变化

注意Calls数据的变化,是否已经减少了?现在Calls显示的数据加起来差不多等于前面Screen Space Camera模式所显示的Calls数据的个位数。

哈哈,这么一来我们优化了大约90%的性能,是不是很神奇啊?

如上图所示,Canvas在Unity空间的位置保持不变,相机的移动不会影响Canvas及Canvas里的所有UI元素。(它能会静静的在那里装逼,动都不动了)

因此,就不再需要为Canvas里的UI元素重新定位,这便减少了Calls的次数,优化了性能

这样我们的优化任务算是完成了

3.World Space

在World Space渲染模式下,Canvas渲染对于每一个视图必须手动的管理,这造成的Calls和Screen Space Camera模式所造成Calls数量差不多,因此不再详述。

Screen Space Camera模式 和 World Space模式都会造成大量的Calls,所以还是建议大家使用Screen Space Overlay模式,这样有利于性能的优化,提高了游戏的可玩度。

分类:
开发工具
  •