游戏终于上限试跑了,买了几千个量之后发现服务器没问题,客户端炸得一塌糊涂,而且是无堆栈闪退,直接原地爆炸。
经过一天详细排查,锁定问题在ETTask抛异常的问题,由于本人对ETTask代码相当熟悉,不至于抛个异常能直接炸死,因此没有浪费太多时间,转头质疑伦子哥的HCRL是否有坑。幸亏有人被这么坑过,HCLR官方文档QA上有类似“Task导致的爆炸"问题。
说穿了其实是HCLR Generate/All时,自己分析了当前的BuildOption,按照这个BuildOption导出工程。假如说你在UnityBuildPlayer小面板中勾选了Development,那么HCLR会根据这个设置来Generate/All.
但是ET的BuildEdit那个window也提供了快捷打包方式,会魔改掉这个值!我被坑的原因是因为打包机的UnityBuildPlayer面板中勾选了Development,但是ET中选的Release。这样我打出的包是Release,但是HCLR Generate/All却是用的Develop,当然炸的一塌糊涂,而且打出包来完全看不出异样,app右下角也没development水印标记。
更坑的是,我研发机BuildPlayer面板没勾Development。。。这就导致我自己打包玩,没测出来这个问题。
我喜欢在Task内部直接trycatch,防御编程,因此抛到顶层的异常比较少,更加加深了定位的难度。
合理的解决方案是废弃ET的BuildOption,使用HCLR提供的BuildOption,伦子哥活还是很细的,那个BuildOption考虑了所有Unity混乱的设置情况,获取方法需要反射:
var type = typeof(StripAOTDllCommand); var method = type.GetMethod(“GetBuildPlayerOptions”, BindingFlags.Static | BindingFlags.NonPublic); var buildOption = method.Invoke(null, new object[1] { target}); return (BuildOptions)buildOption;
现在买量越来越贵了,希望不要有人跟我一样花冤枉钱被这种无聊的东西坑得没过好国庆节。。。