Unity手游之路<二>Java版服务端使用protostuff简化protobuf开发
http://blog.csdn.net/janeky/article/details/17151465
开发一款网络游戏,首先要考虑的是客户端服务端之间用何种编码格式进行通信。之前我们介绍了Unity游戏前端使用protobuf的方法。今天我们来谈谈服务端如何使protobuf。游戏服务端语言百花齐放,除了比较传统的c/c++外,Java,Erlang,Python都有很多团队在使用。
今天推荐一下Java作为服务端开发语言。国内很多出色的页游和手游都是采用Java作为服务端语言的。比如《神曲》《秦美人》《龙将》《时空猎人》
等,不一而足。
本文主要探讨如何简化Protobuf程序的开发。
- 传统方式
按照传统的开发流程,都是如下:
1.先编写proto文件格式,例如
- message Person {
- required int32 id = 1;
- required string name = 2;
- optional string email = 3;
- }
2.运行编译程序,生成实体类Person.java
protoc --java_out=./src ./person.proto
3.在程序中可以直接使用Person类的相关函数进行序列化和反序列化
- //序列化
- Person person = builder.build();
- byte[] buf = person.toByteArray();
- //反序列化
- Person person2 = PersonProbuf.Person.parseFrom(buf);
上面的流程看似很方便了,有什么问题呢?还能不能再改进呢?我们先看看生成的Person类代码吧,竟然有几千行。
实际上我们只是包含了3个变量而已,可读性大大降低了。其次,开发过程每次都得借助外部的编译工具来生成代码。
于是我们可能就有了一个简单的思路。自己编写Person的类,然后通过外部的api,直接对这个类进行序列化和反序列化。
直接抛弃了protoc工具。
这个思路,已经有人实现出来了,最早是在c#语言版本的protobuf-net实现了。它利用c#的Attribute(类似Java的Annotation注解)+反射来实现普通实体类的Protobuf序列化和
反序列化。
本想自己把protobuf-net的c#代码转换成Java代码。后来在OverStack中翻到有人介绍Protostuff,正是基于这种思路的。
- 改进版
1.编写Person类(为了使demo代码精简,字段都暂时设为public)
- public class Person{
- public int id;
- public String name;
- public String email;
- }
2.测试序列化和反序列化
- public static void main(String[] args) throws IOException {
- // //类的模式设置为Person类
- Schema<Person> schema = RuntimeSchema.getSchema(Person.class);
- Person person1 = new Person();
- person1.id = 10086;
- person1.name = "ken";
- person1.email = "ken@iamcoding.com";
- // 缓存buff
- LinkedBuffer buffer = LinkedBuffer.allocate(1024);
- // 序列化成protobuf的二进制数据
- byte[] data = ProtobufIOUtil.toByteArray(person1, schema, buffer);
- // 反序列化
- Person person2 = new Person();
- ProtobufIOUtil.mergeFrom(data, person2, schema);
- System.out.println(person2.id);
- }
更多的功能可以去详细阅读相关的手册吧。比如,指定实体类字段的序列化顺序,忽略某些字段不被序列化等等。
- 性能考虑
一开始,考虑到Protostuff的这种反射,会不会比官方推荐的反射性能差很远呢?没有调查,就没有发言权。有人已经测试了,性能方面还是差不多的,可以放心使用。
具体的测试数据可以去查阅网上相关的数据,在此省略了。
- 总结
Protostuff的优势是将开发流程简化,让我们可以更高效,更专注地开发。有任何问题欢迎一起探讨ken@iamcoding.com
下一篇,我将会用一个完整的demo,将整个Unity客户端和服务端的通信流程串联起来。
Unity手游之路<二>Java版服务端使用protostuff简化protobuf开发的更多相关文章
- Unity手游之路<七>角色控制器
Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...
- Unity手游之路<十二>手游资源热更新策略探讨
http://blog.csdn.net/janeky/article/details/17666409 上一次我们学习了如何将资源进行打包.这次就可以用上场了,我们来探讨一下手游资源的增量更新策略. ...
- [转]Unity手游之路<十二>手游资源热更新策略探讨
最近梳理了下游戏流程.恩,本来想写下,但是,还是看前辈的吧 版权声明: https://blog.csdn.net/janeky/article/details/17666409 上一次我们学习了如何 ...
- 【学习】Unity手游之路<十二>手游资源热更新策略探讨
http://blog.csdn.net/janeky/article/details/17666409 =============================================== ...
- Unity手游之路<三> 基于Unity+Java的聊天室源码
http://blog.csdn.net/janeky/article/details/17233199 项目介绍 这是一个简单的Unity项目,实现最基本的聊天室群聊功能.登录聊天室后,用户可以输入 ...
- Unity手游之路<十三>手游代码更新策略探讨
http://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙,加上家里事情也多,所以blog更新一直搁置了.最近在项目开发上线过程中 ...
- Unity手游之路<六>游戏摇杆之Easy Touch 3教程
之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...
- Unity手游之路手游代码更新策略探讨
版权声明: https://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙.加上家里事情也多,所以blog更新一直搁置了. 近期在项 ...
- Unity手游之路游戏摇杆之Easy Touch 3教程
之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...
随机推荐
- zabbix 3.0快速安装简介(centos 7)
zabbix快速安装 系统版本:centos 7 通过yum方法安装Zabbix3.0,安装源为阿里云 yum源配置 rpm -ivh http://mirrors.aliyun.com/zabbix ...
- Yocto开发笔记之《嵌入式linux libcurl编程》(QQ交流群:519230208)
开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处. QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 =============================== ...
- Tomcat 的 ErrorPage 实现原理分析
使用Tomcat,一定见到过404,500的时候,见到过Tomcat提供的错误页面,例如请求的资源找不到的时候,响应状态码为404,这个时候的错误页面是这样的: 这些错误页面是 如何生成及定位展示的 ...
- 9月14日JavaScript循环语句作业解析
1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米 解法一: var gd = 8848; var cs = 0; while(true) { cs++; gd = gd ...
- JavaWeb学习笔记——XML解析
DOM解析操作 只在跟节点<addresslist>下面建立一个子节点<name> <?xml version="1.0" encoding=&quo ...
- hdu 1318 Palindromes
Palindromes Time Limit:3000MS Memory Limit:0KB 64bit ...
- Podfile升级后的影响
之前项目里用的Podfile都是版本 0.39 后面有一天电脑格盘重装以后cocoapods装的版本是 1.0.0.beta.6 那么问题来了,在下载或者clone一下项目后,经常是需要自己安装第三方 ...
- ubuntu qq
系统:Ubuntu 14.04 64位 1.下载qq国际版(直接网络搜索就可以) 2.解压并安装: # cp wine-qqintl.zip /usr/local/ # pwd/usr/local/ ...
- MySQL 视图的基础操作(五)
1.为什么使用视图: 为了提高复杂SQL语句的复用性和表操作的安全性(例如:工资字段不想展示给所有能查看该查询结果的人),MySQL提供了视图特性.所谓视图,本质上是一种虚拟表,其内容与真实的 ...
- mysql主从数据库不同步的2种解决方法(转)
今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master status; ...