今天是双11,这个想不吐槽都不行,商家不会卖错。只有买家会买错。
来说说正题,自从前年年底加入游戏公司后,也算半个游戏开发者了,为何说半个,个人只负责后端开发没有前段效果,所以算半个。这里呢,只是忽然觉得许久没有整理思绪了。借CSDN整理下,(PS:其实是起太早没事干,本系列爱写则写,也许这辈子没有所谓的-2,也就是这名字坑爹游戏开发系列的来头。也许。。这篇都懒得写完,谁知道呢。。)
公司是个Flash页游开发,不算什么正儿八经的大公司,没有太多的条条框框,所以所有的玩意都可以随心所欲的开发,只要你能说服上级领导。比如想用什么新技术,什么新想法,只要你敢出方案,并且准备好一套演示。接着你就可以努力说服上级。接着就是你的showtime,不过,当没有人可以监督你时,并且你对项目的控制力度不够的话,多半要把项目进度坑掉。
前面这段估计看着比较无聊,写着也比较扯蛋,来切入正题吧。
先介绍下这边自主开发的服务端引擎特性:
1.C#开发,支持TCP/HTTP协议(自主应用层协议)
2.OOP思想,(所有对象都得跟着这个走)
3.自主同步协议
4.延迟保存
5.异步数据同步
结构类似:
SC<->SM->->M->C->V
| |
--------------------<------------------
服务器控制器-》控制模型=》同步到=》客户端模型
客户端控制器-》监听模型变化-》控制UI显示
那么前段命令如何操作?
V《-》SC
客户端界面-》发送命令到服务端控制器(直接发送?)
对的,类似一个单向通道的异步模型。
SC的返回,仅限于当前命令的状态。(比如UI loading,等待之类的控制)
简单的描述,就是服务端 建立一个根对象,比如一个东西叫场景,然后下面有个List<玩家> 代码类似这样:( 现敲伪代码,仅为示例)
public class GameWorld
{
public List<Player> Players{get;set;}
}
服务端初始化后执行:
var gw = new GameWorld();//新建一个游戏世界
MyEngine.SetMaster(gw);//设置当前对象可同步
Host.OpenChannel(Channel.Tcp);//开启同步通道
客户端,建立一个相同的类,(目前客户端用Flash实现,我们通过一个同步工具,自动生成Flash类),不会写flash,这边也拿C# 伪代码示例:
var gw=new GameWorld();//new一个根对象
var channel= Remote.OpenChannel(Channel.Tcp);//设置同步通道
channel.SetCopy(gw);//同步当前数据
( 这尼玛有个蛋用,楼下砸鸡蛋了。。。淡定淡定。。咱继续)
首先我们有了一个场景,然后我们有了一个玩家列表,然后我们就简单设计个小场景:
服务端,每10秒钟,增加一个Player对象,Player 会定义一个Name,并且会说一句话。
public class Player
{
public string Name{get;set;}
public string Message{get;set;}
}
然后在服务端建立一个Timer,里面Loop写着
int _index = 0;
public void Loop()
{
_index++;
var player=new Player(){
Name="玩家" + _index,
Messange="说了话"+ _index
};
gw.Players.Add(player);
player.Message+="New";
}
客户端则发现玩家增加时,打印一行:玩家xxx加入了游戏,消息xxxx!;
发现玩家修改了消息时,打印一行:玩家xxx修改了消息xxxx;
有点类似MVVM的味道么?//List自定义继承过,会发出 ADD,REMOVE事件 (sender = 增加的子对象) gw.Player.PropertyChaged+=(sender,e){ if(e=='ADD') { Console.WriteLine("玩家{0}进入了游戏,消息{1}",(sender as Player).Name,(sender as Player).Message); (sender as Plalyer).PropertyChaged+=(senderx,ex){ if(ex.Name=="Message") { Console.WriteLine("玩家{0}修改了消息{0}",(senderx as Player).Message); } } } else Console.WriteLine("玩家{0}离开了游戏,消息{1}",(sender as Player).Name,(sender as Player).Message); };
优点:
1.没有了一圈xx命令的定义和xxx消息的定义,没有所谓的send和rev。
2.完整的抽取了应用业务层
3.非常简单的框架,无侵入,没有太多的限制。
4.理论上可以拿单机开发,再改成C/S模式非常简单。
5.开发迅速
缺点:
1.采用通用协议,可能流量较大
2.必须提前约定对象结构,不然修改起来很蛋疼
3.刚开始可能不是很习惯
最后:
居然写完了,不知道有没人看。欢迎拍砖。
也许。。会将我们的线上游戏作为一个例子进行设计讲解。比较简单的消息。
也许。。就没有下文了。。