一、序

本文大部分内容是对2017 Epic Game的工程师郭春飚先生在 Unreal Open Day上演讲的进一步解释及实际案例分析,欢迎大家多多交流。

二、基础介绍

首先对UE4中UMG渲染结构进行简要介绍:

User Widget:对应一个用户界面。

Widget Tree:每一个 User Widget 都是存储成树状结构。

Panel Widget:不会渲染出来,用于对 Child Widget 进行布局,如 Canva Panel, Grid Panel, Horizontal Box 等。

Common Widget:用于渲染,会生成到最后的 Draw Elements 中,如 Button, Image, Text 等

在游戏渲染时,会遍历两遍widget tree,分别计算widget的尺寸和draw elements,draw elements是根据common widget的类型和参数生成的。一个user widget会生成1个或多个draw elements

三、优化技巧

1.可见性

之前我们在UMG里面介绍过Visbility内不同设置代表的意思。Visible 可见并接受交互事件

Collapsed 不可见且不占用任何体积

Hidden 不可见但占用体积,不接收交互事件

Hit test invisible 可见,且他和他的子节点都不接受点击事件

Set hit test visible 可见,且他自身不接受点击事件,不影响子节点

那么在渲染消耗上从小到大的顺序是 Collapsed

有许多控件的默认状态就是visible,例如image,因此在确认控件不接收交互事件时可以设为set hit test invisible可以减少不必要的开销。

2.合图

在UI开发时,一个界面会用到多个资源来进行拼接。那么客户端在绘制这个页面时,会自动检索这个界面引用到的n个资源,需要计算n次。而如果恰好这n个资源都在一个合图里,则程序只需要读取一次合图文件即可完成这个页面的绘制,只需要计算1次。

Step1

将需要合图的资源用PS4合成一张合图。

Step2

将合图导入UE4生成一个texture,双击资源进行设置,将Compression Setting设为UserInterFace2D,texture group设为UI。(UI的Texture设置)

Step3

右键目标Texture选择Extract Spirtes,将Texture炸开成单独资源。(将合图转化为单独资源)

Step4

改名,然后就可以在UMG中引用资源啦!

缺点:

可以发现这个过程较为繁琐,且迭代之后需要重新命名,很难在实际项目中运用。

方法二-Paper2d

Paper2d文件是UE4中一个基于sprite的系统,主要目的是用于制作2D网格游戏,如超级玛丽和序列帧动画的,但是在功能上与合图有极强的相似性,因此可以借用paper2d来进行合图。

Step1

安装一个TexturGUIPacker,并选择UE-Paper2d框架。

Step2

将需要的资源拖入sprite列表中,注意Trim mode设为None,否则会自动裁切空白像素。(TextureGUIPacker)

若资源量过大导致Maxsize 2048x2048 不够用的话,最多可以设为 4096x4096 ,因为UE4默认最大读取4K尺寸贴图。

Step3

点击Publish Sprite Sheet后自动生成一个paper2d文件,建议将tps(TextureGUIPacker工程)、paper2d、其他资源文件放在同一个目录下进行维护。(资源、合图、paper2d及TPS工程)

Step4

将paper2d文件拖入UE4自动生成Texture文件夹(合图文件)和Frames文件夹(拆分资源)。(刚刚制作的paper2d导入后自动生成的文件)

Step5

后期资源修改时只需维护TPS文件,将新的paper2d导入UE4则可自动修改相关资源了。(如果有资源修改未生效,保存后选择资源进行Reload)

Step6

为了避免PC端资源尺寸不够导致出现锯齿,可打开Project Setting>Editor>Paper2D-import将默认导入材质设为UI。

3.Invalidation Box

在目前的UI界面中,默认是在每一帧都对每一个UI控件进行渲染,但是有些时候UI并不是需要每一帧都进行渲染的,那么InvalidationBox的作用就是将这种UserWidget封装起来,从而缓存Slate Tick数据,不需要每帧都进行计算。只有当他 的某个child widget的渲染信息发生变化 ,才会通知Invalidation box更新缓存信息。(在外层嵌套Invalidation Box)

而当一个Invalidation Box内又存在一个需要实时更新的控件(如一个头像node,头像照片一般不需要每帧都渲染,而玩家又设置了一个需要实时渲染的动态头像框),则需要对该控件进行单独设置。(勾选 is Volatile可以使其不受InvalidationBox的影响)

4.Retainer Box

第二种处理UI不需要逐帧渲染的方式是Retainer Box,这个控件可以让他的子集每隔几帧渲染一次。

上面的这个例子,将一个User WIdget拆分成四部分,每三帧为一个循环,分别对不同的内容进行渲染。做法也是在外层嵌套Retainer Box,对Phasing项进行设置。

由于retainer box的phase count是全局性的,若出现如上图的两个设置,则在每15帧这两个retainer box会同时更新,导致帧数下降。Invalidation box内的retainer box是不生效的,若有需要则在retainer box内嵌套invalidation box。Retainer box会额外占用显存,因此也不是retainer box越多越好的。

Retainer Box还有一个额外的好处,就是可以为UMG添加蒙版。只需要将设置好的UI材质拖到这里,就可以为其子集添加蒙版效果。(蒙版设置示例)

(rentainer box 添加材质后效果)

注意:Rentainer Box的蒙版效果只有运行游戏之后才能看到。

四、总结

大部分的 UI 优化工作(比如说 Invalidation Box, Retainer Box)都是在项目后期( UI 基本开发完成后)再进行的。UE4 提供了很丰富的功能和调试工具,熟练掌握这些功能能够帮助开发者实现高性能的UI。

ue4序列帧ui_UE4入门之路(UI篇):UI性能优化相关推荐

  1. ue4手机ui_UE4入门之路(UI篇):UI性能优化

    一.序 本文大部分内容是对2017 Epic Game的工程师郭春飚先生在 Unreal Open Day上演讲的进一步解释及实际案例分析,欢迎大家多多交流. 二.基础介绍 首先对UE4中UMG渲染结 ...

  2. 性能优化系列第一篇——数据库性能优化

    本文章转载的Trinea大神的文章,文章原地址 http://www.trinea.cn/android/database-performance/ 性能优化之数据库优化 本文为性能优化的第一篇--数 ...

  3. 35岁学python爬虫_35岁码农的机器学习入门之路-python篇

    35岁码农,苦逼的80后,岌岌可危的尴尬年纪,何以解忧,唯有学习,对了,要跟上潮流:机器学习. 本篇所提入门之路,适合大学没学好数学,毕业后数学已忘光,工作多年想半路出家的人,仅供参考. 学习动机提升 ...

  4. 漫游Kafka设计篇之性能优化(7)

    Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也 ...

  5. 漫游Kafka设计篇之性能优化

    原文地址:http://blog.csdn.net/honglei915/article/details/37564757 Kafka视频教程同步首发,欢迎观看! Kafka在提高效率方面做了很大努力 ...

  6. springboot项目实战_2019学习进阶之路:高并发+性能优化+Spring boot等大型项目实战...

    Java架构师主要需要做哪些工作呢? 负责设计和搭建软件系统架构(平台.数据库.接口和应用架构等),解决开发中各种系统架构问题. 优化现有系统的性能,解决软件系统平台关键技术问题攻关.核心功能模块设计 ...

  7. mysql的优化之table_open_cache 篇_mysql性能优化之table_open_cache

    表现:数据库查询效率慢,show processlist 发现比较多的查询正在opening table. 进一步确认,执行以下语句: mysql> show global status lik ...

  8. Unity3D性能优化——工具篇

    Quote from:https://zhuanlan.zhihu.com/p/39529241 性能优化是游戏项目开发中一个重要且必须的元素.用户和项目的需求在并且会持续增长.而即便在硬件设备高速发 ...

  9. Android性能优化系列总篇

    目前性能优化专题已完成以下部分: 性能优化总纲--性能问题及性能调优方式 性能优化第四篇--移动网络优化 性能优化第三篇--Java(Android)代码优化 性能优化第二篇--布局优化 性能优化第一 ...

最新文章

  1. php7伪静态 源码,PHPWind 8.5和8.7版的伪静态.htaccess规则
  2. 北漂程序员的心酸:北漂六年了,没住过4000的房子
  3. 陶哲轩实分析 例 1.2.12 洛必达法则使用注意事项
  4. Linux tcpdump命令
  5. php server 连接字符串,sqlServer 数据库常用连接字符串
  6. ABP入门系列(10)——扩展AbpSession
  7. C++中类和对象的一些注意事项 ---继承
  8. php报错提醒,php报错问题
  9. 北航|北京航空航天大学|介绍|简介
  10. java设置绝对布局_浅谈Java绝对布局 原创
  11. Maven的核心概念
  12. leecode第二百一十七题(存在重复元素)
  13. 1章 SpringBoot介绍
  14. 涉嫌抄袭!致歉,抖音Semi Design承认参考阿里Ant Design
  15. Itext7 jar 下载 链接
  16. 图像降噪:Scale-Space and Edge Detection Using Anisotropic Diffusion
  17. 小瞥linux下UML工具
  18. 电路交换与分组交换的区别
  19. c语言闹钟程序教学,C++实现闹钟程序的方法
  20. 梆梆爱加密java反调试绕过

热门文章

  1. python supervisor 日志_Supervisor使用详解
  2. win10调节屏幕亮度_Win8系统笔记本电脑如何调节屏幕亮度?
  3. 计算机过滤器的作用,14种功能强大的Wireshark过滤器介绍
  4. vue 图形化设计工具_Vue: Vue-CLI3.0 创建项目
  5. python类和对象的定义_python类与对象基本语法
  6. matlab中文帮助_拿走不谢,simulink,stateflow,ecoder帮助手册中英对照版首发
  7. 复制release文件到另一台电脑.exe文件无法运行_电脑技巧:电脑版微信双开(或微信多开)?用start指令可以解决...
  8. 备份linux分区到usb,将Linux引导加载程序备份到USB的方法
  9. mysql 并发避免锁表_Yii+MYSQL锁表防止并发情况下重复数据的方法
  10. [正则表达式] 正则表达式匹配UUID