Unity与C#学习记录 - 04

14 篇文章 0 订阅

01 Unity Static作用

Unity的Inspector面板有个Static,这个其实我很少关注过。

Unity默认的static是不勾选的,勾选后是有助于优化效率,使游戏更加流畅。勾选之后,如下:

这里也能看出来原因,勾选静态后,如Lightmap Static就能对场景光照贴图进行优化。统一还有Occluder Static处理遮挡剔除,Navigation Static导航网格优化等。

静态物体在脚本加载的时候开始渲染,不随着update每一帧进行跟新。所以如果这个对象是要移动的,就不能勾选static了,因为移动必然要重新绘制,所以通常是一直静止的物体才勾选static,这样就减少了drawcall了。

02 Unity光照及光照贴图

对于静态物体和光照,我们预先计算得到处理后的结果存储起来,这样游戏运行的时候就不用对其实时计算,这个过程就是烘培。烘培的结果就是一个light mapping贴图,这是针对静态物体的。这样做的目的就是减少计算量,因为如果直接计算那一幅图片恐怕要很长时间渲染。

看看模拟光照的几种方式,参考https://blog.csdn.net/until_/article/details/79397951

1)直接模拟光纤被光源发出到最终被物体完全吸收的正向过程就是GI(Global Illumination),也就是全局光照;

2)不直接模拟光线,而是反向搜集物体表面特定点的受光照强度来模拟现实照明效果,就是FG(Final Gathering),这个就翻译为最终聚集吧;

3)完全不考虑光线的行为,单纯基于“物体上与其他物体越接近的区域,受到反射光线的照明越弱”这一现象来模拟现实照明效果,就是AO(Ambient Occlusion),中文可以翻译为环境光遮蔽;

4)将场景光照结果完全烘焙到模型贴图上,从而假冒现实光照效果,这就是我们说的Lightmap光照贴图;

对于静态物体,大多用光照贴图来模拟间接光照,然后加上直接光源照明效果;对于运动物体,直接使用光源的动态照明效果,或者使用光照探针来模拟间接光的照明效果。由于GI和FG计算量都非常大,很难被用于游戏领域。因此游戏领域还是主要用光照贴图。

03 Unity Draw Call

这里简单学习下Unity Draw Call的概念,不过开始之前要提醒,Unity优化是有多个方面的,不能认为优化就是把Draw Call降低。参考这个博客学习:

https://www.cnblogs.com/zhenlong/p/4862869.html

draw call是指cpu调用底层图形程序(OpenGL等)在屏幕上绘制东西;

fragment也就是片段是指可能成为像素的东西,可能是指最终不一定被画出来,只是潜在像素,涉及到GPU;

batching批处理将多次draw call的操作合并,之后只需要调用一次底层图形程序接口即可。

draw call的优化是为了尽量解放CPU在调用图形接口上的开销,所以主要思路是每个物体尽量减少渲染次数,多个物体最好一起渲染。根据该思路可以选择几种方案:

使用draw call batching,运行时将物体合并;通过纹理打包成图集来减少材质的使用;尽量少使用反光和阴影等,因为那会使物体多次渲染。

对于draw call batching,批处理中两个物体的网络模型需要使用相同的材质,这样纹理相同,才能实现同时渲染。那么,为了将两个文理不通的材质合二为一,需要将纹理打包为图集,这样两个纹理合成一个纹理,我们就能只用一个材质来替代之前的两个材质了。

04 Mipmap与LOD

LOD是已经有所了解的,也就是Level of Detail。这个主要是针对模型的,每个模型设计不同的精细成都,三角面片和定点数量都不一样。这样三级LOD能够在镜头较近的时候用精细的模型,远处的用粗糙的模型,这样批处理个数会下降,可以降低Draw Call。

Mipmap没太接触,这个其实和LOD类似,不同的是LOD是对模型的,Mipmap是对纹理贴图的。说二者类似就是因为较近的贴图用精细的,远处的则用粗糙的贴图。使用Mipmap后,Unity会生成好几张不同质量的贴图,可以降低显存宽带占用,提升渲染性能,减少远处因为分辨率大的纹理因过分缩小而失真的程度。坏处是内存占用变大。

05 图集

前面也提到了图集对减少draw call的作用,这里顺便了解下其使用。创新图集很简单,选择一些图片,其类型是Sprite,作为图集Objects for Packing的对象。然后可以设置Max Texture Size如4096,设置compression等,最后可以预览。

代码上使用参考:

SpriteAtlas sa;
private Image image;

sa = Resources.Load<SpriteAtlas>("UI/LoadingNew");
image.sprite = sa.GetSprite("Comp 1_000" + currIndex.ToString("00"));

06 材质

材质接触过,而且还和shader搞在一起,不过还需要多了解学习一下。创建一个标准材质,如下:

第一个就是渲染模式,这里默认为Opaque,表明是不透明,适用于没有透明区域或者普通固态物体。如果选择渲染模式为Cutout,则创建的纹理要么100%透明,要么不可见,这对于创建带洞衣服等很有用。选择Transparent适合渲染真实的透明材质,如塑料或者玻璃。Fade模式则允许透明度数值彻底地使一个物体淡入淡出。

下面的参数,Albedo是反照率,该参数控制了表面的基本颜色。通常情况下为Albedo分配一个纹理贴图,Albedo纹理不应该包含光照,因为光照会基于物体被看到时的环境添加。这里Metallic表明是否是金属材质,Unity5中默认材质是PBS(Physically Based Shader),最明显特征就是用了Metallic。Normal Map是法线贴图,Height Map是高度图,一般与Terrain结合,高度范围0到1之间。法线贴图其实我也不了解,还是记录下。准确来说,法线贴图是凹凸贴图(Bump Mapping)的一种,其实际应用场景参考这个解释理解下:

https://www.cnblogs.com/wangchengfeng/p/3470310.html

在制作3D游戏时,常常遇到这样一个问题:一个平面,这个平面在现实中并不是一 个“平”面,例如砖墙的表面带有石质浮雕等等。这种情况下如果只是简单的做一个平面,则让人感觉严重失真;而如果用很密集的三角形去表示这类略有凹凸的表面,则性能上大大下降。研究人员发现,人眼对物体的凹凸感觉,很大程度上取决于表面的光照明暗变化,如果能通过一张贴图在一个平面上表现出由凹凸造成的明暗变化,则可以让人眼感觉这个平面是凹凸不平的(虽然这个平面还是平的),法线贴图正是为了这个目的而产生的。图片实例如下:

07 Unity 路径

Unity Editor中,一般会有这些目录:

Materials,Prefabs,Resources,Scripts,Scenes,Plugins,StreamingAssets及Editor等,可能还有Demos,Fonts,Legacy,Models,Shaders,Textures及Documentation等。

Editor和Resources目录不必紧跟Assets目录,这个我前面博客也记录过。这样项目中有多个Resources目录,所以注意避免名称重复。Resources目录是默认的资源路径,会直接打包到游戏包中。即使场景都没有用到该资源,放在该目录下的内容也都会被打包。Editor目录则是扩展编辑器的代码,编译时不会打包。

Plugins目录一般是放插件的,如一些DLL或者jar包等。和前面Editor类似,可以不紧跟Assets目录。

StreamingAssets目录和Resources一样,即使没用过的资源也会统统打包。只不过读取可能不太一样,目前我接触的一般用Resources加载。另外,Resources目录下的文件打包的时候会压缩和加密,但是StreamingAssets下的文件则直接打包。

比如输出Windows版本:

这里是Data目录,场景中有的Resources目录和StreamingAssets这里都有,Resources下的是加密的。Managed目录是存放各种dll文件的,包括自己的脚本的集合。Mono是运行时dll库,Plugins则是原Editor下的文件,不压缩不处理,仅仅选择对应平台的文件,如x86的,也就是一般比Editor下该目录的文件少一些。

Windows平台Unity Editor模式下,例如:

persistentDataPath = C:/Users/test/AppData/LocalLow/DefaultCompany/GenericTest

streamingAssetsPath = D:/workspace/unity/GenericTest/Assets/StreamingAssets

盘符都不一样,这个要注意。Windows平台编译发布后,例如:

persistentDataPath = C:/Users/dww/AppData/LocalLow/DefaultCompany/GenericTest

streamingAssetsPath = D:/workspace/unity/GenericTest/Output/Test_Data/StreamingAssets

基本一样,streamingAssetsPath就是因为发布后exe目录变化而和Editor目录下的输出略有变化。

注意开启Development Build和Scripts Debugging才能看到log(针对Windows下还有Use Player Log要勾选),然而我并没有看到日志啊,Data目录下并没有,实际上是因为我用了Unity 2017,该output_log.txt就在前面提到的Editor模式下persistentDataPath,也就是那个C盘的。

安卓下,我习惯用Application.persistentDataPath,路径值为:

/storage/emulated/0/Android/data/com.test.test/files

该路径下可读写,放一些配置文件可读写很方便。实际上安卓有个

/data/data/包名

这样的路径存放应用数据,所以前面storage/emulated/0/Android/data/com.test.test/files下面可能找不到多少Unity的东西。

08 Unity StreamingAssets目录打包安卓不能含有中文

如该标题所示,由于Windows平台习惯使用StreamingAssets,该路径下有一些中文音频文件,打包到安卓的时候报错无效的文件名。测试发现该路径下有中文的文件资源的时候,发布Windows平台可以成功,但是发布安卓apk包则报错。这里就不截图了,可以参考这个博客详细查看:

https://blog.csdn.net/qq_15267341/article/details/57080105

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值