TMP耗时较高的优化问题

news2024/9/24 9:25:54

1)TMP耗时较高的优化问题
​2)Unity重载Object后,如何判定物体是否为空
3)SRP Batch在添加unity_SpecCube后的问题
4)堆内存会持续上升,如何用UWA报告来分析


这是第326篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

TextMeshPro

Q:我们项目中UGUI的Canvas.SendWillRenderCanvases耗时高时经常看到子节点TMP.GenerateText和TMP Parse Text耗时高。基本能定位到是角色对话字母跳字的时候,但是这是硬需求不好改。大佬们有没有什么思路优化一下?

A1:建议单独给这块开Canvas。

感谢欧月松@UWA问答社区提供了回答

A2:角色对话时字幕上一个一个字蹦出来确实是比较常见的需求了,都是在一个Text组件里变化,而且字越多顶点数就越高,耗时就比较可观了。

我想到的一个思路还是改用静态字体图集。
可参考:UGUI的优化思路 -- UWA问答 | 游戏开发者互动问答社区 | 侑虎科技

我之前也遇到这个问题,所以做了下实验:
在一个Text组件里用代码控制连续输出3000个中文字符集中各不相同的文字。在Profiler中观察到:

  1. 当使用动态字体时,每输出一个字符都会在相应的TMP动态图集纹理资源中新画入一个字符,在Unity 2021、TMP 3.0.6版本环境下,输出到最后几个字符时,Canvas.SendWillRenderCanvases耗时来到24ms左右。

  2. 当时在用静态字体时,同样的输入方式和环境下,输出到最后几个字符时,Canvas.SendWillRenderCanvases耗时降低到14ms左右。

在还有一些补充测试中,耗时差距在真机上被进一步放大;而且在一些较低的稳定版本的Unity和TMP环境中实验结果也差不多。这里就不一一列出来了。总之,足以说明使用静态字体方案在耗时层面也是具有优越性的。

感谢Faust@UWA问答社区提供了回答


Script

Q:Unity重载Object的 == 后,如何真的判定物体是否为空?

Unity中还找不到除了Try Catch外,去区分Destroyed的物体和null的区别。一些资源追踪操作,可以检查Destroyed的物体,比如:获得Destroyed物体的InstanceID,去识别到底具体出问题的东西是什么。但是如果使用真null的物体调用这类接口,就会出现异常。

现在想找一个,不触发异常的干净方法,判定一个物体是被摧毁,还是真null。

A:简单的写法:
真null的判断:(go as object) == null;
如果不是真null,可以继续判断是不是Destroyed:(go as UnityEngine.Object) == null。

该回答由UWA提供,欢迎大家转至社区交流


Rendering

Q:SRP Batch在添加unity_SpecCube相关参数后,出现 "builtin property offset in cbuffer overlap other stages"。

其实是之前问题的具体情况。在支持SRP Batch的Shader添加反射探针相关参数后:
如果把探针参数放在UnityPerDraw里面,测试多种参数顺序,都会出现 "builtin property offset in cbuffer overlap other stages"问题;
但是放在UnityPerDraw外,又会出现提示要求把相关参数放进里面去。

现在个人想法是,这些参数应该放进UnityPerDraw内,但是具体顺序有问题。不知道有没有成功植入测试的例子。或者是对源码有理解的兄弟可以给出一个可行的顺序。

具体出现问题的版本是2020.3.16f1。

项目现有问题倒是通过将相关参数放在CBuffer外,外加强制裁减变体,在测试到的环境中解决了。但是还是希望能够解决这个深层次的坑。

A:今天也遇到这个问题了,看了下源码,这些Built-in Feature,例如反射探针或者Motion Vector,Unity是有一个Feature List来处理的,每当你开启一个Feature,会在UnityPerDraw分配一个Block,然后你新加入的参数必须跟这个Block大小匹配。

我的问题是Motion Vector只用到了一个矩阵和一个float4,但是Unity给分配的大小就是两个矩阵+一个float4,所以如果要不影响合批,就得这么声明。

你的情况感觉可以添加到probeVolume这个Feature的Block里,Catlike教程里也有提过,测了下顺序不要紧,大小一致就行,3个float4和一个矩阵。

感谢xltqM7stGjuG@UWA问答社区提供了回答


Memory

Q:大佬们问一下,我们项目的堆内存会持续上升到400多MB,这个值太高了,而UWA报告中无论是平均分配值乘以帧数还是泄露分析中的驻留量虽然也很高,但是离400MB还有一些差值。到这里不知道怎么继续分析了,有没有好的建议?

A:2022年底帮一个项目解决了内存一直涨的问题,原因也是内存碎片。刚开始以为是资源出的问题,一直用Memory Profiler在定位问题,只能看到Empty Heap Space一直在涨,到最后发现这个工具找不到原因,但是大概确定了是内存碎片太多。最后通过GC Allocated的变化定位了部分功能。

在这个过程中发现了Profiler里的波形和数值有时候是对不上的,明明有一个很大的波峰,但数据显示根本不对,这时通过这条波峰是定位不到功能代码的。

总结几个容易出现碎片的关键字:

  • byte[]
  • MemoryStream
  • ReadPixels
  • DeflateStream

解决方法:大部分情况能用对象池解决。

感谢李伟@UWA问答社区提供了回答

封面图来源于网络


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

官网:www.uwa4d.com
官方问答社区:answer.uwa4d.com

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大话数据结构-栈

1 概述 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表。 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈,栈又称为后进…

界面控件DevExpress WinForm——轻松构建类Visual Studio UI(三)

DevExpress WinForm拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任…

MyBatisPlus Study Notes

文章目录1 MyBatisPlus概述1.1 MyBatis介绍1.2 MyBatisPlus特性2 标准数据层开发2.1 MyBatisPlus的CRUD操作API2.2 分页功能接口实现2.2.1 config(配置层)拦截器实现2.2.2 Dao(Mapper)数据访问层(CRUD)操作2.2.3 Junit单元测试进行…

新版本GPU加速的tensorflow库的配置方法

本文介绍在Anaconda环境中,配置可以用GPU运行的Python新版tensorflow库的方法。 在上一篇文章Anaconda配置Python新版本tensorflow库(CPU、GPU通用)的方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/129285815&am…

【分布式】10张图带你彻底搞懂限流、熔断、服务降级

文章目录1 限流1.1 限流指标1.1.1 TPS1.1.2 HPS1.1.3 QPS1.2 限流方法1.2.1 流量计数器1.2.2 滑动时间窗口1.2.3 漏桶算法1.2.4 令牌桶算法1.2.5 分布式限流1.2.6 hystrix限流1.2.6.1 信号量限流1.2.6.2 线程池限流2 熔断2.1 断路器的状态2.2 需要考虑的问题2.3 使用场景3 服务…

游戏开发是个“坑”,而且是个“天坑”

本文首发于CSDN公众号 作者 | 开发游戏的老王 责编 | 梦依丹 出品 | CSDN(ID:CSDNnews) 各位游戏开发者大家好,我是开发游戏的老王,一名游戏开发者同时也是一名高校游戏方向的主讲教师,从事游戏开发及相关教…

HTTP缓存从入门到踹门

1 与缓存相关的字段Expires:缓存的绝对过期时间Cache-Control:缓存的相对过期时间Last-Modified:缓存上一次修改的时间(服务端保存)If-Modified-Since:缓存上一次修改的时间(客户端保存&#xf…

第十一届蓝桥杯省赛——2解密

题目:【问题描述】小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的字符 Tc。下表给出了字符变换的规则:字母cTc字母cTc字母cTc字母cTcaynlAYNLbxogBXOGcmpoCMPOddquDDQUearfEARFfcssFCSSgitzGITZhkupHKUPinvwINV…

【ArcGIS Pro二次开发】(11):面要素的一键拓扑

在工作中,经常需要对要素进行拓扑检查。 在ArcGIS Pro中正常的工作流程是在数据库中【新建要素数据集——新建拓扑——将要素加入拓扑——添加规则——验证】,工作流程不算短,操作起来比较繁琐。 下面以一个例子演示如何在ArcGIS Pro SDK二次…

数组一次性删除多条数据

需求描述 最后提交时删除表格中的空行 实现方法 单行删除 - 并不是一次性删除 表格每行的最后设置删除按钮&#xff0c;点击时将当前行的索引传递给方法&#xff0c;splice 删除当前行。 <el-table :data"tableData" class"myTable" border>..…

爬虫实战进阶版【1】——某眼专业版实时票房接口破解

某眼专业版-实时票房接口破解 某眼票房接口:https://piaofang.maoyan.com/dashboard-ajax 前言 当我们想根据某眼的接口获取票房信息的时候,发现它的接口处的参数是加密的,如下图: 红色框框的参数都是动态变化的,且signKey明显是加密的一个参数。对于这种加密的参数,我们需要…

第14届蓝桥杯STEMA测评真题剖析-2023年2月12日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第103讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

域权限维持之创建DSRM后门

DSRM&#xff08;目录服务还原模式&#xff09;&#xff0c;在初期安装域控的时候会让我们设置DSRM的管理员密码&#xff0c;这个密码是为了在后期域控发生问题时修复、还原或重建活动目录。DSRM账户实际上是administrator账户&#xff0c;并且该账户的密码在创建之后很少使用。…

Azure OpenAI 官方指南 01|GPT-3 的原理揭秘与微调技巧

Azure OpenAI 服务在微软全球 Azure 平台正式发布后&#xff0c;迅速成为众多用户最关心的服务之一。 Azure OpenAI 服务允许用户通过 REST API 访问 OpenAI 的强大语言模型&#xff0c;包括 GPT-3、Codex 和 Embeddings 模型系列。本期&#xff0c;我们将为您揭秘 Azure Open…

乌班图安装kvm并配置网络

乌班图22安装KVM 1.安装KVM sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinstsudo adduser id -un libvirt sudo adduser id -un kvm sudo apt install virtinst qemu-efi sudo systemctl enable --now libvirtd sudo s…

Tcl_Init error: Can‘t find a usable init.tcl in the following directories

目录 问题 解决 小结 问题 最近在研究开源波形显示软件gtkwave时,Ubuntu18.04下编译打包完成,移植到另一个电脑上运行时,出现以下错误,如图: 擦掉的部分是一些路径信息,这个错误提示意味着您的系统中缺少所需的 Tcl 初始化文件,路径下确实没有init.tcl文…

嵌入式 LVGL移植到STM32F4

目录 LVGL简介 1、特点 2、LVGL的硬件要求 3、相关网站 4、LVGL源码下载 5、LVGL移植要求 5.1 移植过程-添加源码 2、更改接口文件 3、显示实现 4、添加外部中文字体的方法 5、编译下载后有几种情况 6、调用显示 6、GUI-Guider使用 6.1 安装软件 6.2 使用…

Kakfa详解(一)

kafka使用场景 canal同步mysqlelk日志系统业务系统Topic kafka基础概念 Producer: 消息生产者&#xff0c;向kafka发送消息Consumer: 从kafka中拉取消息消费的客户端Consumer Group: 消费者组&#xff0c;消费者组是多个消费者的集合。消费者组之间互不影响&#xff0c;所有…

Wireshark+Go捕获本地TCP通信

初学计网&#xff0c;使用Wireshark观察本地端口间TCP通信过程。 目录 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 步骤1&#xff1a; 使用go语言搭建本地客户端与服务器TCP通信&#xff0c;测试完成后在步骤2先运行服务器&#xff0c;再运行客户端。 服务器…

C语言查漏补缺(进阶)volatile、__attribute__、void*、地址对齐、$$Super$main

最近在学习RT-Thread&#xff0c;在看其源码的时候发现了许多自己不太了解的C语言知识点&#xff0c;在此查漏补缺一下。 1. 关键字 volatile volatile是C90新增关键字&#xff0c;volatile的的中文意思是adj.易变的&#xff1b;无定性的&#xff1b;无常性的&#xff1b;可…