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手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才 ...
随机推荐
- Redis学习-开始
C:\Program Files\Redis\redis-cli.exe 使用servicestack.redis class Program { static void Main(string[] ...
- 以sysdba身份登录oracle报ORA-1031权限不足错误之完美分析
在linux 操作系统的数据库服务器上,使用”sqlplus / as sysdba” 登录Oracle 10.2 数据库实例时,登录失败,显示ORA-01031: 权限不足. 在数据库所在服务器上 ...
- vim 显示颜色脚本
vim 显示颜色脚本 echo TERM=xterm >>/root/.bash_profile echo export TERM >>/root/.bash_profile ...
- Java——URLEncoder和URLDecoder
import java.net.URLDecoder; import java.net.URLEncoder; //========================================== ...
- SortedSet接口
TreeSet中实现了SortedSet接口,此接口主要用于排序操作,即实现此接口的子类都属于排序的子类. import java.util.Set; import java.util.SortedS ...
- Nginx+PHP-fpm高负载优化及压力测试方法
Nginx+PHP-fpm组合,以内存占用小,负载能力强壮的特点,成为小内存VPS建站的首选组合.我们一起来探讨一下nginx+php-fpm高负载的优化方法. 先来看看nginx配置参数的优化.ng ...
- CodeForces - 699B One Bomb
题目地址:http://codeforces.com/contest/699/problem/B 题目大意: 一个矩阵,内容由‘.’和‘*’组成(‘.’ 空,‘*’ 代表墙),墙分布在不同位置,现找出 ...
- css3 中的transition和transform
我以前始终都把他搞反,或者是混淆.现在可以稍微小结下. Transition:CSS3中处理动画的一个样式:只涉及动画起始和终止两个状态.如果涉及到一个动画的各个时间或者状态,那就必须要用到的另外一个 ...
- My VA Snippet
My VA snippet Visual Assist X 是一款比较好用的编码辅助工具, 这款工具可以大大提高程序员的编码速度和开发效率.同时在它的指引下可以有效避免低级Bug. 真正实现快速编码, ...
- python版本升级及pip部署方法
Python版本升级 CentOS 6.3自带的Python版本为2.6,首先需要升级到2.7版本.由于旧版本的Python已被深度依赖,所以不能卸载原有的Python,只能全新安装. 1.下载Pyt ...