9

带多个Submeshes模型合并,显示​异常

 3 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_233.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.
neoserver,ios ssh client

1)多个Submeshes模型合并,显示异常
​2)Addressable如何删除旧资源
3)对NGUI字体错乱的解决方案
4)GLSL link error: L0010 Uniform '_Color' differ on precision
5)iOS键盘上的输入框提示内容如何去掉


这是第233篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Script

Q:测试一个Skinmesh合并功能,发现当Mesh包含多个Submeshes时,合并成功后,无法渲染显示出来。当测试的Mesh不包含Submeshes时,可以合并显示。难道CombineMeshes只能合并不带Submeshes的Mesh?

注:不管是使用r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);带上所有材质,还是r.sharedMesh.CombineMeshes(combineInstances.ToArray(), true, false) ;合并一张贴图材质,带多个Submeshes的模型只能合并无法渲染显示出来。不带多个Submeshes的模型却能够正常合并显示。

A:测试发现,需要对每个CombineInstance重新指定三角面,才能正常显示带多个Submeshes的模型。如下代码:

foreach (SkinnedMeshRenderer smr in allSkineMeshList)
{
      for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)
      {
            CombineInstance ci = new CombineInstance();
            ci.mesh = smr.sharedMesh;
            ci.mesh.triangles = smr.sharedMesh.triangles; //这里重新指定

            ci.subMeshIndex = sub;
            ci.transform = matrix * smr.transform.localToWorldMatrix;
            combineInstances.Add(ci);
       }

感谢题主牛头人不服@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5fe55b1a10a17c6c2b09d778


Addressable

Q:目前计划使用Addressable来实现资源热更新,实际真机测试发现当资源更新后,旧的资源Addressable并不会把它删除,同时可以看到App占用的数据文件会越来越大。请问有什么办法可以把指定的Group或Label的资源删除吗?

A:我们用的是覆盖式更新的流程(不是增量更新),Addressables版本是1.15.1。在把Bundle Naming设置为Filename后发现,在Caching中的AssetBundle目录还是带有 Hash值的。

1.png

图中可看到AssetBundle包名已经是Group的名字了,但是下载到Caching中还是有Hash。

然后我们是这么解决的:还是开启文件名的Hash,将Caching中的AssetBundle文件夹名保存到PlayerPrefs中,当检测到有下载的时候,读出PlayerPrefs中的值,把旧的对应AssetBundle包删除,并更新PlayerPrefs。

获取当前Catalog中所有AssetBundle文件夹名的方法,是从Addressables中复制出来的。

    // 获得当前catalog中所有 assetbundle 保存的文件夹名
    // 这个函数中引用到的方法没有列出,可以去 addressables 中源码中找 
    // 示例:CollectBundleNames(new string[]{ "SkllIcons", "ItemIcons", "AvatarIcons" })
    private static List<string> CollectBundleNames(object[] keys)
    {
        List<string> result = new List<string>();
#if ENABLE_CACHING
        foreach(var key in keys)
        {
            IList<IResourceLocation> locations;
            if (key is IResourceLocation resourceLocation && resourceLocation.HasDependencies)
            {
                foreach (var dep in resourceLocation.Dependencies)
                {
                    if (dep.Data is AssetBundleRequestOptions options)
                    {
                        result.Add(options.BundleName);
                    }
                }
            }
            else if (GetResourceLocations(key, typeof(object), out locations))
            {
                var deps = GatherDependenciesFromLocations(locations);
                foreach (var dep in deps)
                {
                    if (dep.Data is AssetBundleRequestOptions options)
                    {
                        result.Add(options.BundleName);
                    }
                }
            }
        }
#endif
        return result;
    }

删除AssetBundle包文件夹的方法:

// 这里的 bundleName 就是 CollectBundleNames 的返回值
private static void ClearCacheForBundle(string bundleName)
    {
        List<Hash128> hashList = new List<Hash128>();
        Caching.GetCachedVersions(bundleName, hashList);
        foreach (Hash128 hash in hashList)
        {
            Caching.ClearCachedVersion(bundleName, hash);
        }
    }

需要注意的是调用CollectBundleNames的时机,如果已经更新了Catalog,那么返回的是即将要写入Caching中的AssetBundle文件夹名。如果要得到当前AssetBundle文件夹名,要在更新Catalog之前调用。

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


Script

Q:对NGUI字体错乱有什么好的解决方案吗?

A:究其原因是NGUI的代码逻辑Bug。

NGUI文字破碎
NGUI_DynamicFont_Bug_Fix

感谢毛尹航@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/58d2558d7dc35e7f0efb4728


Rendering

Q:Android真机报错,表现未发现异常,但是Bugly检测到报错日志:

相关信息:
异常进程#线程:com.go7game.jewelclassic#main(1)
用户 ID:unknown
发生时间:2020-12-23 15:10:53
上报时间:2020-12-23 14:11:21
应用包名:com.go7game.jewelclassic
应用版本:1.20.11
使用时长:39 秒
前后台状态:前台
设备机型:金立 M5
系统版本:Android 6.0,level 23
ROM:LEAGOO/full_wf562k_leagoo
CPU架构:armeabi-v7a

报错的详细信息请戳原问答查看。

A:问题中有提到这个Error是金立M5上发现的,从网上资料可以查到这款手机的SoC为联发科MT6735,对应的GPU为Arm Mali-T720。

Google类似问题时发现有几个类似问题会出现在部分Mali设备。

https://github.com/cocos2d/cocos2d-x/issues/17256
https://forum.unity.com/threads/glsl-link-error-l0010-uniform-_-differ-on-precision.639451/

所以猜测是由于GPU硬件或者驱动导致的浮点数精度的问题。上面帖子里也有提到一些能绕过这个Bug的方案,可以参考下。

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


Q:iOS平台,NGUI输入框中的默认内容会显示在键盘上,这栏怎么去掉,请指导一下。

2.png

A1:iOS可以修改XCode工程中的Keyboard.mm代码定制。

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

A2:遇到类似问题,是接入第三方SDK导致的。

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

封面图来源:GLTFUtility
https://lab.uwa4d.com/lab/5bc4223b04617c5805d4d437


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

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


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK