内容简介:这是第160篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员)
这是第160篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
本期目录:
- UI抗锯齿不生效原因
- 自定义uv4数据信息
- Profile下Assets>Shader占用内存过大
- StaticBatchingUtility
- 大量使用委托的+=和-=导致产生内存碎片
UI
Q:不管是UGUI还是NGUI,只要控制的UI设置了旋转,边缘就有明显的锯齿。设置里打开8倍抗锯齿也没效果。看了网易的《非人学园》里面的界面,很多应该也是旋转的,并没有锯齿。
A:题主可以看下这个帖子:
https://gamedev.stackexchange.com/questions/139626/is-ui-anti-aliasing-broken-in-unity-5-6“Thanks for raising this issue. In unity 5.6 we made a change to how the backbuffer / msaa / hdr works. A side effect of this is that the backbuffer is never created with MSAA enabled, we go via an intermediate render texture. In the example you have sent the canvas is set to ‘screen space overlay’. This means that is renders directly into the ‘final’ buffer (in this case the frame buffer).
The normal scene camera is set to have MSAA enabled, if you change the camera mode to Screen Space - Camera and render them into the camera (last step via sorting layers), then MSAA will work as they will not be rendered direct into the backbuffer but into the intermediate render texture.”
意思是,如果你的Canvas选择的是默认的ScreenSpace-Overlay,那么就不会走MSAA的那个buffer,而是直接写入到“final” buffer中。
所以解决办法就是使用Screen Space-Camera的方式。
除了开抗锯齿之外,如果图片是静态的,就是不会旋转的。只是这个角度,不想开MASS可以考虑让UI直接出图成斜的,OverDraw高一些,不过不用抗锯齿了。
另外建议题主关注下开了抗锯齿之后的字体效果,有可能没有那么“锐利”了。
Model
Q:目的:想将自定义的模型法线信息存储到uv4中。
想法:在资源后处理脚本OnPostprocessModel(GameObject)方法中将法线信息压缩到0~1中存储到uv4里面,然后Shader中将uv4存储的法线信息解压回-1~1区间里。
测试方法:压缩之后的信息在Shader中是错误,只会发生在SkinnedMeshRenderer 中,MeshRenderer一切正常,怀疑SkinnedMeshRenderer设置uv4信息的时候底层做了处理。
测试结果:法线信息不压缩直接存储到uv4中,不同FBX模型压缩算法不同,目前检测出两套压缩算法,但是根据什么实用不同的压缩算法是未知的。
模型法线:
使用解压算法1的效果,下图1为不同模型使用解压算法1的效果,但是使用解压算法2显示正常。
图1 不同模型使用解压算法1的效果
图2 使用解压算法2的效果
另外的模型使用解压算法2的效果:
使用正常的解压算法的效果 (-1,1) 压缩至0~1再解压回来的效果:
总结:因为我们的模型使用了tangent来做法线贴图的处理,normal和tangent都被占用了,想在uv4上存储自定义的信息发现SkinnedMeshRenderer上的Mesh无法正确设置color、uv4的信息。
请问大家有办法在uv4上存储正确的信息吗?为什么存储的信息会有多种的解压方式?压缩uv4数据的原理和依据是什么?
A:是因为SkinnedMeshRenderer会对normal和tangent进行蒙皮处理,而color和uv4不会。你可以参考法线贴图的原理,在color通道存切线空间的法线,然后在Shader里面转换一下就好了。
Editor
Q:在Profile下看到Assets>Shader内存占用很大,并且有很多是项目中没有使用的,但是有引用的数量,详情是Shader asset has been edited and not yet saved to disk。请问这种情况是因为在编辑器下,还是确实有问题?
A:首先要确定来源,来源无非两种,Editor下和RunTime下。
如何排除Editor?
1、最有效的方式是打包AssetBundle,进行真机测试。你看到的资源都是RunTime产生的。
2、如果暂时无法进行真机测试,可以根据右侧的Referenced By来查看依赖关系,只有被依赖的资源才会使用到,Shader大部分依赖于material。
3、减少Editor资源干扰,有效的两种方式:
- 重启Unity,保持Editor环境干净,减少由于操作产生的资源残留。
- 不要在Editor下选中某一特定资源,以免出现Asset冗余的表现。
DrawCall
Q:StaticBatchingUtility的官方文档有这么一句话:
IMPORTANT: only objects with the same material can be batched, thus it is useful to share as many textures/material as you can.**
相同的材质才能batched,但是事实上我看见Profiler里是把多个不同材质的小Mesh 合成了有一个Combine Mesh Unity的合并规则是什么 ?这样有什么问题吗?只是生成了一个Mesh但是batched还会有多个?对性能有什么影响吗?
A:题主可以观察一下那个Combined Mesh,里面包含了很多SubMesh,然后对应的其实就是原始的那些小Mesh。
Static batching在不同的版本有两种DrawCall合并机制:
1、运行时合并,可见的、相同材质的那些SubMesh的index buffer,作为一次DrawCall提交;
2、运行时排序,把可见的、相同材质的那些SubMesh连续进行DrawCall提交。
前一种直接减少了DrawCall数,后一种只是减少了Render State的切换,但省下了index buffer的合并开销。
总之对性能基本上是显著提升,但前提就是那句话:
IMPORTANT: only objects with the same material can be batched, thus it is useful to share as many textures/material as you can.**
Script
Q:经过测试每次委托的Delegate.Combine和Delegate.Remove都会产生内存碎片,这种委托的使用有什么更好的方式吗?
A1:每次都会分配52B左右的堆内存(该值与OS相关),所以建议控制其调用次数即可,量不大没啥关系。
该回答由UWA提供
A2:可以使用链表保存委托,把对委托的+=和-=转换为对委托链表的Add和Remove。
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(原群已满员)
封面图来源: UnrealEngine--PrototypeMenuSystem
使用虚幻引擎中的蓝图创建的主菜单系统(v4.20)。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 聊一聊 ThreeJS 反锯齿
- 一种 16 倍抗锯齿字体渲染的方法
- 【Leetcode】103. 二叉树的锯齿形层次遍历
- 抗锯齿技术的新节点:深度学习超级采样(DLSS)到底是什么
- c# – Windows窗体应用中的非抗锯齿手形光标!
- @Transactional事务生效问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。