游戏开发准备(三)--传输协议

google 的 protobuf 是最近非常火的将结构对象进行序列化及反序列化的工具,据google称,已经应用在了google非常多的内部项目上。

1、下载protobuf,protoc:

https://code.google.com/p/protobuf/downloads/detail?name=protobuf-2.4.1.tar.bz2&can=2&q=

https://code.google.com/p/protobuf/downloads/detail?name=protoc-2.4.1-win32.zip&can=2&q=

2、下载下来的protoc放在 protobuf/java/src目录下

3、在protobuf/java目录下修改pom.xml(仅windows下需要修改)

<exec executable=”../src/protoc”>

修改为:

<exec executable=”src\protoc.exe”>

4、执行:

mvn test

mvn install 安装至 maven repository

mvn package 可以打包成jar包,供单独使用

mvn install -P lite 生成lite版本,lite缺少描述及反射功能,但在手机平台上推荐使用

这里我也打包了jar包,用来学习时使用。

5、在eclipse中创建java工程,来学习一下protobuf的使用

建立addressbook.proto

option java_package = “com.example.tutorial”;

message Person {
required string name = 1;
required int32 id = 2;        // Unique ID number for this person.
optional string email = 3;

enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}

message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}

repeated PhoneNumber phone = 4;
}

// Our address book file is just one of these.
message AddressBook {
repeated Person person = 1;
}

执行:

protoc addressbook –java-out=.

使用方式:

Person p = Person.newBuilder().setName(“hello world”).setId(111)
.build();
System.out.println(p.toByteArray().length);

toByteArray()进行序列化,parseFrom()进行反序列化。

下面在maven中集成:

添加plugin:

<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<mkdir dir=”target/generated-sources” />
<exec executable=”protoc”>
<arg
value=”–java_out=target/generated-sources” />
<arg
value=”src/main/protobuf/test.proto” />
</exec>
</tasks>
<sourceRoot>
target/generated-sources
</sourceRoot>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>

添加dependency:

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.4.1</version>
</dependency>

里面有一个反射机制,需要查一下能起到什么作用

optimize_for 这个选项需要关注一下,如果开发手机网游,这个选项会有大用处。

option optimize_for = SPEED; // 默认

CODE_SIZE

LITE_RUNTIME //手机网游推荐使用这种

另外,需要检查一下protobuf的压缩。测试了一下,字符串好像并未压缩。

从smartfox上查找一下他们用的压缩工具,继续测试一下。

决定使用snappy算法。

https://github.com/dain/snappy

各种压缩算法在java平台上的测试结果。

实际测试后压缩效果不尽如人意,使用了deflate和snappy压缩算法,分别测试了小于20字节和120字节的压缩,只能压缩不到20%,初始怀疑protobuf的二进制已经充分优化过了,如果是这样的话,再消耗cpu进行压缩就没有必要了。但是也不排除测试的样本太少。可以等正式上线后,再回头进行压缩的测试。对了,snappy必须在jdk7下运行,因为用了到sun的非公开函数,所以需要注意一下是目标环境是否支持。

使用protobuf还有一个好处,可以避免使用java反射机制带来的效率降低。

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>