关于Addressable打包图集与图片都打进去造成冗余

news2025/1/24 17:48:29

1)关于Addressable打包图集与图片都打进去造成冗余
​2)Unity如何计算Root动画旋转
3)IL2CPP编译的Protobuf反射类运行时报空
4)为什么Active Constraints会出现过高的现象


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

Addressable

Q:关于Addressable打包图集与图片都打进去造成冗余。

Unity版本:2021.2.13f1c1
Addressable版本:1.19.16(cn版本)

使用的是Addressable的默认Group,场景中只使用了decal3的UI图片,但是打包最后的资源,Addressable的包中包含了两个资源,正常应该只有图集资源才对(如下图)。

另外,看了Addressable打包流程的代码,Unity把关联的图片加入依赖打包列表,但是又在之后对图片检测做了生成图集的处理。原生打包不会对图集里的图片再做处理吗?

A:可以切换com.unity.ScriptableBuildPipeline版本到1.21.5试试看,1.21.5修复的问题应该包括这个。
更新日志:
Changelog | Scriptable Build Pipeline | 1.21.5

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


Animation

Q:想了解Unity的RootMotion的实现细节,请问Unity是怎么计算Root动画旋转的?

一个动画,如果配置正确,AnimationClip里会多两段曲线数据,RootT、RootQ分别是根节点的位移和旋转信息。但是当我用Animator跑起来后,我们每帧RootMotion旋转多少,Root节点逆向旋转多少,是怎么计算出来的呢?

朴素的想法是:旋转当前帧的RootQ相对于第0帧RootQ的旋转的eulerAngles.y。但是经过我多次测试,并不是这个值,而是有偏差的一个值。有时候多几度,有时候少几度。

没有Unity源码的情况下,很难知道它的计算方法。我去看了Godot,其方法是正常把当前旋转和第0帧做差值。

比如这个动画,我已经把数据删得差不多了。第1帧,Animator认为应该转24.068,这两个旋转的欧拉角表示分别是(277.77, 66.96, 81.36) 、(279.53, 74.28, 100.03),from to旋转的欧拉角是(3.29, 25.78, 0.02) 。这个25.78和24差得不多,但是总归不一样。其他测试数据类似,都是差一点。

A:对于旋转的计算,Unity使用了四元数(Quaternions)来表示旋转。旋转的差异可能是由于以下原因之一导致的:

  1. 欧拉角(Euler angles)转换为四元数的过程中可能存在精度损失。欧拉角存在万向锁问题和旋转顺序问题,这可能导致从欧拉角转换为四元数时出现不准确的结果。
  2. 根节点旋转的计算可能受到其他因素的影响,例如动画过程中的插值算法、关键帧的设置、平滑过渡等。这些因素可能会导致计算结果与期望的差异。

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


Script

Q:IL2CPP编译的Protobuf反射类运行时报空,问题发生时,会闪崩,闪崩日志信息:
ErrorNotNull:"c# exception:System.TypeInitializationException: The type initializer for 'abcConfigReflection' threw an exception. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ExecutionEngineException: Attempting to call method 'Google.Protobuf.Reflection.ReflectionUtil+ReflectionHelper`2[[System.IntPtr&, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]::.ctor' for which no ahead of time (AOT) code was generated.n

at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) [0x00000] in <00000000000000000000000000000000>:0 n

at System.Activator.CreateInstance (System.Type type, System.Boolean nonPublic) [0x00000] in <00000000000000000000000000000000>:0 n

at Google.Protobuf.Reflection.ReflectionUtil.GetReflectionHelper (System.Type t1, System.Type t2) [0x00000] in <00000000000000000000000000000000>:0 n

at Google.Protobuf.Reflection.ReflectionUtil.CreateFuncIMessageObject (System.Reflection.MethodInfo method) [0x00000] in <00000000000000000000000000000000>:0 n
...
具体信息请见原网页。

看下来是因为AOT编译时代码剔除所致,问题非常偶现。我们的QA基本上没有跑出来过这个问题,但是放到外网就有一堆玩家遇到此问题,蹊跷的是哪怕同一个手机也是偶然才报。

Proto Github项目有人提过:
Reflection error with Unity when using il2cpp · Issue #5422 · protocolbuffers/protobuf · GitHub

这个问题包括下面回复主要提了两点:
1. linker包含Google.Protobuf程序集
2. AOT编译器不会为T、为AnyEnum的泛型方法,针对枚举参数泛型方法创建显式调用类脚本限制 - Unity 手册

和我这个问题不同点是,abcConfigReflection是一个类,不是枚举,而且整个项目这个类会有很多。

我用的Proto版本3.6.1,而且Proto也在3.6.0版本说修改了> AOT generics issues in Unity/il2cpp have a workaround (see commit 1b219a1 for details)。

Protobuf源码确实加了强制反射的代码:

static FileDescriptor()

        {
            ForceReflectionInitialization<Syntax>();
            ForceReflectionInitialization<NullValue>();
            ForceReflectionInitialization<Field.Types.Cardinality>();
            ForceReflectionInitialization<Field.Types.Kind>();
            ForceReflectionInitialization<Value.KindOneofCase>();
        }

当然我有加Google.Protobuf程序集到linker,还是不能解决。后来我加了Assembly-CSharp程序集到linker,也就是整个自定义代码全部不剔除,目前因为不方便放外网,也不清楚有没有解决这个问题。

使用Protobuf序列化数据应该是常规操作,相信应该有很多人遇到,不知道大家处理方案是什么?

A:可以尝试以下方法:
Initialize the library and verify operation | Android Developers

Ahead-of-time compile (AOT)
Ahead-of-time compile is required for the IL2CPP backend and Unity versions 2017 and 2018 (but not for later versions of Unity).

The AOT compiler may not generate code for generic methods. You need to force the compiler to generate the proper code required for protobuf by adding the following method:

using Google.Protobuf.Reflection;
using UnityEngine.Scripting;

...

// Don't call this method.
[Preserve]
void ExampleOfForceReflectionInitializationForProtobuf()
{
    FileDescriptor.ForceReflectionInitialization<Scene>();
    FileDescriptor.ForceReflectionInitialization<ShadowType>();
    FileDescriptor.ForceReflectionInitialization<LevelType>();
    ...
    // Add FileDescriptor.ForceReflectionInitialization<T> for each generated enum.
    // You can find the list of enums in DevTuningfork.cs -> enum section
    // or in the list of enums in Google -> Android Performance Tuner.
}

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


Physics

Q:通过Profiler分析项目,发现其中Active Constraints这一项会突然出现一个很不合理的峰值。目前只发现与角色身上是否挂载刚体有关。

但是与刚体数量对比起来,这种极高的Active Constraints为何会发生是毫无头绪的。在此向各位请教下。

A:从官方文档的截图里可以看到,在一个刚体的情况下,官方的实例里依旧也会产生17.29KB的Active Constraints。估计是统计方式有问题,又或者是理解上存在差异。

我在Unity 2018和Unity 2020这两个版本都见到过Active Constraints过高的现象。

至少目前来讲,这个数量级的Active Constraints还属于可接受范围(官方自己都觉得没问题),不需要去专门花费大量时间去排查优化。

感谢题主午休达人@UWA问答社区提供了回答

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com

 

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

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

相关文章

配置 ssh key 后 git 拉取代码一直提示输入用户名、密码问题

中间过程比较碎碎念&#xff0c;涉及到一些错误的方案以及和 gpt 对线 可以直接跳到结论部分 0 场景 我有一个项目&#xff0c;仓库里已经配置了 ssh 公钥&#xff0c;但是每次 pull 或者 push 代码依旧提示输入用户名、密码 -1 失败的方案 -1.1 失败的方案1&#xff1a;全…

迅为国产化RK3588开发板在安防前后端应用解决方案

K3588是瑞芯微推出的一款高性能处理器&#xff0c;针对安防领域的应用具备强大的计算能力和图像处理能力。下面是关于RK3588的安防前后端应用解决方案的介绍&#xff1a; 前端摄像头端&#xff1a; 高清视频采集&#xff1a;利用RK3588处理器的高性能图像处理能力&#xff0c;…

MySQL 对字符串使用 STR_TO_DATE() 函数

文章目录 STR_TO_DATE() 函数1. 待转换字符串中出现数字以外的&#xff0c;自动去除字符&#xff0c;然后添加0至8位转换为日期2. 如果格式字符串仅包含日期&#xff0c;则待转字符串至少需要 8 位数字3. 转换后日期时间必须有效&#xff0c;否则返回结果为 null4. 如果被转字符…

视频怎么加水印?如何录制带水印的视频?

案例&#xff1a;如何给视频添加水印&#xff1f; 【我发布在短视频平台的视频&#xff0c;总是被别人盗用&#xff0c;我想给自己的视频添加水印。有没有视频添加水印的方法&#xff1f;在线等&#xff01;】 很多视频制作者或者爱好者&#xff0c;都希望自己的视频作品得到…

OSPFv2特殊区域---NSSA区域

NSSA区域原理 NSSA区域 no-so-stub-area&#xff0c;次末梢区域。 NSSA区域能够将外部路由引入并传播到整个OSPF自治域中&#xff0c;同时又不会学习来自OSPF网络其它区域的5类LSA OSPF规定Stub区域是不能引入外部路由的&#xff0c;这样可以避免大量外部路由对Stub区域路由器…

我“Hack”了一款精酿啤酒

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 产品统筹 / bobo 联合制作 / 声网、CBCE 2023 录音间 / 声湃轩北京站 今天这位嘉宾的爱好非常广泛&#xff0c;除了自己是一位网络安全领域的从业者之外&#xff0c;平时还爱好攀…

Win32 API 编写一个串口助手

首先对串口操作做了一些封装: 助手类声明如下 CSerialPort.h #pragma once#include <string> #include <windows.h> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endifclass CSerialPort { pu…

JetBrains的Go语言集成开发环境GoLand 2023版本在Linux系统的下载与安装配置教程

目录 前言一、GoLand 安装二、使用配置总结 前言 GoLand是一款专为Go语言开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署Go应用程序。注&#xff1a;已在CentOS7.9和Ubuntu20.04安装…

删除排序数组的重复项

给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums [1,1,2…

JavaEE进阶5/25(属性注入)

目录 1.更简单的存取Spring对象 2.获取Bean对象&#xff08;对象装配&#xff09;DI 3. Resource注入 4.Resource注入和Autowired注入的区别 1.更简单的存取Spring对象 2.获取Bean对象&#xff08;对象装配&#xff09;DI 对象装配&#xff08;对象注入&#xff09;有三种方…

含镍废水树脂吸附工艺方案

项目基本信息 工艺及产品信息 甲方 欣兴同泰科技(昆山)有限公司 采用工艺 沉淀工艺过滤系统离子交换放流池 工程公司 / 工艺原理 镍离子以氢氧化物的形式做成镍泥&#xff0c;清液中微量镍离子通过螯合离子交换原理实现出水稳定达标 开始时间 2019/6/20 工艺特点 …

遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

TortoiseGit的安装及使用, 并配合Gitee码云使用

Windows10下, TortoiseGit的安装及使用, 并配合Gitee码云使用! 1) 安装TortoiseGit 官网, 32位, 64位, 自选 Download – TortoiseGit – Windows Shell Interface to Git 2) 点击下载, 安装, 我选择的是64位, 中文安装包(说明: 中文安装包也分32, 64位), 这两个下载. Tips:…

在ubuntu上安装splint

lint lint是最著名的C语言工具之一&#xff0c;是由贝尔实验室SteveJohnson于1979在PCC(PortableC Compiler)基础上开发的静态代码分析&#xff0c;一般由UNIX系统提供。 工具介绍 与大多数C语言编译器相比&#xff0c;lint可以对程序进行更加广泛的错误分析&#xff0c;是一…

2023数博会 | 李雨航:新一代数据安全国际实践,CSA引领数据安全3.0时代

5月26-28日&#xff0c;2023中国国际大数据产业博览会&#xff08;简称&#xff1a;数博会&#xff09;在贵州贵阳举办。大会由国家发展和改革委员会、工业和信息化部、国家互联网信息办公室和贵州省人民政府共同主办&#xff0c;是全球首个以大数据为主题的博览会。今年数博会…

css 实现丰富的序号效果

<ol><li><p>日本新潟佐渡岛</p></li><li><p>宣告“飞岛萱草”</p><ol><li><p>迎来最佳观赏期。</p><ol><li><p>据观光协会介绍&#xff0c;</p></li><li><p&…

Linux内核驱动 --- CCF框架 provider驱动的编写

Provider驱动编写流程 复制上节内容中对Provider驱动编写流程的总结&#xff1a; 1&#xff09;分析硬件的clock tree&#xff0c;按照上面所描述的分类&#xff0c;将这些clock分类。 2&#xff09;将clock tree在DTS中描述出来&#xff0c;需要注意以下几2点&#xff1a; …

自定义集合和ES6集合

概念 集合是由一组无序且唯一的项组成的。 空集是指不含任何元素的集合。 说在前面 虽然es6已经有了Set类。但是我们还是希望自己来实现Set类。 原生的Set类参考我这篇博文&#xff1a; JS中数组如何去重&#xff08;ES6新增的Set集合类型&#xff09;经典two sum面试题ht…

C++进阶——哈希的实现

C进阶——哈希的实现 unordered系列关联式容器 在C11出现中有了重大更新就是添加了移动构造和unordered关联容器。在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到O( l o g 2 N log_2 N log2​N)&#xff0c;即最差情况下需要…

MYSQL高级之关联查询优化

建表 CREATE TABLE IF NOT EXISTS class ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRIMARY KEY (id) ); CREATE TABLE IF NOT EXISTS book ( bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRI…