缘由
本人从事游戏开发很多年一直都是游戏服务器端开发。
因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧。这样的环境下不得不逼迫我需要什么都会,什么做。
但是自我感觉好像什么都不精通。。。。。
好了好像偏题了!
回归正题
现在公司是做手游开发,java服务器 + U3D做客户端的mmo手游,仿魔兽世界!
做软件的都知道一个蛋疼的事情,那就是线上Bug。但是做服务的人更清楚另一个蛋疼的事情,就是在线更新,不停服更新。
知道的人,想想都蛋疼,当然不知道的,那就只能自己想象了。
线上经常出问题大家都是能理解的。bug肯定是有的。做服务的同僚应该都知道,不到维护的时间是不能停止服务区更新的除非是非常重大的bug。
这里面游戏服务器更为严格,因为你无故维护,维护一次可能就会流失一批玩家。所以这一直是一个梗。
本人经过三个星期的研究和测试,最终发现一个可以解决这种一出现bug,却能在线更新,且不影响性能的触发方式。
通过这样一个方式,主程序,加数据库,通过脚本实现逻辑模块;
这样就有一个脚本的实现形式,脚本如果实现的不好,那么性能消耗就很大了。
我的做法是把逻辑部分的方法抽象出来。放到脚本去实现。通过脚本把实现脚本逻辑代码在注册会逻辑模块。
这样的做法能保证我们有逻辑模块有bug的时候及时的修改逻辑,再次注册脚本已到达热更新效果。保证服务器运行的稳定性。
我们开始吧。
首先我要说一下我这里使用的是C#语言作为讲解。java也是一样的道理。
不在赘述,如果需要代码实现的可以留言!
这里可能牵涉到我之前的一些文章包含的类容,比如脚本加载器,日志模块,http监听模块。
我们先创建一个控制台项目叫TestApp
在新建一个类库项目 TestApp.Scripts
基本工作已经完成了。
接下来,我们在TestApp下面新建一个类IMainManager
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 8 /** 9 * 10 * @author 失足程序员 11 * @Blog http://www.cnblogs.com/ty408/ 12 * @mail 492794628@qq.com 13 * @phone 13882122019 14 * 15 */ 16 namespace TestApp 17 { 18 /// <summary> 19 /// 20 /// </summary> 21 public interface IMainManagerScript 22 { 23 24 void Test(); 25 26 } 27 } |
我们在TestApp下面新建一个类MainManager
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 8 /** 9 * 10 * @author 失足程序员 11 * @Blog http://www.cnblogs.com/ty408/ 12 * @mail 492794628@qq.com 13 * @phone 13882122019 14 * 15 */ 16 namespace TestApp 17 { 18 /// <summary> 19 /// 20 /// </summary> 21 public class MainManager : IMainManagerScript 22 { 23 24 public static MainManager instance = new MainManager(); 25 26 public static MainManager GetInstance() 27 { 28 return instance; 29 } 30 31 public IMainManagerScript IScript; 32 33 public void Test() 34 { 35 IScript.Test(); 36 } 37 38 } 39 } |
接下来我们在TestApp.Scripts 新建一个文件
1 using Net.Sz.Framework.Log; 2 using Net.Sz.Framework.Script; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 10 /** 11 * 12 * @author 失足程序员 13 * @Blog http://www.cnblogs.com/ty408/ 14 * @mail 492794628@qq.com 15 * @phone 13882122019 16 * 17 */ 18 namespace TestApp.Scripts 19 { 20 /// <summary> 21 /// 22 /// </summary> 23 public class MainManagerScript : BaseScript, IMainManagerScript 24 { 25 26 public void Test() 27 { 28 Logger.Info("我是test"); 29 } 30 31 public override void InitScript() 32 { 33 MainManager.GetInstance().IScript = this; 34 Logger.Info("MainManagerScripttest InitScript"); 35 } 36 37 } 38 } |