【Unity面经】性能优化篇

news2024/9/21 22:32:05

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 专栏交流🧧
🟥Unity100个实战基础✨🎁
🟦 Unity100个精华一记✨🎁
🟩 Unity50个demo案例教程✨🎁
🟨 Unity100个精华细节BUG✨🎁
🟨 Unity100个面试题✨🎁

在这里插入图片描述

在这里插入图片描述


文章目录

    • 前言
    • 🎶(==一==) 有使用过Unity性能工具吗
    • 🎶(==二==) 有哪些减少性能消耗的方法和手段
      • 🪶1.检测和早期手段
      • 🪶2. 内存优化
      • 🪶3. 物理引擎的优化
      • 🪶4. 优化脚本(需深入)
      • 🪶5. 管理内存和包体优化
      • 🪶6. 渲染优化
      • 🪶7. 美术方面的优化
      • 🪶8.网洛优化
    • 🅰️系统路线学习点击跳转


前言


🎶( 有使用过Unity性能工具吗


Unity Profiler可以帮助我们监测游戏在运行时的性能表现,包括CPU、GPU的占用情况,内存分配情况、渲染性能及网络活动等。

性能优化”最重要的方式,是从”项目管理”上防止”游戏做完马上要上线”时出现的性能问题。在日常项目管理中,把性能监控起来,问题尽早发现,尽早动态清零,这样才能做到项目从性能风险上是可控的

从项目正式开发的第一天起就引入多平台测试与完整的测试机制;

如做渲染管线定制,编写了Shader,效果,还要注意必须要最快的速度尽早多平台测试。在项目开始就上多平台,才能发现各个平台不同的差异,尽快解决这些差异与问题。同时还要构建游戏核心玩法中的极限情况模拟,来应对项目后期大量战斗单元出现导致的性能问题。

使用Unity Profiler性能工具检测性能参数的变化

做好性能优化的最重要的手段

完整的工程管理机制
与测试共存,
动态清零包含性能在内的问题,是


🎶( 有哪些减少性能消耗的方法和手段


🪶1.检测和早期手段


a:代码算法与系统底层功底
b:工程管理手段: 通过工程手段测试出来了性能问题
c: 打印:
d: 性能工具剖析手段:


🪶2. 内存优化


1.使用对象池缓存池,减少内存碎片,减少对象的反复构建,避免GC峰值冲击等
原理:频繁创建和销毁对象会导致性能问题,尤其是在游戏中经常需要创建和销毁大量对象时。

举例:在射击游戏中,使用对象池来重用子弹对象。创建一个BulletPool类,在游戏开始时预生成一定数量的子弹对象,当子弹被射出时从池中取出一个对象,当子弹消失时将其返回池中而不是销毁它。

2.共享池(享元模式):整个游戏全部角色共享同一个对象
3.确保及时清理不再使用的对象避免重复加载相同的资源:
4.重用缓存资源:使用 Resources.Load() 时,避免重复加载相同的资源,应该缓存资源的引用并重用它们。

5.使用 Asset Bundles 或 Addressables:管理和优化资源的加载和卸载。

6.合理使用 Dispose 方法

7.释放非托管资源:对于实现了 IDisposable 接口的对象,如文件流、网络连接等,确保正确调用 Dispose 方法来释放资源。


🪶3. 物理引擎的优化


减少物理引擎的迭代参数,减少计算量,减少物理刚体的数目。简化碰撞体

原理:复杂的碰撞体会增加物理计算的负担,简化碰撞体可以显著提升性能。

使用简单的碰撞体:对于一个大型建筑物模型,使用一个简单的盒子碰撞体来代表它,而不是使用复杂的Mesh Collider。复杂的Mesh Collider适用于需要精确碰撞检测的对象,例如角色模型的碰撞体。

减少物理计算
原则:减少不必要的物理计算可以降低CPU的负担。

举例:调整物理模拟精度:对于不需要高精度物理模拟的对象,调整物理引擎的精度设置,例如,增加Fixed Timestep值以减少物理计算的频率。
使用简单碰撞体:在需要物理计算的对象上使用简单的碰撞体,而不是复杂的Mesh Collider。
这些原则和例子可以帮助你在面试中展示你对Unity性能优化的深入理解。通过具体的实例说明每个原则的应用,将展示你在实际开发中的实践经验和能力。


🪶4. 优化脚本(需深入)


原理:优化脚本可以减少CPU负担,尤其是对性能敏感的游戏。

举例:

减少Update调用:在Update方法中避免执行昂贵的操作。如果一个操作不需要每帧更新,可以放到FixedUpdate()或者LateUpdate()中,或者使用事件和定时器来触发。

缓存引用:在Update中频繁访问GameObject.Find()会导致性能问题。将对象的引用缓存到变量中,避免重复调用。
for循环内部不要过多

减少频繁的 Find 操作

缓存引用:避免在每帧调用 GameObject.Find(),在初始化时缓存对游戏对象的引用。

寻路导航优化: 优化寻路算法,流场寻路等,多线程。


🪶5. 管理内存和包体优化

优化图片,声音体积,通过改变压缩参数来降低这些资源的体积大小。可以使用服务器上部署资源包来实现打空包机制进一步减少包体体积。

原理:有效管理内存可以避免内存泄漏和频繁的垃圾回收,从而提高应用的性能。

举例:

避免频繁的内存分配:在游戏中频繁创建和销毁大量临时对象会导致频繁的垃圾回收。使用对象池或预分配内存来减少垃圾回收的次数。
使用Profiler工具:通过Unity的Profiler工具监控内存使用情况,识别内存泄漏和不必要的内存开销。


🪶6. 渲染优化


利用光照贴图:使用光照贴图可以减少实时光照计算的需求,特别是对静态对象。

举例:烘焙光照:在场景中使用光照贴图(Lightmaps)对静态环境进行光照烘焙,例如,房间的墙壁和地板,避免实时计算这些物体的光照。

看下pass的次数与set pass 次数, pass 次数
多次pass:阴影会导致,多光源会导致, 可以通过定制渲染管线,优化shader代码, 优化光照计算等,从Shader+渲染管线级别来做好渲染优化。LOD优化,远处用的面数少,近处用的面数多。抗锯齿算法优化等。

Draw Calls优化:

原理:每次渲染调用都需要CPU和GPU的协作,减少Draw Calls可以显著提高渲染性能。

举例
纹理图集合并:如果你的游戏有多个UI元素,每个元素都有不同的纹理,可以将这些纹理合并到一个大纹理图集中。这样可以减少纹理切换,从而减少Draw Calls。
网格合并:例如,你有一个场景中有多个相似的树木模型。通过将这些树木的网格合并成一个大网格,并在Shader中进行批处理,减少每帧的Draw Calls数量。

压缩纹理

原理:压缩纹理可以减少纹理占用的内存和带宽,提高渲染效率。

举例:
使用纹理压缩格式:将纹理设置为压缩格式,如DXT(对于PC)或ASTC(对于移动设备)。这可以显著减少纹理占用的内存和带宽,尤其是在大型场景中。

降低分辨率

原理:降低渲染分辨率可以减少图像处理的负担,提升帧率。

举例
动态分辨率调整:根据游戏性能动态调整分辨率。如果游戏帧率下降,可以降低渲染分辨率以提高性能。

合理使用光源

原理:减少实时光源的数量,优化光源的使用可以显著提升渲染性能。

举例:
减少动态光源数量:在一个场景中,尽量减少动态光源的数量。例如,将场景中的某些光源设置为静态光源,并使用光照贴图代替实时光源。

剔除未显示物体

原理:通过剔除看不到的物体来减少渲染负担。

举例:
视锥体剔除:Unity自动进行视锥体剔除,确保只有在摄像机视野内的物体才会被渲染。你可以手动优化剔除逻辑,例如,使用OnBecameInvisible方法来进一步管理物体的激活状态。
遮挡剔除:使用遮挡剔除(Occlusion Culling)功能来避免渲染被其他物体遮挡的物体。这有助于减少不必要的渲染开销。


🪶7. 美术方面的优化


优化动画:优化动画可以减少CPU和GPU的负担,提升游戏性能。

举例
动画压缩:在Animator中,使用动画压缩功能来减少动画数据的大小。对于角色动画,可以调整动画的压缩设置,以在不显著影响质量的前提下减少数据量。
动画剪裁:对于不需要精细动画的场景,使用简单的动画剪裁和循环动画来减少对性能的要求。

模型优化:通过细节增强,法线贴图,高度贴图,凹凸纹理等减少模型面试的同时获得很好的效果。

🪶8.网洛优化


网络优化: 异步IO代替同步IO,多线程处理网络消息, protobuf序列化与反序列化优化网络包体体积。KCP 替换传统的TCP。

减少网络数据包大小

示例:仅发送必要的数据,避免发送冗余信息,优化网络数据格式和压缩策略。

减少网络通信频率:

示例:避免频繁的状态更新,通过批量更新或使用事件驱动的方式减少网络通信的次数。

通过遵循这些基本的性能优化原则,开发者可以显著提升 Unity 游戏的性能,并提供更流畅的用户体验。

代码写法优化: for循环内部不要过多、、
跳转打乱CPU Cache等。……

在这里插入图片描述

🅰️系统路线学习点击跳转


👨‍💻 Unity程序基础学习路线🧧
⭐【Unityc#专题篇】之c#进阶篇】🎁
⭐【Unityc#专题篇】之c#核心篇】🎁
⭐【Unityc#专题篇】之c#基础篇】🎁
⭐【Unity-c#专题篇】之c#入门篇】🎁
【Unityc#专题篇】—进阶章题单实践练习🎁
⭐【Unityc#专题篇】—基础章题单实践练习🎁
【Unityc#专题篇】—核心章题单实践练习🎁

你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 查询优化秘籍:让你的数据库查询飞起来

《MySQL 查询优化秘籍:让你的数据库查询飞起来》 在数据库应用中,高效的查询性能至关重要。MySQL 作为广泛使用的关系型数据库,掌握一些常用的查询优化方法可以极大地提升系统的响应速度和性能。今天,我们就来一起探讨常用的优化…

WORD批量转换器MultiDoc Converter

WORD批量转换器MultiDoc Converter https://www.52pojie.cn/thread-1318745-1-1.html 可批量将doc、docx等文件格式转成doc、docx、pdf、rtf、txt、html、epub等格式。 安装包下载地址:https://wws.lanzouj.com/irvVbiz0pkd 最终下载文件打包地址(未作成…

QT Creater实现国庆节主题项目【0基础完成版】

本文适用对象 想要学习qt creater的小白;想要学习c++制作软件的编程爱好者。可以先下载这篇博客绑定的资源,然后一边操作,一边学习,会更高效~0. 创建初始项目 一步步来操作吧,首先下载qt creter,之前发布过相关资源,大家直接查找下载,或者自行下载。 1. 初始代码 mai…

C++竞赛初阶L1-15-第六单元-多维数组(34~35课)555: T456505 矩阵乘法

题目内容 计算两个矩阵的乘法。nm 阶的矩阵 A 乘以 mk 阶的矩阵 B 得到的矩阵 C 是 nk 阶的,且 C[i][j]=A[i][0]B[0][j]+A[i][1]B[1][j]+ …… +A[i][m−1]B[m−1][j](C[i][j] 表示 C 矩阵中第 i 行第 j 列元素)。 输入格式 第一行为 n,m,k,表示 A 矩阵是 n 行 m 列,B 矩…

如何使用 ONNX 结合 GPU 加速推理(CUDA 与 cuDNN 简明指南)

前言 在深度学习模型推理中,使用 GPU 进行加速是提升模型推理速度的关键方式之一。 本文将带大家一步步了解如何使用 ONNX Runtime 结合 NVIDIA 的 CUDA 和 cuDNN 进行 GPU 加速。 一、查找ONNX、CUDA与cuDNN之间的对应版本 首先,我们需要确保 ONNX Runtime 与 CUDA 和 cu…

数据流图例题

答案:A A 解析:DFD是数据流图 ERD是实体流程图,也就是ER图 数据流图的元素 数据流:、由一组固定成分的数据组成,表示数据的流向。每个数据流通常有一个合适的名词,反映数据流的含义 加工:加…

(计算机网络)运输层

一.运输层的作用 运输层:负责将数据统一的交给网络层 实质:进程在通信 TCP(有反馈)UDP(无反馈) 二.复用和分用 三. TCP和UDP的特点和区别 进程号--不是固定的 端口号固定--mysql--3306 端口--通信的终点 …

认识保护模式

认识保护模式 为什么需要保护模式 Intel 8086是16位CPU,它有着16位的寄存器,16位的数据总线以及20位的地址总线和1MB的寻址能力。从80386开始CPU进入32位时代,寻址能力达到4GB,无法使用16位寄存器完成寻址 GDT(global descriptor table) 而保护模式下,虽然段值仍…

《王者荣耀世界》不止在苹果16优化 多终端优化也在进行

易采游戏网9月10日消息:随着iPhone16的发布,全球手游玩家的目光再次聚焦于这款全新设备的性能表现。而作为国内游戏界的代表作之一,《王者荣耀世界》也将迎来一波重大的体验升级。这一次的优化并不只局限于iPhone16,实际上&#x…

客服宝:专业跨平台快捷回复软件

在这个信息爆炸的时代,客服工作的重要性不言而喻。然而,面对多渠道、高频率的咨询与互动,客服团队如何保持高效、专业且富有人情味的对话呢?客服宝——一款专业的跨平台快捷回复软件,以其独特的功能优势,为…

第三部分:4---进程地址空间

目录 数组的空间分配解析: 物理地址和虚拟地址: 虚拟地址空间: 进程地址空间的本质: 为什么要有进程地址空间? 页表对进程访问内存的检查: 进程地址空间和页表如何关联起来? 进程的独立…

源荷储再创新!小论文轻松发!基于雨流计数法的源-荷-储双层协同优化配置研究程序代码!

前言 如何实现源与荷信息互通,将传统的供需信息由静态传递向能源互联转变,形成能源互联网,是今后能源革命的变革方向。新电改的出台推动了能源互联网的发展,储能技术作为能源互联网发展中的关键元素,由于储能系统投资…

每个python程序员都应该早点知道的 6 个 Python 函数

在编程中,默认参数的引入使得函数调用更为灵活,不仅允许开发者在特定情况下省略某些非必需参数,同时也强调了对参数与实际传递值(即论点)之间区别的理解,这对于掌握函数工作机制至关重要。 此外&#xff0…

PCL-统计滤波

本篇内容 讲解统计滤波作用及原理通过pcl实现统计滤波强烈推荐在点云处理最开始使用,统计滤波处理,再送入其他算法进行处理!!! 效果: 1 主要原理 手动设置半径大小或者邻域点数量N(若设置的…

“论剑”智算时代,长沙已经站在计算产业的“华山之巅”

文 | 智能相对论 作者 | 陈泊丞 共赴全新十年之约,长沙又来搞大事情了! 2024互联网岳麓峰会以“AI汇湘江 数智领航未来”为主题,全面聚焦在“AI”时代把握数字化、网络化、智能化发展机遇,积极响应当前人工智能技术迅猛发展的势…

【Qt笔记】QTableWidget控件详解

目录 引言 一、QTableWidget的特点 二、QTableWidget基础 2.1 引入QTableWidget 2.2 基本属性 三、代码示例:初始化QTableWidget 四、编辑功能 4.1 设置单元格为只读 4.2 响应内容更改 五、选择模式 六、样式定制 七、与其他控件的交互 7.1 在单元格…

网络工程师学习笔记——无线通信网(二)

MAC子层 包含逻辑链路层&#xff08;LLC&#xff09;和介质访问控制层&#xff08;MAC&#xff09;两个子层 无线访问机制 MAC子层是提供访问机制控制 <1>CSMA/CA是类似于802.3当中的CSMA/CD且支持竞争访问 为何不适用CSMA/CD ,因为有隐藏的节点和暴露的节点&#xf…

QT天气预报

json 理论 什么是JSON? 规则 被大括号包括的是JSON对象,被中括号包括的是JSON数组. JSON数组JSON对象 实验 构建JSON 用代码实现如下json内容: //构建JSON void WirteJson() {QJsonObject rootObject;//1.插入name字段rootObject.insert("name","china&quo…

新手必看,​7款常见的短视频剪辑软件附详细教程,一看就会!

视频剪辑已经成为了我们生活和工作中常见的需求之一&#xff0c;windows视频编辑软件有很多&#xff0c;从简单的剪辑到复杂的视觉效果制作&#xff0c;不同的视频剪辑软件满足不同剪辑需求。本文将详细介绍一些广泛使用的视频制作软件&#xff0c;包括它们的功能特点以及一些高…

前海打工人的免费公园停车场

现在桂湾公园地下停车场距离前海的搬砖的写字楼近一些也好一些&#xff0c;由于主打一个免费&#xff0c;故很多情况都被预约满了。我住的地方在宝安石岩&#xff0c;提前1小时预约根本就没办法到停车场。故我最近都是停前海运动公园的地面停车场【372个停车位】。但是这个地面…