技术分享连载(六十五)

原文链接:https://blog.uwa4d.com/archives/1809.html

我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

UWA QQ群:465082844
UWA 问答社区:answer.uwa4d.com


性能优化

Q1:在UWA性能报告中,看到PutGeometryJobFence开销较高,请问这个该如何进行优化?
请输入图片描述

就目前我们所优化过的项目而言,推测PutGeometryJobFence是Unity项目的主线程在等子线程的一些网格计算操作完成,其在不同的模块中均有出现(UGUI模块、渲染模块、Mesh.Skin操作、Animator动画模块等等),出现的地方不同,其本身含义也并不相同,不能一概而论。

而就上图中的耗时来看,如果项目中使用了UGUI,那么很大几率(>80%)是由于UI模块的不合理操作所致。我们在Unity5.3~5.5版本中深度优化了多款手游,均不同程度地遇到了该值耗时较高的问题,并且该函数与WaitingForJob经常成对出现,特别是在Android平台上。

下图为一款我们深度优化的ARPG项目中,PutGeometryJobFence在游戏运行时的耗时开销。
请输入图片描述

通过现场进行定位,我们发现PutGeometryJobFence的开销,实际上是主线程在等子线程中的耗时完成的等待时间,且几乎全部是等待Canvas.GeometryJob,如下图所示。
请输入图片描述

因此,我们直觉猜测该UI模块的重建开销很高,以至于子线程的计算压力过大,而PutGeometryJobFence较高,也很可能是主线程的等待时间。为了验证这一猜测,我们开始大力定位和优化该项目的UI模块的重建开销,待调整和优化项目的UI模块后,其WaitingForJob的运行时开销大幅降低(接近于0ms),而PutGeometryJobFence的CPU耗时则基本上可以忽略不计了。
请输入图片描述

同时,需要说明的是,以上仅是我们目前在多款Unity5.3~5.5项目中的具体优化经验,但并不能说明PutGeometryJobFence耗时高就一定是由UGUI模块导致,随着Unity引擎的不断升级,其背后也会隐藏着更多的含义。因此,希望大家在优化时就具体问题进行具体分析、具体解决。


性能优化

Q2:下图中,函数"Transform.set_position"的开销很大,请问有办法优化吗?
请输入图片描述

从图中看,是通过Deep Profiler进行的函数耗时统计,首先Deep Profiler本身对于耗时的统计影响很大,通常在Deep Profiler下调用次数越多的函数,其耗时的统计就会越明显地偏高,因此,我们首先建议关闭Deep Profiler,同时用Profiler.BeginSample/EndSample将修改Position的代码包进来,再查看其耗时,相对会更加准确。

其次,可以观察到有180次的CanvasRenderer.OnTransformChanged的回调,移动UI元素相比于移动其他的元素确实会有额外的开销,建议减少不必要的UI元素的移动,比如通过增加移动阈值,降低移动频率等等。


性能优化

Q3:Unity Profiler中的Canvas.RenderSubBatch是否属于UI上渲染的开销?和重建有关系吗?
请输入图片描述

这个确实是UI模块(UGUI)的渲染开销,但是跟UI的重建并无太大关系,主要还是跟UI界面的渲染Draw Call相关。从上图中可以看出,UI Draw Call达到45个,该值较高,研发团队渲染对UI模块的Draw Call进行进一步优化。


性能优化

Q4:这个Clear的耗时为什么这么大,有什么可以优化的方法吗?
请输入图片描述

图中的Clear耗时确实很高,但需要研发团队关注该高值是小概率出现,还是经常出现。如果是前者,则无需过分担心,但如果是后者,则需要研发团队关注相机图像后处理操作的使用。Clear操作一般是用来清除Camera的各种Render Buffer,当图像后处理使用的越多,则同一帧中开辟更多的Buffer的概率也越大,从而造成Clear的开销也较高。对此,如果你的项目中Clear耗时较高,且高耗时较为频繁,则建议先关闭图像后处理操作,来查看该情况是否有所好转。然后再逐步开启各个图像后处理操作,逐步定位造成Clear较高的耗时根源。

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站(answer.uwa4d.com)上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:465082844(仅限技术交流)


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Halide 是一个开源的图像处理和计算机视觉 DSL(领域特定语言),其目的是让程序员更加轻松地编写高性能的图像处理代码。Halide 的特点是具有易于使用的语法、高性能的代码生成以及可移植性。 本系列文章将介绍 Halide 的基本语法和使用方法,并通过一些实例来演示如何使用 Halide 进行图像处理和计算机视觉任务。 第一篇文章将介绍 Halide 的基本概念和安装方法。 ## 什么是 Halide? Halide 是由丹尼尔·瑞德福(Daniel R. Johnson)和 Jonathan Ragan-Kelley 在 MIT 开发的一个开源项目。它是一个用于编写高性能图像处理和计算机视觉代码的 DSL。 Halide 的主要目标是使程序员能够使用一种简单易懂的语法编写高性能的代码,而无需了解 CPU 或 GPU 的细节。Halide 支持多种平台,包括 x86、ARM、MIPS 和 PowerPC 等 CPU,以及 NVIDIA、AMD 和 ARM 等 GPU。 Halide 的核心概念是“函数”。函数可以看作是一组描述了如何对输入数据进行处理的指令集合。这些指令可以被 Halide 编译成高效的 CPU 或 GPU 代码,并在运行时执行。 ## Halide 的安装方法 Halide 可以在 Linux、macOS 和 Windows 等操作系统上运行,并且支持多种编译器,包括 GCC、Clang 和 MSVC 等。下面是在 Ubuntu 20.04 上安装 Halide 的步骤: 1. 添加 Halide 的 PPA: ``` sudo add-apt-repository ppa:halide/ppa ``` 2. 更新软件包列表: ``` sudo apt-get update ``` 3. 安装 Halide: ``` sudo apt-get install libhalide-dev ``` 安装完成后,可以使用以下命令检查 Halide 是否已经安装成功: ``` pkg-config --cflags --libs Halide ``` 如果输出了一些 Halide 相关的信息,则表示 Halide 安装成功。 ## 总结 本篇文章介绍了 Halide 的基本概念和安装方法。下一篇文章将介绍 Halide 的基本语法和使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值