每天一点UWA:第二十周

小结&新的开始

  • 从今年的7月29号发布第一周的笔记算起不知不觉已经二十周了,当时的想法也很简单就是下定决心读完当时算下来是168篇文章。5个月过去了,在写这篇的文章的时候基本上已经通读完了所有厚积薄发版块的关于unity的文章,真的感觉这是我这些年来做的最有毅力的一件事情。可以说在这二十周里面对于unity的理解尤其是图形学上学到了很多东西,而且也学会了很多优化的理论和别人实践的方法。
  • 理论已经学习完了,在后面的工作中就是一个实践的过程了。现在的项目会开始使用GOT工具进行优化的工作,真正的把优化这条路走下去。
  • 由于UWA出文章的速度不可能太快,而且自己的工作也很忙,所以每周的笔记可能会改成每月一篇了,继续加油。
  • 还有就是UWA都开始搞UE了,还有什么理由不开始学UE。

每天一点UWA:第十九周

AssetBundle

在移动平台上打AssetBundle时,为了控制包体大小,会开启PlayerSettings中的Optimize Mesh Data,对网格文件使用范围比较多的资源有较好的优化效果。 然而这带来了一个问题,就是在部分使用网格的特效中,美术会对模型上一些顶点做特殊处理,以达到一种网格遮罩的效果,而这个设置需要用到网格的顶点色。然而在开启Optimize Mesh Data这一选项后,打出来包中Mesh上的顶点色会丢失。 请问有什么比较好的解决方法,既能使用此方法优化网格,又能保留网格的顶点色效果?

  • 一般来说,开启“Optimize Mesh Data”选项,引擎会在发布时遍历所有的网格数据,去除其多余数据,从而降低其数据量大小。需要注意的是,这里的“多余”数据是指Mesh数据中包含了渲染时Shader中所不需要的数据,即如果Mesh数据中含有Position、UV、Normal、Color、Tangent等顶点数据,但其渲染所用的Shader中仅需要Position、UV和Normal,则Mesh数据中的Color和Tangent则为“多余”数据,引擎在发布游戏时,会将这些数据自动去除。
  • 开启这个选项是一把双刃剑。对于在Runtime情况下有更换Shader需求的Mesh,建议研发团队对其特别注意。如果Runtime时需要为某一个GameObject更换更为复杂、需要访问更多顶点属性的Shader,则建议先将这些Shader挂载在相应的Prefab上再进行发布,以免引擎去除Runtime时会使用到的网格数据。

每天一点UWA:第十八周

AssetBundle

最近的项目使用了AssetBundle的资源管理方案,对于Shader的部分全部放到了Always include里面(这里不仅是系统内置的Shader,还包括自定义的Shader),然后打Bundle资源的目录里是不包含任何Shader的。但是现在发现,Shader还是被作为依赖关系打进了最终的Bundle里,而且造成了冗余,问问大家有没有遇到这个情况呢?我的Unity版本是5.3.4f1。

  • 首先,只要资源在工程里并且需要用到它,就会被打包进AssetBundle。
  • 然后Always include里built-in Shader不会被打包进AssetBundle,这是一个特例。这个特例仅限于没有放到工程里的部分,有些项目会自己下载built-in Shader放到工程里,这样的Shader和自己写的没有区别,也会被打包。
  • 最后,你遇到的问题是正常现象,需要你们通过资源管理的策略避免掉。

每天一点UWA:第十七周

AssetBundle

当一个Texture被一个material和sprite都引用的时候,将三者分别打包,出现texture内存重复问题。

  • 原文较长,总结一下就是:如果一个贴图一方面被当成Sprite使用,另一方面被当成Texture使用(譬如RawImage或者Material),就会断开引用产生多份。目前解决办法是保证用Sprite的Prefab及Material打包在一个AssetBundle。
  • 这是一个重要的问题,而且这个问题也是看unity版本的。

每天一点UWA:第十六周

Texture

如何处理ETC压缩完图片质量模糊和ARGB32内存占用太大这种关系?

  • 使用ETC压缩的图片尽量减少过渡,这是美术制作时需要注意的,很多情况下并不需要明显的过渡,只是需要半透明而已;
  • 当然,有部分过渡色是必须的,这时候就要把相关小图整合到一张RGBA32的图片上;
  • 在资源管理上入手。一般情况下,我们是允许部分资源使用RGBA32,但是要注意,及时卸载掉不使用的资源,以保证内存峰值在可控范围内。
  • 果ETC压> 缩效果不好的,会使用RGBA32并降一个尺寸规格来压缩,这样虽然图片会模糊点,但是过渡还是平滑的。

ASTC格式并不是所有机型都支持,在Android端只有配有高端Mali芯片的机器才支持,对于不支持的,引擎会将其解压成RGBA32进行处理,所以图片中的内存值过大,很可能是项目在不支持ASTC格式的设备上所看到的结果。

每天一点UWA:卡通渲染笔记

描边的方法

基于视角的勾边

  • PS:这个是最简单的绘制边界的做法。计算方式就是dot(viewDir, normal)。根据 三角函数的定义值越小说明视角与模型某个点的表面法线的夹角越大,夹角为90°时说明这个triangle是视角看不到的,也就是边界了。

基于几何生成方法的描边

shell method
  • 首先在绘制结束正常的模型后,将需要描边的物体改用正面剔除再绘制一遍,在VS中将顶点沿着法线方向膨胀一定距离,然后在FS中将模型用纯色输出。

每天一点UWA:第十五周

AssetBundle

我们想请教一个Unity的普适性的资源管理问题。举个例子,我们现在的一个特效Prefab包含的贴图打成AssetBundle时没有单独拆分出来,就会存在一个问题,这个特效AssetBundle会存在重复加载的问题进而导致重复的特效贴图在内存中。(针对“重复加载”说明下:我们首先通过AssetBundle出来一个Object,这个Object会缓存一段时间,在这段缓存时间过后这个Object会被Destroy掉,而需要释放的特效是通过Instantiate这个Object出来的。当这个Object过了缓存时间被destroy掉后,下次需要释放相同的特效还是通过load同样的AssetBundle进行再实例化出来,这样内存中存在两份贴图了。)

  • 一般是团队中自行做一些资源的引用计数来进行管理。频繁调用UnloadUnusedAssets是不可取的(该函数的主要作用是查找并卸载不再使用的资源。游戏场景越复杂、资源越多,该函数的开销越大,一般在300~2000 ms范围内),但可以调用UnloadAsset来释放资源。
  • PS:典型的释放prefab后没有释放对于的资源。确实应该用UnloadAsset,或者一开始这个图片资源就应该做成单独的AssetBundle。

每天一点UWA:动画重定向笔记

基本原理

  • 动画重定向技术主要是针对骨骼动画的方案,由骨骼来描述动作信息,用蒙皮来表示模型网格与骨骼之间的关系,从而得到模型最终的样子。
    image

  • PS:这张图很形象

  • 动画就是每一帧为模型制作一个Pose(姿势),在每帧之间的姿势可以通过差值获得。

每天一点UWA:第十四周

AssetBundle

AssetBundle划分过细的问题,比如每个资源都是AssetBundle。

  • 加载IO次数过多,从而增大了硬件设备耗能和发热的压力;
  • Unity 5.3 ~ 5.5 版本中,Android平台上在不Unload的情况下,每个AssetBundle的加载,其每个文件的SerializedFile内存占用均为512KB(远高于其他平台),所以当内存中贮存了大量AssetBundle时,其SerializedFile的内存占用将会非常巨大。

每天一点UWA:第十三周

Gameplay

求教一个屏幕后处理的问题。我们期望角色不受屏幕后处理影响,所以目前采用双相机的方案,根据Layer划分,但是这种情况下角色的影子也就没有办法投影到地表上,请问这种需求有什么好的实现方式?

  • 可以尝试根据地表模型的局部细节来动态生成接受阴影的网格(比如Fast Shadow Receiver插件),这样既可以保证地表模型进行屏幕后处理操作,同时也可以生成相关角色的动态阴影。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×