网站怎么做搜索功能/南宁网站推广排名
性能优化之资源优化
- 资源优化
- 性能关键检测流程。
- 浅析一下基于Unity3D 美术规则约束
- 一、模型层面
- 二、贴图层面
- 三、动画层面
- 四、声音层面:(音频通用设置)
- 五、UI层面:
- 题外点:诚然在优化中,美术占比是很重要的,所以咱们从理论上再来理解一下美术制作流程。
资源优化
我们都知道,制作游戏应用,性能优化总是老生常谈的问题。也许我们可能会从CPU(复杂的计算、物理模拟)、GPU(过多的顶点计算等)入手定位考虑,但是真正落实的优化还得从项目具体情况决定,并且在优化过程中,我们需要懂得善用工具,如Unity Profiler、UWA、URP等相关性能工具。另外我们还得远离那些奇怪的想法,觉得性能优化应该是属于游戏应用的最后一道环节,所以导致在实际项目优化时会感觉特别的痛苦和无力,例如,优化中涉及美术资源的修改的,而美术资源一旦涉及需要修改,就相当于面临资源重做的成本,所以项目优化应该从项目立项需求设计、资产制作环节、架构设计等环节就开始, 并尽早验证核心玩法性能,才能成就出一款优质的应用产品。
性能关键检测流程。
浅析一下基于Unity3D 美术规则约束
一、模型层面
1、模型比例,严格遵循模型与模型之间,模型场景之间的比例要正确统一(单位和比例),模型坐标统一为原点。
2、减面操作,主要是去掉对模型造型没有影响的⾯,⽤尽可能少的⾯数表达清楚模型的结构和造型。⽐如:物件⾮关节点及物件背⾯、内部不会看见的⾯删掉。
3、减少模型顶点的数量,模型顶点的数量会影响GPU的性能,所有物体不超过20000个三角面,人模模型面数控制在3000-4000面,移动端单个人体骨骼数量控制在30个~50个左右。
4、合并模型,合并同⼀⼩范围内的⾮交互类的静态⼩物件,同时合并⼩物件的贴图。这样可以减少Draw Call的数量。如,⼀组不同⼤⼩的⼩草,⼀组⼤⼩形状不同的⽯头,⼀个书架和上⾯放置的很多书籍等。把这些⼩物件合并成⼀个Object,贴图也合成成⼀张贴图。
5、模型的重复利⽤,相同的多个物件在Unity内复制使⽤,复制的多个物体在引擎计算上算⼀个物体。但也不可复制太多个,太多会对内存带来很⼤压⼒。相同的物件太多,建议把⼏个合并成⼀组做为⼀个Object,多做⼏组,再进⾏复制。
6、减少模型UV接缝和硬边的数量。
7、减少Material的数量,实际上一个模型至少需要一张贴图,如果可能,可以将多张贴图拼成一张贴图,这样多个模型可以共享同一个Material。
8、尽可能减少像素灯光、阴影、反射的使用,这些功能会导致模型被渲染多次,加重CPU的负担。
9、地形优化,如果是⽤unity⾃带的地形⼯具制作的地形,可以⽤T4M插件转化成T4M格式地形,设置⼀个顶点值转化后可以对地形优化很多。T4M也可以设置Lod模型。
10、FBX资源中有太多的顶点, 请检查是否必要Custom Parameters: VertexCountLimit : 500,(顶点数一般限制为500)在满足美术效果下,尽量减少顶点数。
11、检查文件Mesh读/写标记,默认关闭。
12、资源根据国内标准(参考UWA):低端、中端、高端设备建议总面数控制在30w, 40w ,50w。Unity手游性能白皮书
二、贴图层面
1、贴图⼤⼩,在移动设备上的贴图最⼤要控制在1024和512⼤⼩,可少量使⽤2048⼤⼩的贴图,以1024、512⼤⼩贴图为主,其他非主图例如法线、遮光、自发光图可以设定更小。
2、重复贴图的使⽤,⼤⾯积相同材质使⽤1-3种贴图交替重复覆盖,通过光影变化打破贴图的重复感。
3、贴图使用Bitmap贴图类型,尺寸主要为2的N次方。检查Inspector -> Advanced -> Non-Power of 2选项. 建议使用原始大小为2的幂次的贴图。大小非2的幂次的纹理资源将无法使用ETC1和PVRTC压缩格式。在导入时自动伸缩为2的幂次也可能会导致内存占用或者贴图质量问题。
4、少用透明贴图,能不⽤就不要⽤。透明贴图⾮常消耗GPU资源。并且带Alpha通道的贴图存储为tga或者png格式,在命名时必须加_al以区分。
5、贴图压缩,对贴图进⾏PVRT(iOS)或是ETC(Android)格式的压缩可以减少⼤量内存消耗。建议场景的材质可以⽤Substance材质系统转成.sbsar 格式材质。 Substance材质可以⼤⼤压缩贴图数据的⼤⼩但不损失贴图质量。
6、检查Mipmap标记,检查Inspector -> Advanced -> Generate Mip Maps选项,未压缩的纹理资源启用Mipmap标志会增加内存占用。
应用限制:未压缩的纹理资源应该禁用mipmap。类型为Sprite的纹理资源应当禁用mipmap。Mipmap 会增加游戏包体的大小和占用一定量的内存,但在游戏中Mipmap的渲染可以减少显存带宽,降低渲染压力,随着相机的推远贴图会随之切换成低像素的体贴,从而节省资源开支。过的Mipmap使用会对内存造成很大压力,因此建议只对大物件设置Mipmap。
7、检查纹理读/写标记,检查Inspector -> Advanced -> Read/Write Enabled选项,默认必须要关闭,开启纹理资源的读/写标志会导致双倍的内存占用。8、检查纹理资源的过滤模式,检查Inspector -> Filter Mode选项,纹理的过滤模式一般不建议使用Trilinear,会占用较高的计算资源。
三、动画层面
1、动画资源压缩方式 查看Inspector -> Animation Tab -> Anim. Compression选项,动画资源使用最佳压缩方式可以提高加载效率。 off:表示不采用压缩处理。keyfram Reduction:使用关键帧进行处理(旧版本unity:keyfram,reduction and compression表示关键帧减少和压缩)。Optimal:(新版本unity)自动选择一个最优的压缩方式。
2、检查动画资源的Optimize Game Objects选项,查看Inspector -> Rig Tab -> Optimize Game Objects选项,动画资源应该勾选Optimize Game Objects选项来减少CPU消耗。
3、动画帧率、帧数控制,一般情况下每秒10帧,一个动画在1秒内完成。
4、动画模型的命名统一为基础模型名字➕@➕(动画前缀anim_)动画名字,做统一规范,同时会把该动画自动命名为@后面的名字。命名全部用英文或者拼音,并统一小写,不能出现中文。例如机器人待机动画(导出带动画骨骼的FBX文件提供给技术),C_RobotQ@anim_daiji。这样在Unity可以自动规范好anim clip 名称。
四、声音层面:(音频通用设置)
Force To Mono:这个选项作用是强制单声道,很多声音为了追求质量会设置成双声道,导致声音在包体和内存中,占用的空间加倍,但是95%以上的声音,两个声道是完全一样的数据。因此对声音不是很敏感的项目建议勾选此项,来降低内存的占用。
Compression Format:不同的平台有不同的声音格式的支持,IOS对MP3有硬件支持,Android暂时没有硬件支持。建议IOS适合使用ADPCM和MP3格式,Android适合使用Vorbis格式。
Load Type:检查Inspector -> (Platform Tab) -> Load Type选项,音频加载类型,决定声音在内存中的存在形态:
Decompress On Load:当Audio Clip被加载时,解压声音数据,适用于小型音频文件(< 200kb)
Compressed In Memory:声音数据将以压缩的形式保存在内存当中,适用于中型音频文件(>= 200kb)
Streaming:从磁盘读取声音数据,适用于大型音频文件,例如背景音。注:例如Decompress On Load,要求文件必须小于200kb,因为内部内存管理的问题,如果是大于200kb的文件,那么也还是只会被分配到不足200kb的内存。
Bitrate:可以对音频文件本身进行压缩,降低文件的比特率(bitrate),前提音频品质不会被破坏太严重。
五、UI层面:
1、UI的隐藏可以使用将其移到Canvas外的方法,而不是SetActive(false)的方法来隐藏。
2、UI的批处理,如果UI元素会改变数值或是位置,会影响批处理,导致向GPU发送更多的drawcall。因此建议:将更新频率不同的UI放在不同的Canvas上。相同Canvas中的UI元素的Z值要相同,这样才不会打断批处理。相同Canvas中的UI元素要使用相同的材质和纹理,材质或着色器可以有动态变换(例如一些特效),这不会影响批处理。相同Canvas中的UI元素要使用相同裁剪矩阵。
3、Graphic Raycaster 该组件是用来处理输入事件,默认挂载在每个Canvas上。有时不能互动的对象仍是canvas中的一部分,并附带了该组件,所以当每次鼠标或触控点击时,系统就要遍历所有可能接受输入事件的UI元素,就会造成多次的 "点落在矩形中"的检查,来判断对象是否该作出反应。在UI很复杂的情况下,这个运算成本就会很高。因此建议确保只有可互动的Canvas才有该组件,节省CPU运行时间。
4、全屏UI的处理,游戏中可能会有些全屏UI(例如一些设置界面),会遮挡住场景物体或其他UI元素。然而它们即使被遮挡看不见,CPU和GPU还是会有消耗,因此建议:3D场景完全被遮挡的话,关闭渲染3D场景的摄像机。被遮蔽的UI,Disable这些Canvas,注意不是SetActive(false)。尽可能的降低帧率,因为这些UI一般不需要频繁刷新。
题外点:诚然在优化中,美术占比是很重要的,所以咱们从理论上再来理解一下美术制作流程。
次世代(Next Generation)与传统游戏相比,次世代游戏是把次世代游戏开发技术融入到现代游戏之中,通过增加模型的面数和贴图的数据量并使用次世代游戏引擎改善游戏的画面效果。标准表现在:模型达到高精度(高模) 、PBR流程的采用(真实法线+高光贴图)在真实光照下表现质感,属于新的游戏引擎技术。
PBR(Physically Based Rendering):PBR就是一种基于物理渲染,通过对真实世界物理现象进行逼近、模拟、再现,使3D对象在不同环境下都能展现出逼真的渲染质感,并通过材质的参数化将材质制作这一手工业流程转化成为标准化、流水化的工业流程。
优秀的资源链接分享:
1、Unity 官方Profiler:https://docs.unity3d.com/Manual/ProfilerMemory.html
Unity URP:https://upr.unity.cn
2 、UWA相关:
2.1 使用UWA GOT优化Unity性能和内存:https://blog.uwa4d.com/archives/2029.html
2.2 可试用的产品介绍:https://blog.uwa4d.com/archives/UWA_PipelineV2-4.html
2.3 pipeline产品的介绍:https://blog.uwa4d.com/archives/UWA_Pipeline42.html
2.4 本地资源检测相关介绍:https://blog.uwa4d.com/archives/UWAGOTOL_Summary.html
2.5 GOT Online相关介绍:https://www.uwa4d.com/demo/projects.html
3、Unity 资源相关:
3.1 Unity 优化实践学习(二) 资源优化:https://blog.csdn.net/dengshunhao/article/details/82663719
3.2 Unity场景美术资源优化:https://blog.csdn.net/weixin_34203832/article/details/92379182
3.3 Unity整体性能优化篇 第(二)节-Unity资源优化:https://blog.csdn.net/chongzi_daima/article/details/101381290
4、Unity渲染技术:http://imgtec.eetrend.com/blog/2020/100050575.html
5、如何使用 Unity 和 Arm 分析工具解决移动端游戏性能问题(上篇):https://mp.weixin.qq.com/s/968NoWRjcV2rNYH51Mbfqg
6、全新Arm Mobile Studio for Unity软件包,增强移动端性能分析:https://developer.unity.cn/projects/60e2a5f9edbc2a04cfc5e341
7、Unity 性能优化经验整理:https://segmentfault.com/a/1190000019844821?utm_source=tag-newest
8、LuaProfiler:https://github.com/leinlin/Miku-LuaProfiler
9、Memory Profiler:https://docs.unity3d.com/Packages/com.unity.memoryprofiler@0.7/manual/index.html
https://www.bilibili.com/video/av334941622
10、垃圾回收:https://docs.microsoft.com/zh-cn/dotnet/standard/garbage-collection/fundamentals
11、Lua引用: https://github.com/jxhgzs/LuaMemorySnapshotDump
12、【Unity项目优化】之根据UPR资源检测报告进行项目资源优化总结:https://blog.csdn.net/qq_42437783/article/details/124275092
相关文章:

性能优化之资源优化
性能优化之资源优化 资源优化性能关键检测流程。浅析一下基于Unity3D 美术规则约束一、模型层面二、贴图层面三、动画层面四、声音层面:(音频通用设置)五、UI层面: 题外点:诚然在优化中,美术占比是很重要的…...

ChatGPT免费 | 8个免费使用GPT-4的方法
这篇文章为寻找免费使用GPT-4技术的读者提供了一份实用的指南。 每个推荐的平台都包括了简要的描述和链接,方便读者直接访问。 以下是根据你提供的内容,稍作整理的文章结构: 1. HuggingFace 描述: 提供GPT-4等多种语言模型的平台。 如何使用:…...

解决Qt“报无法定位程序输入点xxx于动态连接库“问题
今天,在使用QtVS2019编译工程时,弹出"无法定位程序输入点xxx于动态链接库"问题,如图(1)所示: 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多: (1) 工程Release/Deb…...

wpf-MVVM绑定时可能出现的内存泄漏问题
文章速览 引言错误示范示例1示例2 坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 引言 正确结构: Model <——> ViewModel <——> View 但很多时候,很容易出现…...

【飞凌 OK113i-C 全志T113-i开发板】一些有用的常用的命令测试
一些有用的常用的命令测试 一、系统信息查询 可以查询板子的内核信息、CPU处理器信息、环境变量等 二、CPU频率 从上面的系统信息查询到,这是一颗具有两个ARMv7结构A7内核的处理器,主频最高1.2GHz 可以通过命令查看当前支持的频率以及目前所使用主频 …...

基于iOS平台的车牌识别表情识别项目
基于iOS平台的车牌识别&&表情识别项目 简介 该项目客户端搭载于iOS平台,服务端搭载于阿里云服务器,主要功能是通过拍照或选取相册图片来进行车牌的识别以及人脸表情识别。本文便是对项目整体流程设计思路和具体实现做一个详细介绍。 整体实…...

Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪声信道中的误码率与归一化信噪比的关系
本文为学习所用,严禁转载。 本文参考链接 https://zhuanlan.zhihu.com/p/667382398 QPSK代码及高斯白噪声如何产生 https://ww2.mathworks.cn/help/signal/ref/butter.html 滤波器 https://www.python100.com/html/4LEF79KQK398.html 低通滤波器 本实验使用matlab仿…...

九:爬虫-MongoDB基础
MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其…...

机器学习之实验过程01
import pandas as pd import numpy as np import matplotlib.pyplot as plt data_path /home/py/Work/labs/data/SD.csv # 请确保您的数据文件路径是正确的 df pd.read_csv(data_path) df.head() # 创建散点图 # 创建散点图 plt.figure(figsize(10, 6)) plt.scatter…...

【【迭代16次的CORDIC算法-verilog实现】】
迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …...

IntelliJ IDEA 2023.3 安装教程
引言 IntelliJ IDEA,通常简称为 IDEA,是由 JetBrains 开发的一款强大的集成开发环境,专为提升开发者的生产力而设计。它支持多种编程语言,包括 Java、Kotlin、Scala 和其他 JVM 语言,同时也为前端开发和移动应用开发提…...

Go 错误处理
Go 错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error类型是一个接口类型,这是它的定义: type error interface {Error() string }我们可以在编码中通过实现 error 接口类型来生成错误信息。 函数通常在最后的返回值中返回错误…...

HarmonyOS构建第一个ArkTS应用(Stage模型)
构建第一个ArkTS应用(Stage模型) 创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发…...

故障排查利器-错误日志详解
目录 什么是错误日志 错误日志的作用 错误日志的内容 错误日志的格式 错误日志的生成方式 错误日志的解析和处理 错误日志的最佳实践 小结 错误日志是软件开发和运维中非常重要的一部分,记录了应用程序运行过程中发生的错误和异常信息,如错误类型…...

微信小程序(uniapp)api讲解
Uniapp是一个基于Vue.js的跨平台开发框架,可以同时开发微信小程序、H5、App等多个平台的应用。下面是Uniapp常用的API讲解: Vue.js的API Uniapp采用了Vue.js框架,因此可以直接使用Vue.js的API。例如:v-show、v-if、v-for、comput…...

overtureDNS使用介绍
Overture是一个定制的DNS中继服务器。 在此下在二进制版本 https://github.com/shawn1m/overture/releases默认配置文件./config.yml bindAddress: :53 debugHTTPAddress: 127.0.0.1:5555 dohEnabled: false primaryDNS:- name: DNSPodaddress: 119.29.29.29:53protocol: udp…...

平衡二叉树的构建(递归
目录 1.概念:2.特点:3.构建方法:4.代码:小结: 1.概念: 平衡二叉树(Balanced Binary Tree),也称为AVL树,是一种二叉树,它满足每个节点的左子树和右…...

flutter开发实战-设置bottomNavigationBar中间按钮悬浮效果
flutter开发实战-设置bottomNavigationBar中间按钮悬浮的效果 在使用tabbar时候,可以使用bottomNavigationBar来设置中间凸起的按钮,如下 一、效果图 中间按钮凸起的效果图如下 二、实现代码 我们使用BottomAppBar 一个容器,通常与[Sscaf…...

不同参数规模大语言模型在不同微调方法下所需要的显存总结
原文来自DataLearnerAI官方网站: 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…...

Crow:Middlewares 庖丁解牛6 middleware_call_helper
Crow:http请求到Rule绑定的handler_的调用链-CSDN博客 介绍了handler_的调用顺序,其中的一个调用过程是Connection::->handle void handle() {...ctx_ = detail::context<Middlewares...>();req_.middleware_context = static_cast<void*>(&ctx_);req_.m…...

MyBatis:Generator
MyBatis Generator附批量操作分页查询存储过程 Generator 介绍网址:Introduction to MyBatis Generator Generator ,一个用于 MyBatis 的代码生成工具,可以根据数据库表结构自动生成对应的实体类、DAO 接口和 SQL 映射文件,提高…...

rabbitmq的事务实现、消费者的事务实现
RabbitMQ提供了事务机制,可以确保消息在发送和确认过程中的一致性。使用事务机制可以将一系列的消息操作(发送、确认、回滚)作为一个原子操作,要么全部执行成功,要么全部回滚。 下面是使用RabbitMQ事务的一般步骤&…...

龙芯杯个人赛串口——做一个 UART串口——RS-232
文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码: 4.RS-232 receiver…...

验证码服务使用指南
验证码服务使用指南 1 部署验证码服务 1.1 基础环境 Java 1.8 Maven3.3.9 1.2 安装Redis 参考“Redis安装指南” 1.3 部署验证码服务 1.3.1 下载源码 使用git从远程下载验证码服务代码(开源)。 1.3.2 使用idea打开项目 使用idea打开上一步下载的sailing目录…...

js中Math.min(...arr)和Math.max(...arr)的注意点
当arr变量为空数组时,这两个函数和不传参数时的结果是一样的 Math.max() // -Infinity Math.max(...[]) // -InfinityMath.min() // Infinity Math.min(...[]) // Infinity...

【zookeeper特点和集群架构】
文章目录 1. Zookeeper介绍2、ZooKeeper数据结构3、Zookeeper集群架构 1. Zookeeper介绍 ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分 布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易…...

MySQL集群架构搭建以及多数据源管理实战
MySQL集群架构搭建以及多数据源管理实战 数据库的分库分表操作,是互联网大型应用所需要面对的最核心的问题。因为数据往往是一个应用最核心的价值所在。但是,在最开始的时候,需要强调下,在实际应用中,对于数据库&a…...

C# WPF上位机开发(从demo编写到项目开发)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 C# WPF编程,特别是控件部分,其实学起来特别快。只是后面多了多线程、锁、数据库、网络这部分稍微复杂一点,不过…...

微信小程序引入 vant组件(详细步骤)
vant官方地址 https://vant-contrib.gitee.io/vant-weapp/#/quickstart 步骤一、 通过 npm 安装 # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i vant-weapp -S --production步骤二 修改 app.js…...

Django之按钮(actions)
开篇就是道歉,哈哈哈哈,托更了好久好久,最近太忙了没啥时间更新,各位看官有催更的阔以给我私信哇,希望各位看官给个三连!!!😍😍😍😍 …...