3

Android平台压缩纹理ETC2 VS ASTC

 1 year ago
source link: https://blog.uwa4d.com/archives/TechSharing_301.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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.google.cn/guide/app-bundle/asset-delivery/texture-compression?hl=zh-cn

2.我理解的压缩纹理是CPU不用解压,直接传输给GPU,直接GPU硬件采样。相对于采样ARGB32格式,采样压缩纹理的消耗是不是更高点,还是可以忽略不计?

3.移动平台纹理是否是2份?CPU一份,GPU显存一份,还是共享同一份?

4.ASTC/ETC2的压缩纹理尺寸是否需要2的幂?网上有些说法是非2的幂纹理加载到显存的时候会进行转换成2的幂,转换过程耗时,会导致卡顿。
https://blog.csdn.net/linxinfa/article/details/108827197

我做过以下测试:
1.AssetBundle内的纹理尺寸是原始尺寸。
2.Mumu模拟器+GPA纹理尺寸是原始尺寸,格式转换成了ARGB32。
3.Adreno+高通真机,目前还在测试,找的机器连不上Adreno Profiler。

A1:我2017年立项的时候跟你一样处理过这个问题,我当时的策略是主包使用ASTC,启动更新的时候判断玩家是否支持ETC2,不支持的话下载ETC2版本的AssetBundle资源。资源在线上是完全独立的2份资源(打包的时候每次打包2份独立资源)。当年是为了海外做的这个兼容。经过这几年各个大厂的洗礼,直接ASTC就行了。如果你们的游戏类型一定要下探到那么老的机器,就像我那种双保险的做法。

1.黑屏的问题没遇到。ETC2反而因为压缩算法不好,部分颜色失真,导致你在做部分PBR效果的时候,会有问题。
2.需要硬件支持,就是因为不能用CPU去处理这种软解压跟软压缩,可以忽略。
3.移动平台GPU跟CPU是共享一个内存,但是GPU会独立开辟一份内存,所以会有2份。开启了Mipmap的情况下不是单纯的2份相同内存,所以还有Texture Streaming这种方式来减少贴图内存占用。
4.ASTC不需要。

至于你的测试:
Mumu模拟器在《楚留香》出来的时候就支持ASTC,后面吃鸡游戏风靡的时候更是所有模拟器都支持了,不支持的都要被淘汰。这块可以不用考虑。如果不是单独为了发行模拟器渠道,大部分情况下,发行公司都是要求禁用模拟器登录的。

感谢简单就好@UWA问答社区提供了回答

A2:1.关于ASTC的支持度,题主查的数据本身可以作为参考,但还需要结合考虑项目发行的市场。比如实际上对于中国市场而言ASTC的覆盖率已经非常高,而对于东南亚南美等海外市场则还要酌情;

2.常见的压缩纹理是直接降低纹理资源质量,以质量换性能的行为,它不会在GPU端重新解压缩,相反在内存、带宽等方面都有所优化;

3.只有当纹理资源需要运行时修改、开启了Read/Write Enable选项时,才会向CPU复制一份,否则就只有GPU的一份;

4.ASTC对分辨率没有需求;ETC2要求分辨率为4的倍数,而非2的次幂;特别地,不论是ASTC还是ETC2,如果开启了Mipmap,则必须是2的次幂,否则同样会压缩失败。

感谢Faust@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/62a15f62b87a45735173440e


Memory

Q:Unity使用Profiler和UWA内存差异为何差别这么大?

1.png
2.png
3.png

A:Profiler显示的是引擎真实的分配内存,但这个内存在OS中并不仅仅是这些,它会分配更多的内存Page,而且不同的OS版本,不同的厂商分配的都不一样。

同时,OS层还会启动很多自身的Lib,比如渲染相关的库、文件加载的加速库等等,这些内存的分配,都是Unity统计不到的。

除此之外,还有虚拟机的第三方库,比如Lua等,这些的内存是会被统计到PSS中,但不会被统计到Profiler中,游戏启动时的各种渠道库,也是如此。

所以,PSS比Reserved大是正常的。

但如果你发现PSS比Reserved大了快2倍了,那一定是大家某些库的内存分配过大,比如Lua、Wwise或其他大家使用的第三方库。

感谢芭妮妮@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/62a064d0b87a457351727eee


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版本。

4.png

感谢廖武兴@UWA问答社区提供了回答

A2:推测可能是静态数组太大了,编译器的内存模型不够。可以自己添加IL2CPP的编译选项,注意下这个:
additional relocation overflows omitted from the output

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

A3:看上去是NDK那边失败了,可以尝试一下不要勾选Development Build,可能是生成的二进制文件太大导致的奔溃。

感谢萧小俊@UWA问答社区提供了回答

A4:亲测Maximun JVM heap size,MBytes增加JVM内存有效:

5.png

感谢题主Bomber@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60892a236bb31032f9791493


Script

Q:在Android下可以,切换到PC打包的时候就报错了。请问这是什么意思?如何解决呢?

6.png

A:有文档介绍说:Only native iPhone, Android, and Windows Store Apps are supported. 所以加个宏处理一下就可以了。
https://docs.unity3d.com/ScriptReference/TouchScreenKeyboard.html

感谢张迪@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/62903ab6b87a45735165da5f

封面图来源于网络


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

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK