unity两个项目合并 同名_从实际项目升级中关于 Unity SRP 的一些评测
Untiy 推出SRP 已经接近一年了,其中官方宣称 LWRP 在2018年年底时已经处于 production ready 既随时可以做产品了,于是改名为URP, 不过 HDRP 还需要2019.4 的到来才能到达完整版。 不过在我看来 URP 还不能说是 production ready 还处于玩具阶段。而且有时候觉得Unity官方对于技术路线偶尔会出现不明确,左右摇摆的情况。比如Unity 2018 新出的Camera.AddCommandBuffer 来做自定义渲染, 这在 Unity 2019 被废除了,取而代之使用 Render Feature /ScriptableRenderPass 来实现,不过这东西也处于实验阶段。
SRP不做任何修改是否可以直接提高项目性能,答案是可以直接减少CPU给GPU准备阶段的性能大约10%左右。无法直接提升GPU的渲染性能,对于不使用任何光照的项目且处于Opengl ES2.0 这类低端机,基本没有任何GPU性能提升。
以目前使用的SRP 有大量Bug 举两个例子
1. [In order to call GetTransformInfoExpectUpToDate, RendererUpdateManager.UpdateAll must be called first.] 莫名的内置渲染错误,无法自己修改。
官方Issue链接
https://issuetracker.unity3d.com/issues/errors-message-at-editor-play?_ga=2.202176470.695125147.1571176891-1511937231.1511185188
2. 使用渲染指令Blit 后,会导致RenderTarget 无法自动恢复原始RenderTarget,需要手动还原SetRenderTarget,这个在之前的CommandBuffer 里都不曾遇到
在项目中期切换到SRP可以直接优化的地方
1.相机Culling优化
https://connect.unity.com/p/unityzhi-zuo-ren-zhuan-chang-unity-aaayou-xi-shen-du-you-hua-zhu-ti-yan-jiang
根据官方优化参考,使用SRP后,可以控制相机 Culling(裁剪)行为,对于项目中有自己实现基于投影器Projector的阴影相机可以复用主相机的 Culling结果, 对于UI上模型RT相机可以不做任何Culling
2.相机 Stack 优化
SRP废弃了多个相机的实现,无法再使用多个相机 (比如我们项目1个GamePlay, 1个HUD, 1个UI相机的。使用官方SRP模板,UI相机背景色会盖住场景内容),原因为
如果只使用1个相机,渲染结果可以直接写入BackBuffer
如果有多个相机,由于第二个相机需要第一个相机结果填充画布后再渲染,因此至少需要一张RenderTexture的临时缓冲,且还需要针对不同的Viewport做裁剪等等,写入backBuffer的时机也会延迟
官方文档废弃Camera Stack原因
https://docs.google.com/document/d/1GDePoHGMngJ-S0Da0Fi0Ky8jPxYkQD5AkVFnoxlknUY/edit
3.UI OverDraw 优化
使用同一个相机绘制UI后,可以考虑给UI添加模板测试,将UI挡住场景的部分,场景可以不被绘制到。
4.UI 批次合并(Opengl 3.0+ Unity2019.2+ with SRP Batcher)
对于场景特效类,基本都无缘SRP batcher 他对Cbuffer的容量有限制
对于UI如果全局自定义Shader可以使用 SRP Batcher 不过目前还是实验阶段。
最后来说下 Camera.AddCommandBuffer 这个功能在 Unity 2019 替换为 ScriptableRenderPass 后如何实现一个XRay
使用 CommandBuffer时仅仅需要 camera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, m_XRayBuffer);
然后再XRayBuffer.drawRenderer(renderer, XrayMat)即可
在2019里 需要创建XrayRenderPassFeature 类来实现
public class XRayRenderPassFeature : ScriptableRendererFeature
ScriptableRendererFeature有2个接口要实现分为
Creata() 创建一个实现具体Xray Pass的接口
AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) 将创角的pass 添加进renderer 队列
在XRayRenderPassFeature 里实现一个 CustomRenderPass : ScriptableRenderPass 来编写具体Xray逻辑
Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) 准备阶段
Execute(ScriptableRenderContext context, ref RenderingData renderingData) 渲染阶段
FrameCleanup(CommandBuffer cmd) 清理阶段
基本实现都在Configure里
if (null != m_xrayMaterial)
{CommandBuffer xraycmd = CommandBufferPool.Get(m_profilerTag);xraycmd.DrawMesh(m_drawMesh, m_xrayTarget.transform.localToWorldMatrix, m_xrayMaterial);context.ExecuteCommandBuffer(xraycmd);CommandBufferPool.Release(xraycmd);
}
大致流程是,Renderer 会根据 pass 的 renderPassEvent 进行和内置其他pass 比如天空盒,点光,深度 等等其他pass 一起sort, 之后分别在渲染前,渲染,渲染后调用接口
以官方的SRP FPS Demo 基础来实现XRay
git: https://github.com/Unity-Technologies/UniversalRenderingExamples
1.在FpsSetup 预制体里添加刚刚创建的Feature
2.编写一个简单ZTest Greater的Shader 用来绘制被遮挡的部分
Shader "Unlit/XrayShader"
{SubShader{Tags { "RenderType"="Opaque" "LightMode"="LightweightForward" }LOD 100Pass{ZTest greateroffset -1,-1HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/core.hlsl"struct appdata{float4 vertex : POSITION;};struct v2f{float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);return o;}float4 frag (v2f i) : SV_Target{return float4(1,0,0,1);}ENDHLSL}}
}
3.在场景中放置一个示例Cube,取名为XRayTarget
最后运行游戏
最后 使用自定义 ScriptableRendererFeature 的话,还需要自己编写对应的Editor代码,比之前繁琐许多。
如果自己来编写SRP的话,RenderPassFeature 需要自己维护pass列表来实现, 也可以仅仅去实现自定义的ForwardRenderer,可以减少很多功能的重复造轮子。
unity两个项目合并 同名_从实际项目升级中关于 Unity SRP 的一些评测相关推荐
- unity两个项目合并 同名_表格合并,你还在复制粘贴?教你一键合并,超简单!...
当我们有多个表格的内容需要合并到一个表格中,很多人会采取复制粘贴的方式. 表格数量少时可能影响不大,数量多了,[表格合并]功能就会大显神威. 下面教大家如何快速完成多表格合并. 温馨提示:如果图片用手 ...
- 两个listmap合并去重_我是如何用单机实现亿级规模题库去重的?
题外话:欢迎将公众号设置为星标,技术文章第一时间看到.我们将一如既往精选技术好文,提供有价值的阅读.如有读者想要投稿,可以在公众号任意文章下留言,技术博主奖励丰厚. 作者:haolujun cnblo ...
- 两个listmap合并去重_单机亿级规模题库去重,如果是你会怎么做?
作者:haolujun原文:https://www.cnblogs.com/haolujun/p/8399275.html 背景 最近工作中遇到了一个问题:如何对大规模题库去重?公司经过多年的积累,有 ...
- 开源项目是什么_在开源项目之前要了解什么
开源项目是什么 贵公司将内部项目作为开源发布. 恭喜你! 您知道您的代码已经准备就绪,但是您准备好承担所有新职责吗? 项目作为开源发布后,您的公司不仅要对该项目负责,而且还要对将围绕该项目形成的社区负 ...
- 3项目估算表_浮动油封生产项目可行性研究报告
浮动油封生产项目可行性研究报告 项目名称:浮动油封生产项目 项目投资额:22000.00 万元 项目建设性质:新建项目 项目所属行业:制造业 - 通用设备制造业 - 通用零部件制造 - 其他通用零部件 ...
- 第一次做项目经理总结_干货:项目结束后,哪些经验教训要总结?
正所谓"前事不忘后事之师",经验教训总结是项目管理中最重要的环节之一,它不仅可以让项目经理得到更好的成长,更是为后来的新项目开展提供了借鉴参考资料. 成功的项目总结经验.失败的项目 ...
- 两封邮件合并转发_用Python发送自定义电子邮件
电子邮件仍然是生活中的一个事实.尽管存在各种缺陷,但它仍然是向大多数人发送信息的最佳方式,尤其是以允许消息排队等待收件人的自动化方式. 我的工作重点之一是Feddora社区行动和影响协调员给人们一个关 ...
- 两封邮件合并转发_卖家直呼!低价订单过多,listing合并竟被亚马逊封号!
更多文章,百度或 文末扫码入群,对接跨境资源 你的关注和转发,是我们坚持的动力 马逊平台,为了规范卖家运营,平台并不允许一个店铺多账号运营的情况.但近年来,不少卖家察觉亚马逊对多账号运营,似乎要求并 ...
- 两个列表合并去重_把两个pdf合并成一个如何解决?
PDF文件在我们日常工作中使用的越来越多了,所有不可避免的我们会遇到要将多个PDF文件合并成为一个文件的情况,那么如何将两个PDF文件进行合并呢?可能大家都想要了解一下! 对于PDF文件这个问题,这里 ...
最新文章
- 如何实现分享链接到微信朋友圈时显示自定义LOGO以及名称介绍
- 使用win32 API 下载文件
- boost::hana::detail::wrong用法的测试程序
- 关于fragment backstate的运用
- 测试基础【第二篇】软件测试模型
- 每个时代都有每个时代的风口
- win10 pin码如何设置
- Python虚拟机之if控制流(一)
- excel几个数相加等于某个数_『excel表如何从一列数据中筛选出合计等于某数的某些数?』...
- pm8060raid卡命令
- 安装Vista与XP双系统后如何做好备份
- BIOS设置中功能的翻译及介绍
- 资源管理器 右键 反应慢 现象解决方案
- 约瑟夫环问题:有n个人围成一圈,顺序编号。从第1个人开始报数(从1-3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?
- 【期望】几何分布的期望
- iOS开发 --- AlipaySDK接入(version:15.6.4 motify:2019.06.11)
- 小说作者推荐:休屠城合集
- 苹果开放降级通道_iOS 12.2的验证通道已关闭,两款机型可降级!
- 【JavaWeb学习】JavaScript(基础)
- 读IC封装基础与工程设计实例记录一