产业气象站|【厚积薄发】Addressable卸载单个资源的疑问( 二 )


最后还是建议测试一下 。
感谢黄程@UWA问答社区提供了回答 , 欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f17e18c87d730028cd4d81f
Rendering
Q:在国产安卓机上发现不少号称支持ES3.0的 , 但是实际上却不支持GPUInstance , 现在大家都是如何判断硬件支持GPUInstance的?SystemInfo.supportsInstancing还是SystemInfo.graphiceDeviceType==OpenGLES3?
SystemInfo.supportsInstancing模拟器上调用这个接口 , 支持Instancing , 但实际使用过程中却出现显示问题 , 或者闪退的Bug 。 这个有什么好的方式处理这种情况吗?
A1:建议使用SystemInfo.supportsInstancing , 链接:
https://docs.unity3d.com/ScriptReference/SystemInfo-supportsInstancing.html
该问答由UWA提供
A2:上周也碰到了类似的问题 , 希望能对你有所帮助 。
当时碰到的问题是:想在小米4上用GPUInstance , 但Unity的接口SystemInfo.supportsInstancing竟然是False , 去查了下 , Mi4的CPU是骁龙801 , GPU支持OpenGLES3.0的 , 理论上应该是支持的 , 有点奇怪 , 就去查了下Unity源代码 。
结论是:Unity内部对满足“AdrenoGPU”和“OpenGLES3.0”这两个条件的机器做了特殊处理 。
至于Unity为什么要在这类机器上关闭Instance , 注释里有解释说是在这类GPU上 , Uniform的效率慢 , 但这我就没有做进一步验证了 , 官方既然这么处理了 , 相信应该是有他的道理 。
所以逻辑上判断是否支持Instance , 还是建议使用SystemInfo.supportsInstancing这个接口 。
感谢weenc@UWA问答社区提供了回答
A3:目前已遇到的Instance的使用中有如下几个情况:
1.非AssetBundle的时候Instance没问题 , 但是用了AssetBundle后 , Instance失效 。 导致DrawCall大幅度变多 。
原因是:打AssetBundle的时候 , Instance的变体被裁剪掉了 , 我的方法是对每个Shader创建一个空的 , 打开Instance的材质球 , 将这些Shader和材质球打入一个AssetBundle , 这样变体就不会被裁减掉了 。
2.PowerVR的GPU , 当使用Instance的时候 , 直接闪退了 。
原因是:这是Unity2018.4.18之前的一个Bug , 在Unity2018.4.18中修复了 。
https://unity.cn/releases/full/2018/2018.4.18
Graphics:FixedanissuewithGPUinstancingonPowerVRdevices.(1156362)
所以听上来 , 楼上遇到的问题和PowerVR的问题是一样的 , 机器是支持Instance的 , 结果Unity创建环境创建错了 。
所以 , 要么就是模拟器设置问题 , 没打开OpenGLES3.0的支持 , 要么就是Unity又犯了和PowerVRGPU一样的错误 。 所以先检查下模拟器的设置 , 如果没问题可以升级Unity试试 。
感谢王烁@UWA问答社区提供了回答 , 欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ae714b00956834900752685
Script
Q1:想通过反射的方式将StringBuilder转换为String来避免多余的装箱 , 但发现_str不存在 , 请问.net3.5之后应该用什么替换“_str” , 可以实现Stringbuilder通过反射达到转换成String的方式?
A:貌似已经改为"m_ChunkChars"了 。
产业气象站|【厚积薄发】Addressable卸载单个资源的疑问
文章图片
Q2:没有再出现空异常 , 但强转却失败了 , 是在使用反射的时候又出现什么问题了吗?
我是将值类型装到StringBuilder并通过这种反射来转成String类型的 。
A:char[]类型不能强转成String吧 。 可以通过NewString(char[])转成String , 但终归是达不到你的需求的 。
StringBuilder本身是可以通过指定Capacity设置初始大小来避免中途扩容的 。 我想你是想避免ToString过程中的内存分配 。