iOS渲染卡死应该如何解决

1)iOS渲染卡死应该如何解决
2)C#传给C++的Byte数组如何释放
3)EAssetBundle.Unload(true)触发长时间卡顿的原因


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

UWA社区主页:community.uwa4d.com
UWA QQ群:465082844

Platform

Q:想问问大家是否有遇到过iOS渲染卡死的问题?表现是整个画面静止,背景音乐还在播放,但不崩溃。

Unity版本是2018.3.35,iOS15和16以上都遇到过。

随机出现,Xcode连真机无任何渲染相关报错,然后还不是稳定复现,所以排查比较难,只能跪求跳过坑的前辈们,感谢!

A1:关掉多线程渲染试试。

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

A2:提供个思路,之前有类似的问题,在安卓上发现卡死在了FMOD的线程里面。

感谢郭艺君@UWA问答社区提供了回答

A3:我们项目之前有过类似的情况,是32位包出的,升级64之后就没再出现过,可以试试。

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

A4:你可以试一试关闭Unity的自动渲染,然后移除Metal渲染,只保留OpenGL试一试。

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

A5:Unity 2018版本后开了纹理异步上传,如果资源管理不严谨,就会出现该问题,资源非法卸载的时候就会导致卡死。特别是当从AssetBundle异步LoadAsset时(包含纹理),如果卸载AssetBundle,很大概率会出现屏幕冻结。

感谢1 9 7 3-311135@UWA问答社区提供了回答


Script

Q:游戏里用C#读取文件数据byte[],然后传给C++(unsigned char*),有点不明白,这个数组是同一份内存还是复制了一份?

在C++调用free()释放会闪退,猜想应该没有复制,如果是这样,C#这边读出来先不管,C++那边还引用着,也没释放(析构时置空引用),要怎么释放呢?

针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/652cb15d9d889b61f7e4cfac


Loading

Q:当前项目运行文件在一部分主机平台上,会有AssetBundle.Unload(true)触发的数百毫秒的CPU卡顿。

当前运行时是有频繁加载和卸载相关的操作。但是测试对加载(限制AssetBundle.LoadAssetAsync)和卸载(限制AssetBundle.Unload)频率进行单帧限制,在部分主机平台上仍然无法解决。

AssetBundle本身的加载尚未尝试,但是一般L4Z压缩的单个AssetBundle加载都在1-2帧内完成,个人觉得不应该影响很大。

用Profiler追踪数据,发现造成较长时间卡顿的帧,Unload调用次数很多只有1-2次,并且处于加载中的头部资源也不多。单个头部资源可能引用较多依赖资源包。

不知道有没有处理过类似问题的朋友,可以给一些检查方向上的建议。

A:经查,是AssetBundleLoadRequest太多把PersistentManager锁住了。给加载和卸载分配单独的帧就好了。

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

封面图来源于网络


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

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844

posted @ 2023-11-06 10:26  UWATech  阅读(31)  评论(0编辑  收藏  举报