[引擎]之六:渲染原理和在Unity3D中的应用分析(花屏处理)

13 篇文章 0 订阅

在Unity3D的使用过程中,项目中有可能出现花屏现象。并且,有可能是偶现或者必现的,但这真的是个bug,可以被解决的。
参考 《3D游戏编程大师技巧》3.2.1帧缓存和视频系统和3.2.3缓存交换 ,先搞清楚原理,再对照出现的现象进行分析。

(1) 相机渲染原理

硬件中会分配一块区域,作为帧缓存,当然,如果是双缓冲的话,会分配两块。主缓冲区用于显示,副缓冲区可以进行离屏渲染。最终,副缓冲区中的内容会被复制到主缓冲区,显示出来。
另外一项功能是锁定内存。在访问这些内存和读写缓存时,需要先对内存进行锁定,读写完成之后,解除对内存的锁定。主缓存和副缓存只在锁定期间有用,并且,不能认为在下一次锁定时,缓存地址仍然是相同的。这是硬件的一种特征,它可能会移动帧缓存

缓存交换的过程为:

页面交换动画系统

清除缓存用于清屏。一般用黑色来清除。主缓存用来显示,所以,一般只清除副缓存;之后将新的要显示的东西写入副缓存,然后执行主副缓存的交换,最后显示在显示器上。

(2) Unity3D中的应用分析和花屏现象处理

在Unity3D中与上述直接相关的组件是Camera。
Camera组件中的设置,与上述的对应关系为:

(1) ClearFlags与颜色缓存和深度缓存的对应

在第一个步骤清除中,涉及到两项,一项是颜色缓存,另外一项是深度缓存。在**《3D游戏编程大师技巧》**中,默认都是直接清除了的。上文说过,清除颜色缓存就是给颜色缓存的赋一个值,一般用黑色。深度缓存是为了做像素的zTest。但是Unity3d中,Camer的ClearFlags是可以来选择是否清除颜色缓存,和是否清除深度缓存的。

ClearFlag颜色缓冲区深度缓冲区
SkyBox改变,设置为skyBox的颜色不改变
SolidColor改变,设置为BackGround颜色不改变
DepthOnly不改变改变,清空深度缓冲
Don’t Clear不改变不改变

如果项目中有多个相机,并且ClearFlags设置不当,会导致花屏。详情请看这里:Unity3d花屏处理

(2) Viewport Rect与渲染区域的对应

Viewport Rect的默认值为:
viewport rect
Unity文档里面说,取值范围是0-1。

X Y 相机渲染区域的起点

W H 为相机渲染输出到屏幕上的的百分比,取值范围是[0,1]。

在实际应用中,比如,不同分辨率的平面下(已经全面屏手机的适配),为了显示同样比例的画面,可以修改viewport Rect,只渲染手机屏幕的一部分。非渲染区域显示成黑边。
这种情况下,如果你只有一个相机,它只渲染输出了屏幕的一部分,所以,非渲染的那部分,由于硬件帧移动的特性,其他部分的值是随机的,有可能导致花屏,并且是一定区域(相机没有渲染的区域)的花屏。
这个时候简单粗暴的解决方法就是,添加一个depth最小、渲染全部区域的ClearFlag设置为SolidColor的相机。让这个相机每帧总是先将屏幕设置为solidColor。
####(3) 其他花屏情况
综上所述,出现了花屏的情况,从写入到帧缓冲的时候除了问题。可以对照第一节的内容,从原理入手进行分析。

之前也遇到过多线程渲染和开启Unity的某些渲染设置的时候遇到花屏的现象,可以对照原理分析一下。一般使用简单粗暴相机解决法就可以了(v)。

以上。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

延澈左

小小心意

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值