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

news/2024/7/20 20:54:21 标签: 问答, 优化, 模型合并, 异常, iOS

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值的。

图中可看到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


iOS

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

 

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(原群已满员)


http://www.niftyadmin.cn/n/1030818.html

相关文章

特效优化2:效果与性能的博弈

在上一期《特效优化&#xff1a;发现绚丽背后的质朴》中&#xff0c;我们主要针对UWA本地资源检测中和特效相关的知识点做了讲解。这些看似细小的知识点&#xff0c;很容易在大家的开发和学习过程中被疏忽&#xff0c;而长期的问题积累最终都会反映到项目的性能表现上。为此&am…

符号表之四:符号表的链表实现和哈希表实现

介绍了符号表的组织形式有线性组织&#xff08;重插入简洁性&#xff0c;轻索引性能&#xff09;&#xff0c;排序组织&#xff08;插入操作耗时&#xff0c;重索引性能&#xff09;&#xff0c;哈希表映射&#xff08;以空间换取时间&#xff09;。那么如下便介绍了符号表的链…

2020年度大赏 | UWA问答精选

UWA每周推送的知识型栏目《厚积薄发 | 技术分享》已经伴随大家走过了252个工作周。精选了2020年十大精彩问答分享给大家&#xff0c;期待2021年UWA问答继续有您的陪伴。 UWA 问答社区&#xff1a;answer.uwa4d.com UWA QQ群2&#xff1a;793972859&#xff08;原群已满员&…

场景检测:雾效、Canvas和碰撞体

随着近期的文章《特效优化2&#xff1a;效果与性能的博弈》发布&#xff0c;常见的主流项目资源检测规则的知识点讲解就暂告一段落。在此也欢迎大家集思广益&#xff0c;让我们一起将日常开发中可能会遇到的知识点汇总起来&#xff0c;方便大家避开性能深坑。 今天&#xff0c…

c语言系统默认宏__VA_ARGS__、__LINE__等用于高效Debug

对于涉及多文件较大规模的程序员而言&#xff0c;在不同地方设置printf()用于查看代码运行进展以及查看距离故障点最近位置是很有用的&#xff0c;但是手动地在系统中插入一个个printf(...)&#xff0c;最终版一个个删显然太蠢了。这里介绍一个成体系的Debug函数组。 #ifdef _…

UWA学堂上新|网络同步在游戏历史中的发展变化

网络同步属于游戏开发中比较重要且复杂的一部分&#xff0c;但是由于网上的资料内容参差不齐&#xff0c;很多人直接拿别人的结论写文章&#xff0c;导致很多人对这一块的很多概念和理解都是错误的。笔者查阅了近200篇相关资料&#xff0c;花费了近一年的时间才完成了《网络同步…

编译原理之代码优化

前面介绍完了词法分析、语法分析和语义分析&#xff0c;以及各阶段如何利用符号表来实现代码合理性确认以及代码地址拉链式回填等工作。编译原理出于代码编译的模块化组装考虑&#xff0c;一般会在语义分析的阶段生成平台无关的中间代码&#xff0c;经过中间代码级的代码优化&a…

编译原理之代码生成

前面提到了经过了词法分析->语法分析->语义分析->中间代码优化&#xff0c;最后的阶段便是在目标机器上运行的目标代码的生成了。目标代码生成阶段的任务是&#xff1a;将此前的中间代码转换成特定机器上的机器语言或汇编语言&#xff0c;这种转换程序便被称为代码生成…