场景物件Static设置失效

场景物件Static设置失效

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

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


本期目录:

  • 场景物件Static设置失效
  • Optimize Game Objects选项去掉后模型换装显示异常
  • 游戏启动时间,优化和策略选择
  • 关于Lua调用collectgarbage的策略
  • ToLua性能问题

AssetBundle

Q:请问一下,场景中勾了Static的物体,当场景打成AssetBundle后加载。


运行加载后,原来Static的物体,就不打钩了,这是什么原因?

A:这个问题应该是官方Bug,好多版本都存在,可以参考康来大神在Blog中的Case1:http://qiankanglai.me/2016/03/15/unity-lightmap2/index.html

以及官方论坛中的帖子:
https://forum.unity.com/threads/unity-5-3-objects-in-scenes-loaded-from-assetbundles-are-losing-their-static-flag.377771/

解决方案有两种:
1、不要使用AssetBundle载入整个场景,而是载入Prefab化的物体。
2、使用StaticBatchingUtility进行静态批处理。

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ce69aecfd7bd665736194c9


Animation

Q:勾上Optimize Game Objects时换脸和身体的Mesh都是正常的。勾去掉之后换脸正常,但是换身体就不正常了,这是什么原因呢?感觉跟Avatar相关但是又不是很清楚怎么排查,麻烦有知道的大佬指教一下,谢谢。

A:替换的Mesh,所在的FBX的导入选项是否与原Mesh的相同?错乱一般来说是Mesh里存的骨骼信息与Avatar驱动的骨骼信息不符。

按照:“两个FBX骨骼一致 --> 导入参数一致,用同一个Avatar --> Mesh替换后rebind” 这样的流程梳理一下,看看有没有可能在哪一步出现问题。

我们项目里不是替换Mesh,而是直接替换SkinnedMeshRender所在的GameObject,不知道有没有关系,因为如果不勾选OPT选项,SkinnedMesh里是有骨骼列表和权重信息的,虽然是存在Mesh里,但是不确定SkinnedMeshRender里面是不是也有关联的信息。

(还有一个道听途说的点,就是不开OPT,骨骼的Transform要在Mesh之上,没有相关经验和原理支持,题主可以尝试一下。)

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


启动

Q:这里的启动时间指的是登录界面出现之前的时间。目前我们的游戏是启动游戏后,加载所有的表、初始化全部系统,手机上启动时间比较长,看了下阴阳师和完美世界,都是直接到登录界面的。我们想改成用到系统再加载数据和初始化操作,想问问除了这样之外,还有什么需要注意的地方?以及现在游戏一般启动时间要控制在多少秒?

A1:至少还需要注意下以下三点:
(1)Shader的编译耗时,尽可能将少量Shader放入到Always Included Shaders中,减少不必要的启动编译耗时;
(2)资源初始序列化的耗时,Resources下的资源数量太多,会导致启动很慢;
(3)最近有项目反馈,StreamingAssets下的AB数量也需要特别注意,不要过多,超过1w+,启动时间很有可能会收到影响。

至于启动时间一般控制在多少秒内,可以看看其他朋友是否有经验分享。
该回答由UWA提供

A2:可以考虑使用Android splash代替Unity自带的,另外第一个界面使用进度条显示,尽可能让进度条界面最快速度出来。
感谢曾毅@UWA问答社区提供了回答

A3:先统计一下加载配置表,加载必要AssetBundle的时间占比,如果这些时间不长,就可能是Shader编译、Resource资源加载的问题。确定好时间花在哪,才好优化。
感谢KK@UWA问答社区提供了回答

A4:首次登入系统的时候最好不要读取所有的配置表。

而是读取所需要的配置表,这个可以根据项目本身的需求去选择性的读取,或者直接在C#主工程里边完成相关的配置。之后在进入游戏场景中(MMORPG一般应该都是选择角色之后)再去读取所有配置表,初始化所需要的系统。

游戏启动之后基本上是控制在1秒左右就显示出来对应的界面,比如说更新界面、安装更新进度界面、登录界面等(策划需求,因项目而异的)。
感谢刘仲秀@UWA问答社区提供了回答

A5:Lua配置表加载时间过长、key过多造成的吗?单纯的io,除非你的表格达到几十兆,一般是不会感觉到明显卡顿的,我怀疑是key太多造成的,key过多你会发现不仅加载速度会有问题,内存还会膨胀的很厉害。
感谢leo@UWA问答社区提供了回答

A6:随意说个非技术的解决方案。申请版号时候,zf要求在显著位置显示健康游戏忠告5秒以上。直接在公司Logo后的splash显示健康游戏忠告的静态图片,5秒的时间足够做很多事情。

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


Lua

Q:游戏使用xLua,包括战斗在内的绝大部分游戏逻辑均是在Lua层完成的。

当不手动干预时,Lua内存会在一段时间内持续上升到某一个值(比如100MB)进行一波释放,大概回到50MB左右,然后再继续上升到下一次可能是150MB左右,才开始下一波释放。

如果手动调用collectgarbage(“collect”)会导致一次明显卡顿,而setstepmul + step的方式总是无法调到一个理想的值,想问问你们是怎么处理Lua GC这块的?

A:全量GC和对象数量存在明显关系,释放的时机要根据项目的特性自己定制。有的产品在切换场景时GC,有的定时GC,有的在关闭UI的时候GC。

我们分成了三种情况,超大界面关闭时释放资源并GC,使用比较多的界面不释放资源不GC,一般界面释资源不GC,切换场景GC。

你要看下你们需要GC的对象数量,要么对象回收利用,要么控制下数量,或者是和你们自己的GC方案。

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


Lua

Q:ToLua性能问题,bind绑定代码的时候,时间消耗很长,有什么好的方法解决吗?想到的有减少需要绑定的类,减少导出的函数变量等,但实现起来工作量有点大,以后Lua代码用到新的变量也要改,有其他好用的方法吗?

A1:1)多线程bind;2)Preloading,把你未来可能需要的类型添加到导出列表customTypeList,同时也添加到dynamicList列表中,这样导出后该类型并不会随binder注册到Lua中,你可以通过require “namespace.classname” 动态注册到Lua中,对于非枚举类型ToLua#系统也可以在第一次push该类型时动态载入,当然也可在过场动画、资源下载、登录、场景加载或者某个的函数中require这个类型。
感谢cloud@UWA问答社区提供了回答

A2:最好还是C#类都通过中间脚本导出,这样只导出用到的方法。如果整个脚本导出的,手动添加NoToLua工作量比较大。
感谢江南@UWA问答社区提供了回答

A3:请把你的*CustomSettings.cs 中的

** //在这里添加你要导出注册到lua的类型列表
public static BindType[] customTypeList =
{
}*

贴一下,去掉你们不曾使用的。
感谢debugger@UWA问答社区提供了回答

A4:多用Preload,然后能IL2CPP就IL2CPP(这个能解决大部分问题)。如果不行,用多线程bind也可以,最后可以试试用这个修改版:https://github.com/NewbieGameCoder/tolua

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


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

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

封面图:Dabrovic Sponza
试图用Unity渲染“Dabrovic Sponza”场景。