关于ios:带多个Submeshes模型合并显示​异常

57次阅读

共计 3787 个字符,预计需要花费 10 分钟才能阅读完成。

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 问答社区提供了答复

Addressable

Q:目前打算应用 Addressable 来实现资源热更新,理论真机测试发现当资源更新后,旧的资源 Addressable 并不会把它删除,同时能够看到 App 占用的数据文件会越来越大。请问有什么方法能够把指定的 Group 或 Label 的资源删除吗?

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

图中可看到 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 问答社区提供了答复

Script

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

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

NGUI 文字破碎
NGUI_DynamicFont_Bug_Fix

感激毛尹航 @UWA 问答社区提供了答复

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 问答社区提供了答复

iOS

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

A1:iOS 能够批改 XCode 工程中的 Keyboard.mm 代码定制。

感激 Kenji@UWA 问答社区提供了答复

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

感谢谢志勇 @UWA 问答社区提供了答复

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


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

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

正文完
 0