当前位置: 首页 > news >正文

准备阶段 Unity优化总纲

Unity优化总纲

我们在学习优化课程之前要预先做好准备功能

例如最主要是的接收到一个优化的任务,应该怎么做,其次怎么做,最后怎么做。

也要学习一些专业工具以及专业术语

了解游戏运行机制,在排查期间思路会更清晰

1.优化目的

  • 达成目标帧率
  • 运行帧率稳定
  • 确保目标画质

2.参与优化的部门

优化需要整个团队一起来做,不是某个神人可以搞定一切的

三个关键职能:

  • 美术:模型,贴图,绑定,动画,场景搭建
  • 技术美术:材质,shader,特效
  • 程序:游戏代码

3.优化流程

发现问题:什么平台,什么操作系统,什么情况下出现的问题,一般问题还是特例问题等。

定位问题:什么地方造成的性能问题,我们要用什么工具,什么方法确定瓶颈。

研究问题:确定用什么方案处理这个问题,要考虑性能优化的前提。

解决问题:按问题研究的结论去实际处理,并验证处理结果与预期的一致性。

4.影响性能的四大类问题

  • CPU
  • GPU
  • 带宽
  • 内存

我们可以形象的把CPU和GPU当做一个工厂,而内存相当于一个仓库,带宽相当于运输路线。

如果将他们当做一个整体来看,性能的瓶颈可能发生在两个工厂的生产能力,仓库的存储能力,以及工厂与工厂之间,工厂与仓库之间的道路是否畅通,运输工具和运输能力是否跟得上。

另外工厂内,或者说CPU和GPU也像整个工厂系统,他们内部也分为车间,仓库,也就是芯片内的逻辑处理单元ALU,工厂内的仓库L1,L2级的缓存,以及它们之间的通信,他们像车间与车间之间,车间与厂内仓库之间的道路的工厂系统,所以一旦定位到了出CPU和GPU上的问题时,我们还要再去看这个工厂内的系统优化,就像一个套娃,优化也需要迭代进行。

隐藏的几类小问题

  • 功耗比
  • 填充率
  • 发热量

比如说功耗比,可以理解成工厂生产相同数量的产品所需要耗费的能源,对比我们设备上,就是达到相同能力的耗电量,这对于一些用电池的设备也是个性能指标,同样功耗比越高,发热量也会越大,而填充率你可以理解成工厂运输道路使用50吨每车的运输载具,载具每小时出发,但是你的工厂每小时只能生产30吨的产品,或者说运输载具只有20吨,你一车装不完,两车又浪费的情况,换到我们实际渲染中你的纹理和资源很大,带宽一次传不过去,两次又浪费的情况,这时我们要修改资源大小,来匹配设备的带宽,避免填充率不足或者带宽阻塞问题。另外还有发热量,比如你的芯片主频很高,但功耗比很差,发热量也一定会升高,另外还有一些移动设备,不仅芯片发热,显示屏幕的功耗高也会造成发热,这样也会带来整体硬件温度高,一些操作系统会防止硬件温度过高,而采取硬件降频的方式,这同样会带来一些性能问题。

5.性能分析工具

  • Unity Profiler(主要)
  • Frame Debugger(调试渲染性能的利器):Frame Debugger在优化DrawCall和调试Shader时非常有用。
  • Physics Debugger
  • UIElements Debugger
  • IMGUI Debugger
  • Memory Profiler (Package Manager提供):检测Unity应用程序内存使用情况,帮助开发者找到内存泄漏和不必要的内存分配。
  • Profile Analyzer (Package Manager提供):标准的Profiler只能查看单帧的数据,而Profile Analyzer能够帮助开发者对一段时间内的性能数据进行更深入的分析。

6.常用词汇介绍

DrawcallDraw Call(绘制调用)是指渲染引擎向图形硬件发送渲染命令以绘制一个或多个图形对象的过程(Cpu向GPU发起的一种在屏幕上绘制内容的请求。)。每个Draw Call都代表了一次绘制操作,渲染引擎将要求图形硬件绘制一个或多个三维物体或图形元素。理解和优化Draw Calls对于提高游戏性能和渲染效率非常重要。

OverDraw:指在渲染过程中,同一像素被多次绘制的现象。当多个UI元素、模型、粒子系统、地形系统等重叠时,每个像素都需要被多次绘制,这超出了渲染所需的最小像素数,因此被称为Overdraw‌1。Overdraw会导致性能下降,尤其是在移动设备和VR设备上,因为它会增加GPU的负担‌。

7.优化时的环境

  • 编辑器运行
  • 真机运行

8.优化目标帧率

  • 市面上多数游戏:60fps
  • 市面上VR游戏:不同设备要求不同,但是基本在70fps以上

9.每帧的运行机制

  • 渲染一帧所需要的时间-->CPU计算所需时间+GPU消耗所需时长。
  • 每帧中所有事务完成的足够快时,游戏流畅运行。
  • 每帧中所有事务完成的不够快时,游戏运行卡顿。

CPU事务

  • skinning 
  • batching(Static Batching、Dynamic Batching 等批处理)
  • 物理相关计算
  • 粒子特效
  • 用户脚本(处理玩家输入等信息)
  • ..................

GPU事务

  • shader
  • drawcall
  • image effect(后处理)

内存事务

Unity由两部分内存来组成,原生内存(Native Memory)托管内存(Managed Memory)

其中 Native Memory 是引擎管理的内存,大家接触的会比较少,而且可操控性也比较少。例如资源文件,如:纹理贴图,模型网格,音频,动画等;以及引擎内部模块,如:渲染模块,粒子模块,物理模块等,这些所占的内存,就由Unity自身来进行管理的。

我们平时开发通常会接触到的是 Managed Memory,也就是我们自己定义的各种类,如果这部分内存爆了,就需要我们自己去进行优化。

需要注意的是,Managed Memory 包括了用户使用的 值类型(Value Type)值和引用类型(Reference Type) 对象 所占用的内存,通常情况下,值类型 分配在栈上,引用类型分配在堆上,栈上保存的只是一个引用地址,这其中只有 引用类型 的部分需要 Garbage Collection 进行管理

CPU和GPU并不各自孤立:

如果CPU在物理计算和脚本运行要花很多时间,那么即使shader优化的再好,也不会提高帧率。

如果GPU处理shader消耗大量时间,那么即使优化物理和脚本也不会提高帧率。

当 CPU 压力大,而 GPU 压力小时,就不应该采取一些加大 CPU 压力以减少 GPU 压力的方法。反之亦然。

因此我们要分析找到影响运行性能的短板。

10.针对性优化

1、CPU优化

CPU是Unity 3D游戏运行的核心处理器,负责处理游戏逻辑、物理计算以及渲染命令的调度。因此,CPU优化的关键在于减少不必要的计算开销,提高处理效率。

  1. 减少Draw Calls:Draw Call是CPU调用底层图形接口的过程,每次调用都会占用一定的CPU时间。因此,减少Draw Calls是提升渲染性能的重要手段。可以通过以下方式实现:

    • 使用批处理(Batching):包括静态批处理(Static Batching)和动态批处理(Dynamic Batching)。静态批处理适用于不移动的物体,而动态批处理则适用于小型动态物体。通过批处理,可以将多个物体合并为一个进行渲染,从而减少Draw Calls。
    • 合并材质和纹理:将多个物体使用相同的材质和纹理,可以更容易地进行批处理。同时,使用纹理图集(Texture Atlas)代替一系列单独的小贴图,也可以减少状态转换,提高渲染效率。
    • 优化Shader:使用简单的Shader算法,避免复杂的运算和效果,如反光、阴影等,这些效果会使物体多次渲染,增加Draw Calls。
  2. 物理组件优化:物理组件(如Rigidbody、Collider)会增加物理计算量,因此应尽量减少不必要的物理组件使用。同时,使用离散的碰撞检测方式,避免使用复杂的Mesh Collider。

  3. 代码优化:优化代码结构,减少不必要的计算。例如,使用for循环代替foreach循环,避免在Update方法中执行复杂的逻辑运算,使用协程(Coroutine)或定时器(InvokeRepeating)来分散计算负担。

2、GPU优化

GPU负责渲染游戏画面,其性能直接影响游戏的视觉效果和流畅度。因此,GPU优化的关键在于提高渲染效率,减少渲染开销。

  1. 减少顶点数量和面片数:简化模型,减少顶点数量和面片数,可以降低渲染复杂度,提高渲染效率。

  2. 纹理压缩:使用适当的纹理压缩格式,如ETC2、PVRTC(iOS)、S3TC(Android/PC),可以在保证视觉效果的前提下降低显存占用。

  3. 光照优化:使用光照贴图(Lightmapping)预计算静态物体的光影效果,避免实时计算。同时,减少实时光源和阴影计算,可以降低GPU的渲染负担。

  4. LOD技术:使用LOD(Level of Detail)技术,为高多边形模型制作低多边形的替代版本,在远距离时切换到低分辨率的模型,减少渲染负担。

  5. 遮挡剔除:使用遮挡剔除(Occlusion Culling)技术,剔除被遮挡的物体,减少不必要的渲染。

3、内存管理

内存管理是Unity 3D性能优化的重要环节,合理的内存管理可以避免内存泄漏和内存碎片,提高游戏的稳定性和流畅度。

  1. 对象池:使用对象池(Object Pooling)技术,重用已创建的对象,避免频繁地创建和销毁对象,特别是在需要反复生成或移除的物体(如子弹、敌人)上。

  2. 资源动态加载:使用Asset Bundles或Addressables动态加载和卸载资源,避免在场景开始时加载过多资源占用内存。

  3. 减少垃圾回收:避免在运行时频繁创建和销毁对象,减少垃圾回收(Garbage Collection)的频率,从而降低CPU的开销。

  4. 压缩图片和音频:通过压缩图片和音频文件,可以减少内存和带宽的消耗。

11.性能问题可能得情况

瓶颈可能性按由高到低的顺序排列(个人经验,仅供参考使用)

  • CPU利用率
  • 带宽利用率
  • CPU和GPU强制同步
  • 片元着色器指令:性能排查的时候改变屏幕分辨率即可
  • 可读写几何图形到CPU到GPU的传输
  • 可读写纹理CPU到GPU的传输
  • 顶点着色器指令
  • 几何图形复杂性

今天是2024年12月3日

重复一段毒鸡汤来勉励我和你

你的对手在看书

你的仇人在磨刀

你的闺蜜在减肥

隔壁的老王在练腰

而你在干嘛?

相关文章:

准备阶段 Unity优化总纲

Unity优化总纲 我们在学习优化课程之前要预先做好准备功能 例如最主要是的接收到一个优化的任务,应该怎么做,其次怎么做,最后怎么做。 也要学习一些专业工具以及专业术语 了解游戏运行机制,在排查期间思路会更清晰 1.优化目的…...

ubuntu防火墙(三)——firewalld使用与讲解

本文是Linux下,用ufw实现端口关闭、流量控制(二) firewalld使用方式 firewalld 是一个动态管理防火墙的工具,主要用于 Linux 系统(包括 Ubuntu 和 CentOS 等)。它提供了一个基于区域(zones)和服务&#x…...

zookeeper 搭建集群

基础的java 环境先安好,选择3台虚拟机 ip 不一样 机器应为奇数个 zookeeper 奇数个节点实际上是(2*n-1) 比偶数台机器少一台解决成本,并且能够满足 zookeeper 集群过半选举leader 的规则 # 3台虚拟机 将zookeeper 解压到服务器上 #在 conf/ 目录下 找到zoo_s…...

Java——异常机制(下)

1 异常处理之(捕获异常) (一般处理运行时异常) (try-catch-finally子句) (finally一般用于文件最后关闭) (catch捕获的子类在前父类在后——>不然父类在前面都让父类捕获掉了,会报错) (Exception是父类放在最后,如果前面没有捕获到,就…...

centos 手动安装libcurl4-openssl-dev库

下载源代码 curl downloadshttps://curl.se/download/ 选择需要下载的版本,我下载的是8.11.0 解压 tar -zxvf curl-8.11.0 查看安装命令 查找INSTALL.md,一般在docs文件夹下 –prefix :指定安装路径(默认安装在/usr/local&…...

JS学习(1)(基本概念与作用、与HTML、CSS区别)

目录 一、JavaScript是什么? (1)基本介绍 (2)简称:JS? 二、JavaScript的作用。 三、HTML、CSS、JS之间的关系。 (1)html、css。 (2)JavaScript。 …...

代码随想录算法训练营day50|动态规划12

不同的子序列 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。、 编辑距离中的删除元素,其实就是直接变数字,其只删除原来的较长的数组里的元素 递推模拟,使用s的最后一个元素匹配,或者删除…...

JavaWeb学习(2)(Cookie原理(超详细)、HTTP无状态)

目录 一、HTTP无状态。 (1)"记住我"? (2)HTTP无状态。 (3)信息存储客户端中。如何处理? 1、loaclStorage与sessionStorage。 2、Cookie。 二、Cookie。 (1&…...

java抽象类

目录 一.抽象类 1.什么是抽象类 2.抽象类特点 (1)抽象类不能直接实例化对象 (2)可以包含抽象方法和具体方法 (3)可以有构造方法 (4)抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修…...

minio集群部署–linux环境

原文地址:minio集群部署–linux环境 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 第一步:安装 有rpm、deb、和二进制文件安装方式。参考文档在:MinIO Object Storage for Linux — MinIO Object Storage …...

在vue3里使用scss实现简单的换肤功能

实现的换肤功能:主题色切换、亮色模式和暗黑模式切换、背景图切换 主题色就是网站主色,可以配置到组件库上面;亮色模式又分为两种风格:纯白风格和背景图风格,不需要背景图的话可以删掉这部分逻辑和相关定义&#xff1b…...

JavaScript编写css自定义属性

一、自定义属性 是在 CSS 中定义的变量,以 --开头。它们可以存储颜色、尺寸、字体等任何 CSS 值,并且可以在整个文档中重复使用。 :root {--primary-color: #3498db;--font-size: 16px; }body {color: var(--primary-color);font-size: var(--font-siz…...

我们来学webservie - WSDL

WSDL 题记WSDL系列文章 题记 举个例子 酒桌上大领导们谈笑风生,把酒临风,其喜洋洋者矣老张说能签下xx项目,一来证明了集团在行业中的翘楚地位,二来感谢各位领导给予的大力支持接下来的一周,项目经理、业务顾问相继入场&#xff0…...

【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现

在探索大语言模型的创意应用过程中,我们开发了一个基于多 Agent 的智能诗歌创作系统。本文将介绍如何通过多个专业化的 Agent 协同工作,实现根据地点和天气信息自动创作诗歌的功能。 GitHub Code 项目地址 核心架构设计 1. Agent 基类设计 from pydan…...

001 LVGL PC端模拟搭建

01 LVGL模拟器介绍 使用PC端软件模拟LVGL运行,而不需要任何嵌入式硬件 环境搭建:codeblocks-20.03mingw-setup 正常安装流程即可 工程获取:LVGL官网-> github仓库 本地安装包下载资源包 工程模版和软件安装包 补充:…...

AJAX三、XHR,基本使用,查询参数,数据提交,promise的三种状态,封装-简易axios-获取省份列表 / 获取地区列表 / 注册用户,天气预报

一、XMLHttpRequest基本使用 XMLHttpRequest(XHR)对象用于与服务器交互。 二、XMLHttpRequest-查询参数 语法: 用 & 符号分隔的键/值对列表 三、XMLHttpRequest-数据提交 核心步骤 : 1. 请求头 设置 Content-Type 2. 请求体 携带 符合要求 的数…...

mybatis之数据统计与自定义异常处理

文章目录 需求描述定义实体方式一、mybatisPlus实现方式二、自定义SQL实现简单查询过滤查询 异常处理1、SQL拼写异常 在使用Mybatis或MybatisPlus进行数据统计,在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍,本次要使用其进…...

qt creator使用taglib读取音频元信息,windows平台vcpkg安装

注意:qt creator用的构建组件是qt 6.2.3 MSVC2019 64bit 安装vcpkg // 我的安装位置C:\vcpkg git clone https://github.com/microsoft/vcpkg.git C:\vcpkg cd C:\vcpkg .\bootstrap-vcpkg.bat// 设置系统环境变量 VCPKG_ROOT C:/vcpkg用vcpkg安装taglib vcpkg …...

设计模式之生成器模式

目录 1.简介 2.结构 3.使用场景 4.实例 5.优缺点 6.与其他模式的关系 7.总结 1.简介 生成器模式(Builder Pattern)是一种创建型设计模式,它允许你通过一步一步构建复杂对象,而不是通过一个包含大量参数的构造函数或方法。该…...

python学opencv|读取图像(三)放大和缩小图像

【1】引言 前序已经学习了常规的图像读取操作和图像保存技巧,相关文章链接为: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(二)保存彩色图像-CSDN博客 今天我们更近一步,学习放大和缩小图像的技巧&…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

python/java环境配置

环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...