散乱知识汇集【工作日记05】

Stark

(权游Stark家族图徽)

下面的内容是,我最近几个月工作遇到的零散的技术和知识点的汇聚,定期整理归类繁杂的知识,有利于形成知识的结构化。

目录:

  • git相关
  • protobuf协议
  • make构建

git相关

git子模块

允许git仓库做为另一个git仓库的子目录,同时保持自己的独立提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 添加子模块,同时会创建.gitmodules保存仓库子模块的映射信息
git submodule add [url]

# clone含有子模块的项目后拉取子模块代码
git clone [url]
git submodule init
git submodule update
# 加入--recursive 同等于上面
git clone --recursive [url]

# 在子模块上更新代码
git fetch
git merge origin/master
# 在主项目中执行下面命令同等于上面操作,缺少[submodule name]默认更新所有子模块
git submodule update --remote [submodule name]

# 在主项目看到子模块的提交日志
git log -p --submodule

git子模块:https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97
业界文档:https://juejin.im/post/5addeb48518825672a028a3b

git-diff命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 显示更改文件数
git diff COMMIT COMMIT --shortstat
#显示更改的文件名
--name-status

# 筛选文件
# 合并后对比一些特定文件的情况下,这条命令尤为重要,后买可以接对多个文件名,用vscode的diff插件还要一个一个文件检查
# 假如合并文件有几百个,工作量是艰巨的,可以写个shell脚本处理对比结果,写进txt文件
# 我最近就有个这样的需求,幸好有这条命令
git diff COMMIT COMMIT *.lua *.js


# 筛选具体目录下的目标文件,注意path从当前目录起始
git diff COMMIT COMMIT path/to/target

# 版本信息
git show COMMIT

protobuf协议

游戏中的数据通讯协议主要是Protobuf+socket,只有登录时拿到ID和session或token用到了http协议。对于数据响应要求高、低延迟甚至实时的应用程序,像游戏、直播、即时聊天,一般都会用到protobuf作为数据结构化和序列化的协议。

定义

Protobuf全称Protocol Buffer,是google内部广泛使用的结构化数据存储、数据序列化的协议。下面是google官方给出的定义:
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

优势

首先从定义上,可以看到一个描述protobuf的关键字:方便高效。

  • proobuf的语法比xml简洁方便

拿常见的数据序列化协议Json,xml与protobuf做对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.proto
package lm;
message helloworld
{
required int32 id = 1; // ID
required string str = 2; // str
}

.xml
<?xml version="1.0" encoding="UTF-8"?>
<helloword>
<id>1</id>
<str>helloworld</str>
</note>

  • protobuf是二进制协议,比同为文本协议的json和xml的读写操作都要高效,快捷。
    文本协议要读进内存,会被解析成二进制,而pb属于二进制协议,所以相对文本协议解析速度更快。

官方针对protobuf的性能将其更各种数据协议做了测试比较,下图是通过各个协议对一个对象操作的时间–Total time,包括创建对象、将对象序列化为内存中的字节序列,然后再反序列化的过程。

image

protobuf性能测试报告:https://code.google.com/archive/p/thrift-protobuf-compare/wikis/Benchmarking.wiki

  • protobuf协议更小

各协议的字节码大小对比:
image

  • protobuf与平台无关,与语言无关,所以兼容性更好

java中使用json和xml数据结构,使用使用相应的包支持的,jackson(java的标准json库)和javolution xmlformat(javolution库中格式化xml的API)。
而protobuf可以通过编译器将描述数据结构的.proto文件编译成各种目标语言,github仓库上标有目标语言有:c++、java、c#、JavaScript、Ruby、Go、PHP、Dart、Objective-C。

https://github.com/protocolbuffers/protobuf

make构建

make是一个常用的构建工具,多用于C语言项目,但在一些大型的项目中使用频率也比较高。

假如一个工程里有个makefile文件,往往都需要用到make命令来构建。

详细介绍:

http://www.ruanyifeng.com/blog/2015/02/make.html

如何用make来构建node.js项目

http://www.ruanyifeng.com/blog/2015/03/build-website-with-make.html

windows下使用make命令安装教程

下载MinGW:http://sourceforge.net/projects/mingw/files/latest/download?source=files

下载后假如没在bin下找make.exe,可以到MinGW instanllation manager中找到下载MinGW-make.exe,勾选包然后到左上角点击apply change下载(记得把MinGW-make改名成make)。最好把basic setup都下了。

最后记得手动添加环境变量:path/to/MinGW/bin,就可以使用了。