1)下载AssetBundle的Mono内存问题
2)Unity 2019运行时获取Hierarchy上预制体资源门路
3)多个Submeshes模型合并后的显示问题
4)ToLua中拜访Time.deltaTime为0
5)CacheServer莫名的断开连接
这是第242篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Memory
Q:应用协程+UnityWebRequest下载Bundle时调配的内存开释不掉。
下载步骤如下:
1. 应用协程+UnityWebRequest下载Bundle;
2. 应用BinaryWriter将UnityWebRequest.downloadHandler.data的数据写入机器;
3. 调用UnityWebRequest的Dispose函数;
4. 调用Resources.UnloadUnusedAssets(),UnityWebRequest.ClearCookieCache()和System.GC.Collect()。
下载每一个Bundle都会执行如上流程,然而Profiler调试真机发现,调配的内存无奈开释,会把Mono内存越撑越大,请问大家遇到过这种状况吗?
A:之前遇到过相似的问题,题主能够参考一下,咱们应用的Unity版本是2018.4.31。不论是之前的WWW还是当初的WebRequest,都是应用的其成员DownloadHandler进行下载。当你拜访“.data”属性时,其实拜访的是一个“GetData()”函数的包装,这个函数返回的是一段native-memory data buffer的拷贝,这也是问题的根结所在。
第一个能够优化的点就是缩小“.data”的应用,用长期变量缓存下来。
第二个就是替换DownloadHandler,Unity提供了多种DownloadHandler,咱们过后是下载图片,所以用的是DownloadHandlerTexture,看你的问题,能够试试DownloadHandlerAssetBundle。参考:https://docs.unity3d.com/ScriptReference/Networking.DownloadHandlerAssetBundle-ctor.html
感激Joke@UWA问答社区提供了答复
Editor
Q:美术心愿在编辑器运行的状态下获取场景GameObject实例对应预制体的门路,以前Unity 2017是能够通过var pRoot = PrefabUtility.GetPrefabParent(go); return AssetDataBase.GetAssetPath(pRoot),获取运行时预制门路的。
最近降级到2019发现接口曾经更新,PrefabUtility.GetPrefabInstanceHandle(targetGameObject)、PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefab)等接口都不能在Unity运行的时候去获取Hierarchy外面的GameObject门路。
我问题外面的要害是运行状态,也就是点了播放,而后获取Hierarchy上预制的存储门路。PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefab)不点播放是能够获取,播放了只能获取Project上预制的存储门路。
A:PrefabUtility.GetNearestPrefabInstanceRoot:获取最近的预制体实例Root。
PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot:获取预制体门路。if (PrefabUtility.IsPartOfPrefabInstance(seletedGo)){ string prefabAssetPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(seletedGo);}
GetPrefabAssetPathOfNearestInstanceRoot能够获取门路,“PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefab)” 这个接口传的不是Prefab局部,而是实例的。
如果不行,在Editor时,在它身上挂脚本或者别的形式建设映射,Runtime下再拿。
感激静风霁@UWA问答社区提供了答复
Mesh
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问答社区提供了答复
Lua
Q:在ToLua中拜访Unity的Time.deltaTime始终为nil,赋值给Lua变量也是0。
PS:在ToLua拜访Unity API之前曾经进行过动态绑定,其余API都能够被Lua失常拜访。
为什么ToLua中拜访Time.deltaTime为0?
A:Lua的绑定必须写在Lua虚拟机启动之后:
感激题主yxy@UWA问答社区提供了答复
Editor
Q:客户端关上Cache Server面板测试Connection会发现连贯不上,而后点击一下服务器的控制台,Enter一下会提醒:
而后客户端能力从新连贯,怎么感觉像是失去焦点的意思,这是什么起因呢?
A:Windows在服务器的控制台右击设置属性/默认值 “勾销勾选疾速编辑模式”。
感激aladdin@UWA问答社区提供了答复
封面图起源:VaSplineSnag
VaSplineSnag是提供给UE4关卡设计师的样条曲线工具。
https://lab.uwa4d.com/lab/5b8627da02004fb65977efaf
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)