原标题:Epic Games工程师分享:如何在移动平台上做UE4的UI优化?

随着技术的不断升级,高性能的引擎逐渐受到越来越多研发商的青睐,UE4就是其中之一。在上周Unreal Open Day 2017活动会上,大宇就宣布旗下经典IP《仙剑奇侠传》、《轩辕剑》的续作,即《仙剑奇侠传7》和《轩辕剑7》将采用虚幻4引擎开发的消息。

而从另一方面,用虚幻4引擎制作游戏也需要注意一些问题。此前,葡萄君曾在《》一文中有所提及,近日,同样在Unreal Open Day 2017活动上,Epic Games的开发者支持工程师郭春飚以“如何在移动平台上做UE4的UI优化?”为主题,从四个方面对整个优化过程进行了描述。

以下为演讲实录:

大家好,我是Epic Games的开发者支持工程师郭春飚,今天给大家介绍的是在移动平台上面做UE4的UI优化,因为我们之前一直接到国内开发者的一些抱怨,他们觉得UI在手机上面开了以后性能下降的很快,今天就专门给大家介绍一下怎么用UE4在UI上面做优化,这是今天要讲的内容,首先会演示一个案例,接下来介绍怎么做优化,一块是游戏线程优化,一个是渲染线程优化,最后是编程技巧,先做案例介绍。

案例介绍

这是我们的一个演示工程,这个工程大概是我们做的测试工程,是在手机上面演示的,我们测试的机器是小米4C,同时开启了Mobile HDR。

谈性能之前先看一下性能指标,不要使用Stat.Slate会影响开发者做性能分析,可以使用stat dumpave num查看LOG,性能指标可以做Slate Tick - STAT_SlateTickTime游戏线程:Vertex Buffer;Slate Render - STAT_SlateRenderingRTTime渲染线程:UI渲染到Back Buffer;Widget Render - FWidgetRenderer_DrawWindow渲染线程:UI RTT / Retainer Box。

这是小米4C的性能数据,一开始是FPS是36,右边的列表是我们的优化开关,大家看到这个优化效果,一开始游戏线程11毫秒,渲染线程是8毫秒,用了Invalidation Box以后,游戏线程就减少到了1毫秒,这时候FPS提升不大,因为在手机上面UI的瓶颈更多是GDO,然后如果打开了Retainer Box以后,我们的渲染线程大概能减低3毫秒,这个时候FPS提高将近10每帧。

游戏线程优化

接下来就开始介绍具体的优化方案,第一步是游戏线程优化,这是一个小的事例,这个UI上面有两个贴图和一个文本框,Invalidation Box,每帧操作Grid Panel遍历所有的Child Widgets,Image1, Text1, Image2分别计算Draw Elements,Grid Panel将Image1和Image2的Draw Elements合并,最后Grid Panel返回2个Draw Elements进行渲染,如果是像这样一个复杂的控键数,这个开销也是比较大的。

我们Invalidation Box缓存Draw Elements (Vertex Buffer),用Invalidation Box封装Grid Panel。

这个有一点需要注意的是一个Volatile的概念,如果标志成Volatile的Widget每帧都会重新计算,一些属性的Widget Binding会使得Widget变成Volatile,Check Box放在Invalidation Box下会不起作用,需要设置成Volatile,建议自定义User Widget,用Button实现对应功能。

这就是引擎提供这样一个工具,叫InvalidationDebugging,开发者可以使用Slate.InvalidationDebugging找出Volatile,另外可以使用Slate.AlwaysInvalidate测试是否会突然卡顿。

有一个注意的是Invalidation Box自身会被标志成Volatile,一些重复使用的子控件建议不要Invalidation Box, 会有额外计算,Invalidation Box放在Retainer Box的下层。

接下来要讲一下可见性,除了可否可见以外还有是否可以接收点击测试,HitTestInvisible 可见、当前控件不可点击、所有子控件不可点击,SelfHitTestInvisible 可见、当前控件不可点击、不影响子控件,Hidden 不可见、占用布局空间,Collapsed 不可见、不占用布局空间。

如果大量的Visible会导致点击响应太慢,这个也会消耗很大的性能,Button设置成Visible,其它Widgets可以设置成Self Hit Test Invisible或Hit Test Invisible,Collapsed不占用布局空间, 略优于Hidden,Show/Collapse要优于AddToViewport/RemoveFromViewport。

这里还要讲一个是Widget Binding,某些属性上Widget Binding会导致对应Widget被放入Volatile List,这些属性发生变化,表示对应的控件需要重新计算Vertex Buffer,所以我们尽量避免这个Widget Binding。另外还有一点是Widget Binding会每帧Tick执行,这一点也会带来比较大的性能开销,所以手机上面建议使用C++ Event设置Widget属性。

目前UE4的UI开发对于C++是很好的,右边的编辑器里面进行了UI界面,不建议把复杂的逻辑放在蓝图Tick中执行,在C++中声明变量, 引擎会自动绑定编辑器中的Widget。

渲染线程优化

接下来介绍一下渲染线程优化,渲染线程首先介绍一个合并批次,我们在左图看到的是UI的有些可以合并批次,有些不可以合并批次,像不合并批次Canvas Panel、合并批次Grid Panel、Uniform Grid Panel、Vertical Box、Horizontal Box。

另外对于UI方面,我们可以使用Stat Slate查看批次,Num Batches,尽量使用可以批次的UI容器,但不用刻意追求合并批次。通过Sprite实现合并贴图功能。

接下来介绍一下UE4怎么合并贴图,这是我们合并贴图和贴完以后的情况,这是像素填充率,这里是背包界面的前5个Draw Call,后4个Draw Call的渲染面积很大,已经接近第一个背景图,可以看到UI的像素填充率非常高,这个时候我有接近5倍的面积,这个时候也有将近约5倍的Pixel Shader的执行次数,所以我们要提高像素填充率。

Retainer Box,将UI渲染到Render Target,再将Render Target 渲染到屏幕,另外引擎处理了点击响应区域的映射,鼠标点击区域引擎已经自动在屏幕上面映射了相应的测试。

Widget Render:将UI渲染到Render Target,Slate Render: 使用缓存的Render Target渲染Back Buffer,每隔3帧一个循环进行Retainer Box的更新,将1帧的UI渲染工作量分配到3帧去处理。

性能对比方面,关闭Retainer Box 7.7ms+0ms,开启Retainer Box是1.5ms+3.2ms,FPS提升由38到48。

Retainer Box 会占用额外的显存,因此建议仅在主界面上使用;Retainer Box区域尽量小,提高渲染效率、降低显存使用;Retainer Box会为每个User Widget实例创建一个Render Target, 因此重复使用的User Widget不要使用Retainer Box;游戏线程的Tick也会相应的隔几帧执行一次;持续表示的效果可以从Retainer Box中分离出来,但需要注意像素填充率;也可以从特效设计的方面解决;Invalidation Box放置在Retainer Box上方没有意义;推荐一个Retainer Box下跟一个Invalidation Box的方式;Retainer Box可以上材质效果。

另外需要注意的是,每隔3帧更新一次Retainer Box A,在第0帧更新;每隔5帧更新一次Retainer Box B,在第2帧更新;每隔15帧这两个Retainer Box就会同时更新,这样帧数变得不太稳定,导致帧数下降比较多,Phase Count的设置要全局考虑,避免重叠而导致帧数不稳定,所以必须做很好的控制。

Invalidation Box我们是每帧更新一次,但是我们很多时候可以做到根据事件触发,比如说背包穿戴了一个装备、卸下一个装备,按钮发生变化等等,这个时候可以根据事件更新,甚至不用每几帧更新一次,这样的话可能我们的UI交互不是很频繁,它的提升可能还是比较大的。

这就是我们的一个演示,如果打开了事件驱动的Retainer Box时,可以看到RTT的时间从3毫秒降低到0,最后可以看到我们这样一个复杂的界面,我们的游戏线程只花了1毫秒,渲染线程也花了1点多毫秒在小米4C上,而UE4是一个多线程渲染的,所以可能时间大概有11毫秒左右,当然事件驱动的Retainer Box刚才也说过了,对于频繁使用的UI不建议使用,所以可能最后需要看的是我们有多少频繁交互的事件,当然对于低端机的话带来很大的性能提升,如果我们有UI特效,可能在这个上面这种事件驱动没有办法更新,所以我们比较适合推荐这种方式在低端手机开启,首先关闭了UI特效。

这也是开发者比较关心的功能,左图有简单的材质,右图可以自动关闭材质和切换到低材质,这样可以兼顾高端机的效果和低端机的性能,DYNAMIC_MULTICAST的框架,这样程序可以变得更容易维护,开发也比较简单。

编程技巧

最后介绍UI方面的编程技巧,当然蓝图的话其实在大多数情况下性能都是没有问题的,但是如果我们要在低端机上面需要追求很好性能的话,其中有计算量比较大的逻辑,我们是不建议放在蓝图里面做,因为毕竟中间有很多的分装,建议可以把一些计算量比较复杂的逻辑下放在C++里面做,运行效率比蓝图高,更灵活,很多C++接口并未开放成蓝图接口,除了UI动画,其它代码都能用C++实现。

对于UI开发,我们建议开发者有Widget Manager,可以在蓝图中,也可以在C++中,就是管理所有User Widget,Brush、Font等资源也可以在Widget Manager中统一管理,这样的项目比较好管理,特别是UI比较多的时候。

接下来介绍一个怎么在UE4当中释放贴图内存,某些UI的贴图较大,这个时候应用程序希望可以在关闭UI后,释放对应贴图,这个时候要做一些简单的扩展,将UI贴图控件自定义成弱引用,管本这个UI空间以后这个内存就会释放掉。

UE4因为用GC回收内存,开发者并不是马上知道哪一块内存马上释放了,这个时候可以看到贴图还有哪些地方在引用,保证引用技术都是零,这个时候后面的GC可以释放它,可能一些图片被不知名的地方还在引用着。

这里还有一个小技巧3DRTT,这个小技巧并不需要每帧Tick,只要和动画频率大致同步就可以,所以我们要把每帧去渲染的两个选项关闭,同时这个蓝图我们设置成0.03秒Tick一次,产生在蓝图当中Tick这样的RTT,另外还有一个小细节就是Render Target的尺寸不要太大,会影响显存和渲染效率。

最后总结一下今天的技术点还有优先级,因为有些项目已经在开发中或者已经在后期,这个时候遇到UI导致的性能问题可以根据这个优先级做测试,前面讲到这些比较重要,包括下面合并批次容器,只要把这些设计好,我们移动项目的UI基本上不会有什么瓶颈了。

关注微信公众号“游戏葡萄”,每天获取最前瞻的游戏资讯返回搜狐,查看更多

责任编辑:

ue4手机ui_Epic Games工程师分享:如何在移动平台上做UE4的UI优化?相关推荐

  1. 【转载】UE4 Epic Games工程师分享:如何在移动平台上做UE4的UI优化?

    Epic Games工程师分享:如何在移动平台上做UE4的UI优化? 随着技术的不断升级,高性能的引擎逐渐受到越来越多研发商的青睐,UE4就是其中之一.在上周Unreal Open Day 2017活 ...

  2. 【华为云技术分享】如何将90%的代码自动迁移到鲲鹏平台上

    主讲人:华为云云享专家  张老师 大家好,今天要讲的主题是关于软件迁移,这是一个久远的话题,因为但凡牵扯到切换平台.CPU架构的变化,甚至一些语言版本的升级,都可能会面临到软件迁移的问题.今天我们就探 ...

  3. 转型经验分享|作为传统汽车工程师,我如何转型去阿里做无人驾驶?

    编者按: 以下这篇文章,其实是笔者2018年初发表在<业界良新>上的三篇转型文章的合集.这次重新汇总呈现给大家,一方面是给传统汽车产业需要转型的朋友做个转型参考,另一方面,也是给接下来的两 ...

  4. 华为、中兴、阿里...硬件工程师分享24家公司的面试经历

    硬件工程师分享24家公司的面试经历 一.百度 "硬件与系统开发"岗位.总共有5道大题: 1.1)CMOS反向器及其说明:2)典型的计算机结构:3)VLIW和SIMD的区别与定义: ...

  5. android分享助手下载地址,语音导出分享助手手机版|语音导出分享助手安卓版下载 v2.1 - 跑跑车安卓网...

    语音导出分享助手是一款语音导出类的软件,这款软件可为需要的用户提供优质的语音服务,满足你的日常需求,快来下载吧! 软件介绍 还在为手机中语音不能分享而烦恼?还在为昔日误删好友而后悔获取不到两人往日的语 ...

  6. 手机兼职赚钱,分享2个手机可操作的项目给你!

    先说一个某论坛的帖子,一个网友分享自己月入2万的经历,被另一个网友吐槽.这个吐槽的网友说,我们当地的很多人,每月工资也就是4000多吧,你每个月也没有上班,在家拿你的手机和电脑,一个月赚2万?你当我们 ...

  7. android 分享给好友,手机将安卓软件分享给好友的方法

    安卓手机里的软件怎么分享给好友?一般情况下我们手机上的软件都是手机自带或者拿到手机以后再到商城里面去下载安装,如果手机上原来没有我们想要的软件,但又不想去手动下载,这个时候要怎么才能得到我们想要的软件 ...

  8. 求职 个人简历 手机软件开发工程师

    个人信息 姓名:  王成           性别: 男                    出生日期:  1985.10 学历:  大专           专业:  计算机网络技术   工作年限 ...

  9. 移动网络为什么“慢”? 腾讯工程师分享弱联网优化之道

    一.移动网络的特点 我们看到移动网络和移动互联网时代用户的行为有如下三个典型特点: 1)移动状态网络信号不稳定,高时延.易抖动丢包.通道狭窄: 2)移动状态网络接入类型和接入点变化频繁: 3)移动状态 ...

  10. 华为软件测试工程师分享的自动化测试经验,纯干货!

    今天给大家分享一个华为的软件测试工程师分享的关于自动化测试的经验及干货.真的后悔太晚找他要了, 纯干货.一定要看完! 1.什么是自动化测试? 用程序测试程序,用代码取代思考,用脚本运行取代手工测试.自 ...

最新文章

  1. 《防患未然:实施情报先导的信息安全方法与实践》——3.3 攻击剖析
  2. Spring Cloud构建微服务架构:消息驱动的微服务(消费分区)【Dalston版】
  3. cout的输出格式初探3
  4. 两台xenserver 同一个vlan中的vm 不能ping通?
  5. 8分钟答辩稿_干货 | 论文答辩,该掌握哪些技巧?
  6. @Transactional 使用
  7. jsp为什么不加虚拟路径都能访问_JavaWeb学习笔记一(环境配置/jsp基本介绍)
  8. IntelliJ IDEA 14.0 添加及显示 JDK DOC
  9. java安装_JAVA 安装
  10. mysql mysql_real_connect 内存泄露
  11. java filter 不过滤器_Java中的Filter过滤器
  12. keras保存断点模型与加载断点
  13. 深度操作系统 V15.11——心随意动 畅享云端
  14. 2019软件测试最新视频教程大合集汇总
  15. 水电缴费系统php源码_水电缴费管理系统(示例代码)
  16. 雅马哈音箱的usb驱动MAC-WINDOWS
  17. hp laserjet1010 win7 64打印慢问题
  18. google vr 简介
  19. 已知a,b,c都是1位整数,求当三位整数abc、cba的和为1333时a、b、c的值
  20. OCAD应用:单透镜与双胶合透镜结构组合设计

热门文章

  1. python 基础 7.1 datetime 获得时间
  2. ESP32 GPIO入门之闪灯
  3. Java 8 你需要掌握的新特性
  4. 对网上盛传的两千万泄漏数据的简单分析
  5. 【Python之旅】第四篇(一):Python装饰器
  6. OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)
  7. server2008实验之七 利用FSRM实现文件服务器精确管理.
  8. 《WinForm开发系列之控件篇》Item65 VScrollBar (暂无)
  9. [zz]世界第一只计算机bug和Debug
  10. XP SP3多数功能借鉴Vista 安装将无需密码