请教一个问题 英语关于UE4 的UI交互的问题,高手请进

查看: 82回复: 0
请教一个关于UE4 的UI交互的问题,高手请进!!!
元素币活跃度贡献值
元素师, 积分 160, 距离下一级还需 340 积分
元素师, 积分 160, 距离下一级还需 340 积分
在线时间3 小时
马上注册成为元素者,获取海量元素资源,结识各路大神级人物
才可以下载或查看,没有帐号?
UE4的UI实现有UMG与在场景里直接用物体来做,如果用物体来做有什么办法可以让它不跟其它物体一样受相机的影响?谢谢
这些问题最好去群里问,或者发布一个悬赏解决速度回更快
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素推荐-友情提示 /1
每周一次的扩散大招带来更多元素币收益!
快速登录:
收藏帖子(0)
周一至周日:08:00-22:00
积分和充值
&2014&&. All rights reserved. (Epic Games工程师分享:如何在移动平台上做UE4的UI优化?_凤凰资讯
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基本上不会有什么瓶颈了。
用微信扫描二维码分享至好友和朋友圈
凤凰资讯官方微信
播放数:2395733
播放数:593632
播放数:1838986
播放数:5808920  有很多人是从UE3 接触到Unreal,如果你也对UE3非常了解,便能很快的上手UE4。但是,UE4的开发模式还是有所不同的。
  1.谈谈过往,UE1和UE2。
  我知道在那个时候咱们一样挥霍美好的童年在玩游戏而不是做游戏,当然做游戏更挥霍你的青春XD
  UE1和UE2是为FPS设计的,使用UnrealScript来进行编程。说实话UnrealScript是最好的学习面向对象编程的语言。
  添加了kismet。更多的模块类。但是仍旧以FPS为核心设计的
  UnrealScript被下岗了,恭喜你咱们下岗了~。变成了Blueprint,这时候关卡设计师们大声叫好:&不再需要求着愚蠢的程序员帮我们实现系统了,哈哈&。
  游戏类型随意,Paper2D让你轻松制作2维游戏。
  还有许多工程实例供你学习。
  好了咱们向前看~
  5.UnrealScript vs.C++ vs.Blueprint
  这是许多人的疑问,看好戏吧
  6.UnrealScript
  ①面向对象编程,和C,C++,Java比较像。但是还是有区别的
  ②虚拟机编译,这和java一样,方便移植,缺点是速度慢效率低
  ③添加了许多有用的特性,State(说实话状态写AI简直是最完美的方案,我的游戏AI便是强依赖State).Timers(非常方便延迟执行),Delegates(容易引起崩溃,注意使用哦)
  7.Blueprint
  ①对艺术家和设计师来说就是逃离恶心程序员&这不可能实现&的最有力武器,你可以做到&你行你上啊~&。Kismet的伙计应该很容易上手
  ②还是虚拟机,和UnrealScript是一样的。因此,如果你很重视一个环节的执行效率,那么就是用C++
  ③和UnrealScript一样,但一些方面比UnrealScript强。例如你在添加Component中时可以不用关闭编辑器直接修改模型。实在是工农大解放啊...
  ①UE编程始终可以基于C++,除非你用UDK,你这个穷鬼XD
  ②紧密结合虚拟机,因为Blueprint变量和方法有时是需要和C++交互的
  ③为了替换UnrealScript为开发者已经大幅提升了?
  9.UE4基础元素
  ①Actor&
  我们又见面了Actor,Actor是在一个关卡中持续存在的,通常他包含几个Actor组件。支持网络复制和多人游戏。
 Actor不包含位置,方向。这些东西在Root Component中存储。对于UE3 中的Pawn也由PlayerCharacter继承了,因为他有MovementComponent包含跳跃,速度等属性
& &由SpawnActor() 生成
& 必须由Destroy来销毁
 在游戏中不能被垃圾回收
  ②什么是ActorComponent?
& 能被复用的功能可以添加进入Actor
&包含一些最有趣的函数和事件
能被Blueprint访问~
  ③组件例子
 Scene Component 添加形状和连接
& &Primitive Component 添加碰撞和渲染
&UAudioComponent,UArrowComponent,UInputComponent,ULightComponent,UMeshComponent,UParticleSystemComponent等等...
写过UnrealScript会对组件深有体会
  ④PrimitiveComponent组件事件举例
 Hit- 再碰到强的时候调用
 Begin/EndOverlap -进出一个Trigger
Begin/EndCursorOver 没用过
Clicked/Released 不解释
InputTouchBegin/End
Begin/EndTouchOver
   10.你就只认得个Pawn
  Pawn就是你的阿凡达
这个傀儡被Controller操纵着
通常处理运动和输入控制
实现HP的好位置
通常没有运动或是输入反馈的代码,你可以在Controller中写
  11.来见见老朋友Controller
  控制Pawn的傀儡师
可以理解做就是玩家
AIController就是控制AI的
一次只能Possess一个Pawn
当Pawn死的时候可以继续存在,在我的游戏中让pawn死亡,游戏假重置,就是controller直接Possess一个新Pawn的&
PlayerControlelr
  玩家阿凡达的接口
处理点击,手柄,键盘
显示和隐藏鼠标指针
不需要Pawn表示的好地方
菜单,语音聊天...
一些别的有用选项  
  12.Character
  这是使用过UE3的人学习UE4最困惑的地方,有了Pawn为什么还要扩展PlayerCharacter?
 这是一种能走的Pawn,因为包含了MovementComponent
 和上边一样,添加了一些有用的组件
处理客户端角色运动
比UE3有更大的升级
  13.HUD
  还有一些绘制API
没有构建HUD的工具
UMG直接提供所有的东西,我讨厌老旧UI系统。UMG让人解放了
  14.GameMode
  还记得GameInfo吗,实现游戏规则用的
配置Pawn,Controller和HUD是谁
能在任何地方被访问,我来告诉你API GetGameMode()
只在服务器和单机实例中存在
GameState是被用来在客户端复制状态用的
默认游戏类型可以在Project Settings中被设置
每个地图都有自己的GameMode,需要你亲手设置
  15.Input
  这是我对UE4最赞赏的改进之一,你直接在编辑器中添加Bind而不是让你眼花的配置文件中
& & & 在Project Settings中设置去吧
获取指令  
  PlayerController
Level Blueprint
Possessed Pawn
  16.碰撞
 有多种碰撞处理的方法
  线性检测 Line Trace
&体积扫过 Geometry Sweeps
重叠测试 Overlap tests
  简单的碰撞
  Box,胶囊,球,多边形
在运动和物理模拟的时候都需要
  复杂碰撞
  实际用于多边形
武器和反向动力
阅读(...) 评论()页面已拦截
无锡网警提示您:
该网站已被大量用户举报,存在代办假信用卡的嫌疑,可能会骗取您的手续费或窃取您的个人信息,建议您谨慎访问。

我要回帖

更多关于 请教一个问题 英文 的文章

 

随机推荐