项目优化之Canvas优化(Unity3D)

简介: Canvas Setting 目标给你一个关于怎么去设置Canvas(画布)工作的建议现在,我们做一个简单的例子,让我们对这些选项一个一个的测试,以便我们能更好去了解它。

一、Unity提供Canvas(画布)来创建UI

Canvas有以下三种渲染模式:

  1. Screen Space Camera
  2. Screen Space Overlay
  3. World Space

Canvas Setting 目标给你一个关于怎么去设置Canvas(画布)工作的建议

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


1.Screen Space Camera

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

C#脚本: MoveCamera.cs

  1. 在你的Scene视图下创建一个Canvas
  2. 设置它的Renderer mode(渲染模式)选项为:Screen Space - Camera
  3. 拖拽Main Camera到该选项条上去

网络异常,图片无法展示
|

  1. 在Canvas下创建一个Panel,且随便拿一张图片或纹理作为背景
  2. 在Canvas下创建尽可能多的Text、Panel、Image

网络异常,图片无法展示
|

  1. 为Main Camera添加如下脚本
using UnityEngine;
  using System.Collections;
  public class MoveCamera : MonoBehaviour
  {
      private float velocity = 0.0f;
      private float smoothTime = 0.3f;
      private bool moveCamera = false;
      public Vector3 initialPosition;
      public Vector3 targetPosition;
      public float lerpSpeed;
      public float initialZ;
      public float targetZ;
      public Camera cam;
      void Update ()
      {
          if (Input.GetMouseButtonDown (0)) {
              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));
      }
  }
复制代码
  1. 为脚本中的Cam参数赋值(把Main Camera拖拽上去)

网络异常,图片无法展示
|

  1. 使用安卓手机连接Profiler进行测试(如果不会的朋友,请观看手机连接Profiler教程篇;如果真的很懒的话,那就直接播放,然后这在拖动Transfrom上的Position或者Rotation改变它的值即可)

网络异常,图片无法展示
|

  1. 在安卓手机上运行该项目,点击运行(摇晃手机,相机将会在任意一个方向或角度上旋转或移动),并且注意看Prefiler里的性能分析
  2. 在Profiler里的Search中输入“Canvas”,你将会在Profiler中看到一些Canvas数据。

网络异常,图片无法展示
|

你可以在上图中看到,有许多与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模式,这样有利于性能的优化,提高了游戏的可玩度。



相关文章
|
存储 设计模式 监控
运用Unity Profiler定位内存泄漏并实施对象池管理优化内存使用
【7月更文第10天】在Unity游戏开发中,内存管理是至关重要的一个环节。内存泄漏不仅会导致游戏运行缓慢、卡顿,严重时甚至会引发崩溃。Unity Profiler作为一个强大的性能分析工具,能够帮助开发者深入理解应用程序的内存使用情况,从而定位并解决内存泄漏问题。同时,通过实施对象池管理策略,可以显著优化内存使用,提高游戏性能。本文将结合代码示例,详细介绍如何利用Unity Profiler定位内存泄漏,并实施对象池来优化内存使用。
1098 0
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
590 0
|
编译器 vr&ar 图形学
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
这是一篇Unity3D结合Vuforia实现增强现实(AR)项目的入门教程,涵盖了环境配置、Vuforia账户注册、Target数据集创建、Unity项目设置、AR程序配置、Android环境配置以及最终在手机上测试运行的全过程。
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
|
开发者 图形学 iOS开发
掌握Unity的跨平台部署与发布秘籍,让你的游戏作品在多个平台上大放异彩——从基础设置到高级优化,深入解析一站式游戏开发解决方案的每一个细节,带你领略高效发布流程的魅力所在
【8月更文挑战第31天】跨平台游戏开发是当今游戏产业的热点,尤其在移动设备普及的背景下更为重要。作为领先的游戏开发引擎,Unity以其卓越的跨平台支持能力脱颖而出,能够将游戏轻松部署至iOS、Android、PC、Mac、Web及游戏主机等多个平台。本文通过杂文形式探讨Unity在各平台的部署与发布策略,并提供具体实例,涵盖项目设置、性能优化、打包流程及发布前准备等关键环节,助力开发者充分利用Unity的强大功能,实现多平台游戏开发。
626 0
|
API 开发工具 vr&ar
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
|
开发者 图形学 UED
深度解析Unity游戏开发中的性能瓶颈与优化方案:从资源管理到代码执行,全方位提升你的游戏流畅度,让玩家体验飞跃性的顺滑——不止是技巧,更是艺术的追求
【8月更文挑战第31天】《Unity性能优化实战:让你的游戏流畅如飞》详细介绍了Unity游戏性能优化的关键技巧,涵盖资源管理、代码优化、场景管理和内存管理等方面。通过具体示例,如纹理打包、异步加载、协程使用及LOD技术,帮助开发者打造高效流畅的游戏体验。文中提供了实用代码片段,助力减少内存消耗、提升渲染效率,确保游戏运行丝滑顺畅。性能优化是一个持续过程,需不断测试调整以达最佳效果。
524 0
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
573 2
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6(附带项目源码)
337 1
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
274 0
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
438 0

热门文章

最新文章