1)Android 平台压缩纹理 ETC2 VS ASTC
2)Unity 应用 Profiler 和 UWA 内存差别微小
3)Unity 2020 IL2CPP 打包异样
4)TouchScreenKeyboardWrap 在 PC 模式下打包报错
这是第 301 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Texture
Q:1. 2022 年在 Android 平台的 ASTC 反对度怎么样了,预计 2023 年上的游戏能不能上 ASTC?
1.1 跟 iOS 对立不便解决
1.2 更多抉择管制压缩比例 44->1212
1.3 成果比 ETC2 更好
1.4 ASTC 有没有什么坑,看到有说华为局部机器不反对,会黑屏
网上只找到上面这个数据,2020 年 9 月,ASTC 77%。
https://developer.android.goo…
2. 我了解的压缩纹理是 CPU 不必解压,间接传输给 GPU,间接 GPU 硬件采样。绝对于采样 ARGB32 格局,采样压缩纹理的耗费是不是更高点,还是能够忽略不计?
3. 挪动平台纹理是否是 2 份?CPU 一份,GPU 显存一份,还是共享同一份?
4. ASTC/ETC2 的压缩纹理尺寸是否须要 2 的幂?网上有些说法是非 2 的幂纹理加载到显存的时候会进行转换成 2 的幂,转换过程耗时,会导致卡顿。
https://blog.csdn.net/linxinf…
我做过以下测试:
1. AssetBundle 内的纹理尺寸是原始尺寸。
2. Mumu 模拟器 +GPA 纹理尺寸是原始尺寸,格局转换成了 ARGB32。
3. Adreno+ 高通真机,目前还在测试,找的机器连不上 Adreno Profiler。
A1:我 2017 年立项的时候跟你一样解决过这个问题,我过后的策略是主包应用 ASTC,启动更新的时候判断玩家是否反对 ETC2,不反对的话下载 ETC2 版本的 AssetBundle 资源。资源在线上是齐全独立的 2 份资源(打包的时候每次打包 2 份独立资源)。当年是为了海内做的这个兼容。通过这几年各个大厂的洗礼,间接 ASTC 就行了。如果你们的游戏类型肯定要下探到那么老的机器,就像我那种双保险的做法。
- 黑屏的问题没遇到。ETC2 反而因为压缩算法不好,局部色彩失真,导致你在做局部 PBR 成果的时候,会有问题。
- 须要硬件反对,就是因为不能用 CPU 去解决这种软解压跟软压缩,能够疏忽。
- 挪动平台 GPU 跟 CPU 是共享一个内存,然而 GPU 会独立开拓一份内存,所以会有 2 份。开启了 Mipmap 的状况下不是单纯的 2 份雷同内存,所以还有 Texture Streaming 这种形式来缩小贴图内存占用。
- ASTC 不须要。
至于你的测试:
Mumu 模拟器在《楚留香》进去的时候就反对 ASTC,前面吃鸡游戏风靡的时候更是所有模拟器都反对了,不反对的都要被淘汰。这块能够不必思考。如果不是独自为了发行模拟器渠道,大部分状况下,发行公司都是要求禁用模拟器登录的。
感激简略就好 @UWA 问答社区提供了答复
A2:1. 对于 ASTC 的反对度,题主查的数据自身能够作为参考,但还须要联合思考我的项目发行的市场。比方实际上对于中国市场而言 ASTC 的覆盖率曾经十分高,而对于东南亚南美等海内市场则还要酌情;
- 常见的压缩纹理是间接升高纹理资源品质,以品质换性能的行为,它不会在 GPU 端从新解压缩,相同在内存、带宽等方面都有所优化;
- 只有当纹理资源须要运行时批改、开启了 Read/Write Enable 选项时,才会向 CPU 复制一份,否则就只有 GPU 的一份;
- ASTC 对分辨率没有需要;ETC2 要求分辨率为 4 的倍数,而非 2 的次幂;特地地,不论是 ASTC 还是 ETC2,如果开启了 Mipmap,则必须是 2 的次幂,否则同样会压缩失败。
感激 Faust@UWA 问答社区提供了答复
Memory
Q:Unity 应用 Profiler 和 UWA 内存差别为何差异这么大?
A:Profiler 显示的是引擎实在的分配内存,但这个内存在 OS 中并不仅仅是这些,它会调配更多的内存 Page,而且不同的 OS 版本,不同的厂商调配的都不一样。
同时,OS 层还会启动很多本身的 Lib,比方渲染相干的库、文件加载的减速库等等,这些内存的调配,都是 Unity 统计不到的。
除此之外,还有虚拟机的第三方库,比方 Lua 等,这些的内存是会被统计到 PSS 中,但不会被统计到 Profiler 中,游戏启动时的各种渠道库,也是如此。
所以,PSS 比 Reserved 大是失常的。
但如果你发现 PSS 比 Reserved 大了快 2 倍了,那肯定是大家某些库的内存调配过大,比方 Lua、Wwise 或其余大家应用的第三方库。
感激芭妮妮 @UWA 问答社区提供了答复
Android
Q:Unity 版本 2020.2.3,在 IL2CPP 打包 Android 的编译过程报错,因为我的项目中用的 Puerts 框架,须要生成很多 Wrap 类。如果打包时勾选 Split Application Binary,也用 OBB 分包状况下,应用 Unity 能够间接导出到 APK 和 OBB。但如果不勾选,编译会报错。
同样不勾选 Split Application Binary,在 Build 时,Export Project 导出到 AndroidStudio 工程再生成 APK 也不会有问题。请问有遇到过这样的问题吗?
Exception: Unity.IL2CPP.Building.BuilderFailedException: D:\DevEnvironment\android-ndk-r19\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ @“C:\Users\Administrator\AppData\Local\Temp\tmp30FE.tmp”-o“D:\workroot\Crusher\Crusher\Library\il2cpp_android_arm64-v8a\il2cpp_cache\linkresult_B322E1396ADEEC5519CBECC8D02E669C\libil2cpp.so”-shared -Wl,-soname,libil2cpp.so -Wl,–no-undefined -Wl,-z,noexecstack -Wl,–gc-sections -Wl,–build-id -stdlib=libc++ -static-libstdc++ -target aarch64-linux-android21 -Wl,–wrap,sigaction“D:\Softwares\Unity2020.2.3f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Development\StaticLibs\arm64-v8a\baselib.a”-llog -rdynamic -fuse-ld=bfd.exe
报错详情可戳原问答查看。
A1:尝试减少 JVM 的内存,或者指定一个 NDK 版本。
感激廖武兴 @UWA 问答社区提供了答复
A2:揣测可能是动态数组太大了,编译器的内存模型不够。能够本人增加 IL2CPP 的编译选项,留神下这个:
additional relocation overflows omitted from the output
感激 thrt520@UWA 问答社区提供了答复
A3:看上去是 NDK 那边失败了,能够尝试一下不要勾选 Development Build,可能是生成的二进制文件太大导致的奔溃。
感激萧小俊 @UWA 问答社区提供了答复
A4:亲测 Maximun JVM heap size,MBytes 减少 JVM 内存无效:
感激题主 Bomber@UWA 问答社区提供了答复
Script
Q:在 Android 下能够,切换到 PC 打包的时候就报错了。请问这是什么意思?如何解决呢?
A:有文档介绍说:Only native iPhone, Android, and Windows Store Apps are supported. 所以加个宏解决一下就能够了。
https://docs.unity3d.com/Scri…
感激张迪 @UWA 问答社区提供了答复
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)