网站基础建设和维护网店推广方法有哪些
最近想自己开发个在线多人的小游戏,看能不能开拓下职业生涯,顺便赚点外快。目标是多人在线手游,现阶段只做安卓端,不考虑苹果(主要是没苹果。。。而且苹果开发成本高,先忽略)。采用unity3d、protobuf、c++作为开发技术。使用unity3d主要是目前移动端开发基本都倾向于这个。protobuf主要是考虑数据传输量以及数据编解码。c++作为后端是个人开发习惯,因为我是从事c++开发的,比较顺手。
在移动游戏领域,因为国内版权号限制,所以只考虑海外,海外选定谷歌游戏市场。
游戏内容方面,想做个类似于多人贪吃蛇的游戏,这种题材很多,市场上有很多APP。就不做描述,只是在多人贪吃蛇的基础上融合其他游戏类型,然后做成3D。游戏框架方面,移动端不用考虑。服务端采用网关+大厅+房间模式,示意图如下:
移动端先从网关获取大厅(服务器)列表,然后选择合适的大厅,连接大厅进行交互,交互完成后,大厅会推送合适的房间给移动端,移动端连接房间进行在线游戏。网关和大厅因为交互数据不多,所以选择普通的云服务器就可以了,房间因为需要实时与多个移动端交互数据,所以对带宽的要求比较高。目前先在国内开发调试,所以网关和大厅选择放在2C4G3M的云服务器上,房间选择部署在轻量应用服务器。
多人在线游戏服务端难点主要在房间数据交互同步上,这里做一些假定,因为我是做小手游,所以认为移动端是不会作弊的,只是存在网络延迟问题;数据采用状态同步,每隔一定时间,例如50ms,就交互一次数据。移动端把自己的状态数据发送给房间,房间把收集到的所有状态数据发送给各个移动端,移动端收到房间返回的所有状态数据后,就将数据放到各个物体的历史状态数据里,这里每状态同步一次,就将同步序号+1,所以物体的历史状态数据里是有同步序号的,移动端根据物体的历史状态数据,预测下一个同步周期点上该物体应该到达的状态(位置、姿态)。
上图中,一个方框表示一个同步周期,黑色实心箭头表示移动端上传状态数据,绿色虚线箭头表示服务端下传所有状态数据到移动端。游戏开始时,由于网络和手机性能的原因,不同移动端的开始时间点是不一样的。在网络条件和性能好的情况下,在移动端0和移动端1的第1帧开始时,会将各自的状态数据上传给服务端,在服务端的第1帧内收到了移动端0和移动端1的数据,然后服务端在第2帧的开始,将汇总的数据分发给移动端0和移动端1,移动端0和移动端1在第1帧内收到数据,然后根据历史状态数据,预测各个物体在第2帧开始时的状态,线性插值实现。在网络不好的情况下,移动端0在第2帧开始时上传状态数据,服务端在第3帧内收到,然后在第4帧开始时将状态分发给移动端1,移动端1在第4帧内收到移动端0的状态数据,根据历史状态数据,预测移动端0的物体应到的状态并线性插值实现。
移动端内发生物体交互时,先不实现,而是将交互事件上报给服务端,服务端在一定时间内如果收到两个或两个以上的相同事件,就认为是真实发生的,分发对应的确认消息给各个移动端。这里不采用先实现后确认或回滚的方式,是因为这种模式过于复杂。