1)Unity Batches与glDrawElements的关系
2)渲染大面积草地时,如何降低消耗
3)HUD随着摄像机偏移
4)Unity中如何在竖屏模式的UI之上显示强制横屏的UI
5)iOS能耗问题
这是第222篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Rendering
Q:Unity里用FrameDebug显示DrawCall是422个,Batches是435个,在SnapDragonProfiler里抓取进去glDrawElements数目是1449个,怎么了解这种差别?
A1:可参考以下几点:
- 题主的数据有一点问题,DrawCall数目应该大于等于Batches。依据特定的规定,多个DrawCall能够视为一个Batch,一个Batch中蕴含多个DrawCall,节俭了一部分CPU提交数据的操作。
- 调用glDrawElements函数进行绘制就是DrawCall的一种模式。
感激Vest@UWA问答社区提供了答复
A2:这部分能够参考UWA Day 2020里张强老师的分享《Unity移动游戏我的项目优化案例剖析(上)》中的第二大节。
感激范君UWA问答社区提供了答复
Rendering
Q1:渲染大面积草地时,如何降低消耗?
A1:有以下几点:
- 应用DrawMeshInstance。
- 下面这个API是不会进行视距剔除,视锥体剔除和遮挡剔除的。
上面有两种计划:
a. 将草地按区域分组,用每组的中心点计算视距,根据间隔切换网格LOD或剔除。
还能用向量点乘简略剔除在相机前方的草地。(留神临界问题)
b. 借助CullingGroup。
CullingGroup.onStateChanged事件绑定,通过事件触发调整传入DrawMeshInstanced的Matrix程序和渲染数量。(比拟难的是,DrawMeshInstanced只能指定渲染前几个Matrix)通过cullingGroup.SetBoundingSpheres实现视锥体剔除和遮挡剔除;
通过cullingGroup.SetBoundingDistances实现视距剔除和LOD;
这个计划也最好进行区域分组,不然CullingGroup的事件监听占用会比拟高。中端机上4000个监听会占约2ms。当前如果有比照两种计划的性能,我再进行补充。
附:
CullingGroup API的应用阐明Unity 3D研究院之Lightmap反对GPU Instancing
如何高效应用GPU Instancing技术来进行草丛渲染
降级Unity 2018过程中,遇到的DrawMeshInstanced不失效的问题
感激题主李先生@UWA问答社区提供了答复
A2:能够应用Indirect模式的Instancing,配合ComputerShader实现视锥剔除和遮挡剔除。
感激邹春毅@UWA问答社区提供了答复
Q2:手机上能用吗?
A:举荐一个应用URP制作的草海成果,亲测可在Mobile端应用。
Unity URP Mobile Draw Mesh Instanced Indirect Example性能测试:
- can handle 10 million instances on Samsung Galaxy A70 (GPU = adreno612, not a strong GPU), 50~60fps, performance mainly affected by visible grass count on screen(draw distance = 125)
- can handle 10 million instances on Lenovo S5 (GPU = adreno506, a weak GPU), 30fps, performance mainly affected by visible grass count on screen(draw distance = 75)
感激Vest@UWA问答社区提供了答复
Rendering
Q:HUD为什么会随着摄像机偏移?
代码如下:
Vector3 midVe1 = obj.transform.position; Vector2 viewPose = worldCamera.WorldToViewportPoint(midVe1 + new Vector3(0, 2, 0)); viewPose.x *= Screen.width; viewPose.y *= Screen.height; hud.anchoredPosition = viewPose;
图片如下:
A:题主说的这个景象是正当的。
Vector2 viewPose = worldCamera.WorldToViewportPoint(midVe1);Vector2 viewPose = worldCamera.WorldToViewportPoint(midVe1 + new Vector3(0, 2, 0));
这两个算进去的viewPos.x是不一样的。所以能够改成先算x,再偏移y。大略是这样:
Vector3 midVe1 = obj.transform.position;Vector2 viewPose = worldCamera.WorldToViewportPoint(midVe1); viewPose.x *= Screen.width;viewPose.y *= Screen.height;viewPose.y += 130;hud.anchoredPosition = viewPose;
这外面y方向上的偏移值(130)就要本人调整了。
感激Xuan@UWA问答社区提供了答复
UGUI
Q1:针对Unity中如何在竖屏模式的UI之上显示强制横屏的UI,咱们当初有两种思路:
1. 改Screen.orientation之后再显示。
- 须要思考外层RectTransform是否曾经“实现”了转屏导致的变动,而后能力去适配内层。尚未找到牢靠的事件。
- 须要解决背景,半透明背景可能透出前面的UI排版凌乱。
2. 将新UI旋转依z轴转-90度显示。
- 对刘海屏的适配须要做相应的批改。
- 无奈转屏(因为还是竖屏,且不反对Upside Down)。然而这个应该能够克服。
请问,两者哪种更好呢?
A1:一个简略的形式:
Canvas的RenderMode改成World Space,管它摄像机怎么裁剪,UI画布也不会发生变化。如果自适应不了,在Canvas上依据你本人的需要做好自适应就好。
感激郑骁@UWA问答社区提供了答复
A2:咱们之前我的项目里刚好有个相似的需要,在横屏游戏中,个别玩法切换到竖屏。过后采纳的解决方案是批改Screen.orientation,同时批改UI全局根节点上的CanvasScaler的referenceResolution(竖屏时设置为1080,1920,横屏设置为1920,1080),matchWidthOrHeight(和我的项目的适配策略相干,竖屏时设置为0,横屏时为1),切换时会有一个全屏遮罩的fade成果,来防止切换时显示谬误。
感激范君@UWA问答社区提供了答复
Q2:请问为什么不思考转90度的做法?
A:咱们过后没有测过旋转的计划。当初大略想想有两个问题,不晓得想的对不对。
- 单纯旋转角度应该只能在横屏的两头局部显示一个竖屏界面吧?感觉还须要其余解决。
- 对工作流是否有影响,如果要一个竖屏界面是否是要在制作时先做成一个横屏界面?外部控件是否要解决?例如最终呈现出竖屏成果的剧情文字从左到右呈现,旋转之前应该是横屏的从下到上呈现,同时每个繁多文字也是旋转的。
感激范君@UWA问答社区提供了答复
Q3:RectTransform的尺寸会被提早批改这件事, 没有造成什么问题么?
A:记不太清了,印象中没有遇到什么大问题。不过咱们过后这类需要切换时都是全屏UI,加了遮罩Fade后没有什么显著的穿帮。
感激范君@UWA问答社区提供了答复
iOS
Q:我在Xcode真机调试中发现能耗始终处于Very High,而我我的项目的根本状况是(每帧GPU渲染3.5ms,每秒60帧,渲染分辨率为750*1624,设施iPhone XS,场景中只有UGUI没有其它3D或2D物体),麻烦大家帮忙看看这个电量耗费属于失常吗?还有没有优化的空间(帧数和分辨率预计是没有方法降落了,会影响我的项目成果),谢谢。
A1:测试过空场景Average Energy Impact也会显示Very Hight(如下图),题主的GPU能耗占比拟大阐明CPU相对而言还是压力比拟小的:这个帖子也是相似的问题,看上去是因为Unity引擎自身绝对于一般APP体量较大,所以能耗体现较高,升高指标帧率会有所改善。
Energy Impact表征的是全局(非单个APP)的能耗,而且测试的时候USB连贯充电是如何在统计中防止的不太分明机制,倡议应用Xcode Instruments工具的Energy Log模版测一下单个APP的能耗状况。
Energy Log文档对于能耗的优化先关注整体的是GPU还是CPU(或其余方面),GPU的用FrameCapture定位一些比拟高耗时的Shader进行优化,CPU联合Time Profiler模版定位一些高能耗的CPU Bound。
感激羽飞@UWA问答社区提供了答复
A2:GPU的用FrameCapture定位一些比拟高耗时的Shader进行优化。
要害是Capture哪一帧,这个会很自觉。
感激山中千年@UWA问答社区提供了答复
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)