50. 2023-03-05周总结
- Unity权限问题
- Shader变体问题
- 服务器问题汇总
- UI框架新增功能
- Socket封装
Unity权限问题
看到记录中有这一条,但是忘记是什么内容了(反思下记录应该再写详细点),后续记起来再补充。
Shader变体问题
之前特效Shader支持的功能很多,比如变色,流动,遮罩,溶解,扭曲等等。这些功能不管用不用都是打开状态,导致性能比较差。
所以利用Shader宏对每个功能进行分别开关控制,只开启用到的功能代码,性能达到最大化。
但是实际使用Shader宏用到了几个问题:
- 如果multi_compile会把所有组合的Shader编译进去,一开始我们用这个方式写的,导致打包的时候需要编译的变体有100多万种。打包直接卡死。
- 但如果使用shader_feature的话,有些用到的shader代码会生成不出来,即使用了Shader变体收集器也不行。
按照我的理解应该是使用shader_feature来做这个功能会比较好,但是目前没有找到shader代码生成不出来的问题。所以还是继续使用multi_compile,删减了一些宏开关,但是目前的变体数还是有7000多个。后续有时间再找找shader_feature哪里使用上有问题。
服务器问题汇总
这周《足球:巨星崛起》上了一个功能,将本来放在本地的存档同步到服务器。因为原来就是以单机形式设计游戏的,当接到这个需求的时候,考虑了下,再最底层的存档文件变动的时候加一个dirty标记,然后每帧tick有这个标记的存档,把它上传到服务器。这个功能在上线小程序版本的时候就已经做好了。目前只是移植到app版。
但上线之后发现,这个请求的qps太高了。导致了一些问题出现。
充值服务器异常
最先发现的是导致我们充值服务器异常,报错的内容是:Timeout waiting for connection from pool
查了下原因是从http pool里面拿连接的时候超时了,原因应该是整台服务器负载上来了,导致该服务器访问后端服务器时间变长,池子里面的连接用完导致。
不过我们开的个数确实也比较小只有10个,改成1000个问题解决
nginx 500问题
发现好多请求返回了500错误,但我们服务器没收到这个请求。
查看nginx日志发现很多error日志,显示的内容是socket() failed (24: Too many open files) while connecting to upstream,
看到这个错误就知道应该是句柄数不够了,在nginx里面增加配置worker_rlimit_nofile=20480
问题解决
请求超时问题
今天流量又增加,导致服务器负载比较高,主要占用资源的是nginx和存储文件的那个后台进程。
临时挪用另外一台服务器作为nginx服务器,通过dns将一部分流量路由到另外一台服务器,来减轻负载。
部署完之后发情有请求超时,查看日志发现请求没有到后台进程那边,按照之前的经验问题应该出在nginx上,所以查看了下日志,发现nginx报异常:1024 worker_connections are not enough
查了下资料是因为连接数太多了,修改配置worker_connections=10240
问题解决。
另外连接超时还有的原因是带宽被打满了,升级带宽后问题解决。
反思
这次上线问题比较多,主要问题还是没有正确评估好上线之后带来的整个服务器压力及所需的资源。另外之前线上机器资源划分的也比较乱导致这个上线的进程影响了其他比较重要的进程。下周决定把所有服务器进程和机器资源重新规划下,防止以后问题再次出现。
UI框架新增功能
这周UI框架功能迭代的也比较多
- 之前基础上增加了子Container概念,这种在一个面板里面套很多个面板的情况下,可以做到各个面板一个类,代码做到解耦。
- 自动绑定功能,包括自动绑定逻辑层的控件,以及自动绑定父子面板的层级关系
- 面板打开异常时候的捕获和处理
- 封装了资源加载接口,默认使用Unity的Resources接口实现资源加载,逻辑层也可自定义资源使用什么方式加载,例如YooAsset或者Addressable
网络封装
之前写的Socket封装重新整理了一遍,目的是客户端和以后的服务端都能使用这一套Socket接口,目前暂时的目标先让现有的客户端项目先用起来,服务端因为用的skynet,暂时只能等下一个项目再用起来。
后续等网络、UI经过一轮验证之后,再考虑把框架代码慢慢整理发布出来。