游戏里的万人同屏是怎样优化?

程序员 2024-9-23 23:01:17 30 0 来自 中国
Unity性能优化是面试的时候经常被问道的一些内容,本日给各人分享一些常用的Unity的优化技巧和思绪,方便各人遇到题目时候参考与学习。
这里有个游戏开发交换小组 各人可以一起来学习交换哦
包体大小优化
游戏的安装包体大小对于游戏开发而言非常告急,由于发布后这些包都会上传到渠道或市肆让用户下载,包体越小用户下载的时间就越少,如果一个包体过大,大概导致好不容易推广的app,由于下载很久而直接被用户取消。包体大小优化技巧这里总结一下:
图片能用jpg的只管利用jpg, 用压缩率更大的算法。
Jpg, png图片在满足游戏清楚度精度的情况下可以通过调治参数,压缩文件体积。
声音文件可以通过低落码率,采样率,多声道变单声道等方式低落体积大小。改变声音压缩算法,如.wav酿成ogg来镌汰声音文件体积。
字体文件,可以通已往掉不消的字模来镌汰字库的体积。
3D模型文件体积, 可以通过镌汰模型的面数等来举行优化,通过细节加强技能镌汰模型面数到达同样的效果。
没有效的资源不要打包到包体内里,利用Resources, StreammingAssets时这些资源无论怎样都会被打包进去,以是在这些文件夹中一些没有效的资源要移除或删除。
镌汰代码的体积,把不消的一些代码不编译打包进去。
可以把包体的全部或部门资源摆设到服务器上,这样可以镌汰包体的体积大小。
内存大小/内存性能优化
游戏开发中运行的内存过大,是经常我们遇到的题目,内存包罗了运行时候的内存以及资源所占的显存。怎样优化内存所占的大小,我们也可以从几个方面去考虑。
内存大小与数据量是成直接关系的,平常写代码的时候,只管的要用好内存,少用内存。
游戏开发中资源地点的内存占比是比力大的,资源地点的内存包罗了模型顶点数据,模型纹理数据,UI纹理数据,声音数据,预制体数据,ab包数据等。这些和上面的文件体积差异,比如 1920x1080的jpg与png, 岂论是哪个文件加载到显存的大小都为 1920x1080 * 每个像素的字节数(4字节)。以是我们要减低运行时的内存就是要纵然的将不消的资源从内存中开释掉。有些资源的内存格式显卡时支持要锁的,比如Android支持ETC, IOS支持纹理压缩格式PVRTC。
写代码的时候只管少产生垃圾对象,克制性能题目与内存碎片。比如字符串拼接,只管用字符串的格式化来替换字符串加法。由于你很难说清楚
string a = “hello” + b + “hello” + 4;
这个过程中到底又多少个string对象产生出来。在update内里只管不要写那些每帧都会去new 的代码,克制产生内存碎片。同时我们为了性能,把同时大量重复利用的对象做成对象节点池缓存起来,杜绝反复创建克制内存碎片。
以是写代码的时候要考虑到这些因素,写出内存占用低性能比力好的代码。
写代码影响帧率的一些不良风俗
接下来我们来罗列一些写代码会影响帧率的不良风俗,渴望能资助各人克制掉一些帧率上不去的坑。
不要在update内里每帧的时候去调用查找组件这些函数,最幸亏初始化的时候先查好保存起来。
不要在游戏运行中同步的去加载一个资源,导致代码卡在了在原加载的函数上,比如加载一个资源要0.5s, 如果运行时同步去加载资源就会卡0.5秒,那么在0.5秒内游戏就卡住了,帧率就降到为1~2。
不要在游戏运行中做IO利用,比如游戏运行中同步的读写文件,这样就会导致main thread 去等IOS,导致帧率降落。
不要把耗时的纯算法的利用放main thread中,比如要盘算某个NPC的一个效果,这个盘算大概须要花1秒钟,但是1秒内别的的NPC或脚色都可以正常的处理,我们不要在主线程上来盘算这个算法,而是通过线程的方式,在别的线程盘算不卡主线程影响别的的逻辑。等别的线程盘算好后关照主线程。这样游戏帧率不会降落,同时又不会影响游戏,比如寻路算法等都可以用这种方式来做。
误以为协程不会帧率,很多开发者在写代码的时候把一些利用放协程,以为不会低落帧率,实在协程也在主线程实行,会影响帧率。
渲染相干的优化技巧
怎样提升游戏物体的渲染性能也是很多开发者摸不清楚的,在这里给各人总结一下常用的思绪和技巧,给各人在做渲染优化的时候做一个参考指南。
通过3D细节加强的技能(法线贴图,高度贴图等),来低落模型精度,让低模+细节加强来实现高模的效果。
只管让美术以少的模型面数来制作效果好的模型。
做好场景的物体管理(四叉树场景管理),把那些不消绘制的物体隐蔽起来,节流绘制的本钱。
基于反画家算法从后向前渲染,只管镌汰透明物体,只管把配景的大物体分成多个小物体,做遮挡剔除的时候会更好。
可以考虑利用静态光照来做场景烘培, 代替实韶光照。
可以考虑利用贴图来做物体的阴影,代替及时阴影。
如果要用实韶光照,尽大概的用一种光源。
如果要用实韶光照,又不会只有一种光源,尽大概的利用延时渲染或别的自界说的渲染管线(轻量级渲染)来代替向前渲染。由于向前渲染每个光源都要绘制一次,性能影响很大。
场景多光源的情况下,根据场风景体的位置,管理好有效光源,无效光源不参加物体盘算,这里的计谋可以通过定制渲染管线。
Shader 相干的优化,空间换时间, 多光源光照盘算优化与阴影盘算优化等。
绘制同一批物体的时候,只管用同一个shader, 镌汰Shader的切换, Shader切换又叫SetPassCall, SetPassCall非常斲丧性能,同时把常用的Shader加载到内存常驻。
克制Shader不停重复交织切换。
只管把一些物体归并到一个材质内里,比如玩家手里的枪,大概有很多支,但是我们把全部枪的纹理归并到一个纹理内里,就可以利用一个材质来渲染恣意枪的范例,这样可以归并一些枪的drawcall。比如可以把舆图内里的物体贴图归并到一个忒图内里用一个材质。
可以考虑利用 静态合批,动态合批,GPU Instancing合批来节流DrawCall。UGUI可以通过做图集来节流DrawCall。
通过预先采样将顶点保存起来优化动画播放组件。
物理引擎相干优化技巧
物理引擎也是性能开销很大的一个点,很多物理刚体比力多的游戏帧率降落的比力锋利,怎样优化物理引擎可以从一下方面来考虑:
尽大概的镌汰的刚体数目,刚体的数目决定了物理引擎的盘算本钱。
尽大概的利用性能高的物理外形捧起,克制复杂的物理外形碰撞器。球型碰撞器的性能就要大于刚体碰撞器。
调解一些物理参数,镌汰物体的迭代次数来提升物理引擎的性能。
更换性能更好的物理引擎,大概更换某个方面更好的物理引擎。
自己根据游戏的需求自己实现一个性能高的阉割版“物理引擎”。
本日的性能优化技巧总结与分享就到这里,渴望各人在工作中 对Unity性能优化提供一些资助。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 20:21, Processed in 0.142077 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表