protobuf

Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

▼魔方 西西 提交于 2020-01-05 04:56:02
一  protobuf-net优化效果图   protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的源代码不支持Unity3D游戏在各个平台上的动态库构建。它是一个网络传输层协议,对应的lua版本有两个可用的库:一个是proto-gen-lua,由tolua作者开发,另外一个是protoc,由云风开发。protobuf-net在GC上有很大的问题,在一个高频率网络通讯的状态同步游戏中使用发现GC过高,所以对它进行了一次比较彻底的GC优化。下面是优化前后的对比图: protobuf-net优化前GC和性能效果图 protobuf-net优化后GC和性能效果图 二  Unity3D游戏GC优化概述   有关Unity3D垃圾回收的基本概念和优化策略Unity官网有发布过文章: Optimizing garbage collection in Unity games 。这篇文章讲述了Unity3D垃圾回收机制,和一些简单的优化策略,讨论的不是特别深入,但是广度基本上算是够了。我罗列一下这篇文章的一些要点,如果你对其中的一些点不太熟悉,建议仔细阅读下这篇文章:   1、C#变量分为两种类型:值类型和引用类型,值类型分配在栈区,引用类型分配在堆区,GC关注引用类型   2

google protobuf 中的proto文件编写规则

喜你入骨 提交于 2020-01-02 05:34:54
1. 简单介绍 protobuf文件:就是定义你要的消息(类似 Java 中的类)和消息中的各个字段及其数据类型(类似java类中的成员变量和他的数据类型) 2. Protobuf消息定义 消息由至少一个字段组合而成,类似于 C语言 中的结构。每个字段都有一定的格式。 字段格式:限定修饰符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤] 1)限定修饰符包含 required\optional\repeated Required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。 Optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。---因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。 Repeated:表示该字段可以包含[0

扩展名为的proto的文件

六眼飞鱼酱① 提交于 2020-01-02 05:34:10
扩展名为的proto的文件 1. 编写proto文件   首先需要一个proto文件,其中定义了我们程序中需要处理的结构化数据: // Filename: addressbook.proto syntax="proto2"; package addressbook; import "src/help.proto"; //举例用,编译时去掉 message Person { required string name = 1; required int32 id = 2; 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; } message AddressBook { repeated Person person_info = 1; } 2. 代码解释 // Filename: addressbook.proto 这一行是注释,语法类似于C++ syntax="proto2"; 表明使用protobuf的编译器版本为v2

转: Protobuf 的 proto3 与 proto2 的区别

断了今生、忘了曾经 提交于 2020-01-02 05:33:31
Protobuf 的 proto3 与 proto2 的区别 On 2015-07-17 19:16:00 By Soli Protobuf 的 proto3 与 proto2 的区别 这是一篇学习笔记。在粗略的看了 Protobuf 的文档 中关于 proto2 和 proto3 的说明后,记录下了几点 proto3 区别于 proto2 的地方。 总的来说,proto3 比 proto2 支持更多语言但 更简洁。去掉了一些复杂的语法和特性,更强调约定而弱化语法。如果是首次使用 Protobuf ,建议使用 proto3 。 在第一行非空白非注释行,必须写: syntax = "proto3"; 字段规则移除了 “required”,并把 “optional” 改名为 “singular”; 在 proto2 中 required 也是不推荐使用的。proto3 直接从语法层面上移除了 required 规则。其实可以做的更彻底,把所有字段规则描述都撤销,原来的 repeated 改为在类型或字段名后加一对中括号。这样是不是更简洁? 语言增加 Go、Ruby、JavaNano 支持; 移除了 default 选项; 在 proto2 中,可以使用 default 选项为某一字段指定默认值。在 proto3 中,字段的默认值只能根据字段类型由系统决定。也就是说,默认值全部是约定好的

Protobuf 了解一下

自古美人都是妖i 提交于 2019-12-30 16:24:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java开发成长手册, GitHub JavaEgg ,N线互联网开发必备技能兵器谱,欢迎star + 指导 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准 ,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化(将 数据结构或对象 转换成 二进制串 的过程 )。它很适合做 数据存储 或 RPC 数据交换 格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式 protocol buffers 诞生之初是为了解决服务器端新旧协议(高低版本)兼容性问题,名字也很体贴,“协议缓冲区”。只不过后期慢慢发展成用于传输数据。 笔者所在的360广告投放,N亿条商品信息的数据全部采用PB格式存储、传输。 Protobuf 的优点 更小——序列化后,数据大小可缩小约3倍 更快——序列化速度更快,比xml和JSON快20-100倍,体积缩小后,传输时,带宽也会优化 更简单——proto编译器,自动进行序列化和反序列化 维护成本低——跨平台、跨语言,多平台仅需要维护一套对象协议(.proto) 可扩展——“向后”兼容性好,不必破坏已部署的、依靠“老”数据格式的程序就可以对数据结构进行升级 加密性好—

Google Protobuf简明教程

大城市里の小女人 提交于 2019-12-30 01:10:58
jQuery append() 方法中可以直接添加字符,如:$("p").append(" <b>Hello world!</b>"); 怎么用js实现呢: appendHTML: HTMLElement.prototype.appendHTML = function(html) { var divTemp = document.createElement("div"), nodes = null // 文档片段,一次性append,提高性能 , fragment = document.createDocumentFragment(); divTemp.innerHTML = html; nodes = divTemp.childNodes; for (var i=0, length=nodes.length; i<length; i+=1) { fragment.appendChild(nodes[i].cloneNode(true)); } this.appendChild(fragment); // 据说下面这样子世界会更清净 nodes = null; fragment = null; }; prependHTML: var prependHTML = function(el, html) { var divTemp = document.createElement(

9.5 Go 依赖管理

我是研究僧i 提交于 2019-12-28 01:27:00
9.5 Go 依赖管理 godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息。 A. 所有的第三方包都放在$GOPATH的src目录下。 B. 如果不同程序依赖的版本不一样,怎么管理 C. 每个程序依赖的包,没有版本号的概念。 godep安装 a. 安装方法: go get github.com/tools/godep b. 输入godep 命令,出现帮助信息 成功安装后,在$GOPATH的bin目录下会有一个godep可执行的二进制文件,后面执行的命令都是用这个,建议这个目录加入到全局环境变量中。 1.2. godep用法 1.寻找一个使用第三方包的项目,go标准包不需要管理,默认向下兼容 如路径 ./src/gostudy/gobook/protobuf 进入protobuf项目 执行命令 godep save 会生成Godeps和vendor文件夹,包含了项目第三方包的版本信息,以及项目依赖的第三方包都放入了vender包了 如Godeps文件夹,内有Godeps.json文件 { "ImportPath": "gostudy/gobook/protobuf", "GoVersion": "go1.10", "GodepVersion": "v80", "Deps": [ { "ImportPath": "github.com/golang

Protobuf简介

爷,独闯天下 提交于 2019-12-27 09:21:57
简明扼要的说,protobuf是一种对结构化数据的序列化格式(形如JSON、XML),用于在数据通信、数据存储之中。protobuf是由Google设计开发,与开发平台及开发语言均无关。其特点在于灵活高效,序列化后的数据简单、轻便,序列化/反序列化过程耗时更短。 在使用Protobuf时,需要将待序列化的结构类型在“.proto“文件中进行标注声明。一个protocol buffer消息,包含有若干个key-value对。在一个消息内,每一个字段都包含有它的名字和它的数据类型。数据类型可以是数字、布尔型、字符串、比特串,甚至是其他的protocol buffer消息类型。对声明的消息字段,可以特别的声明该字段是可选字段(optional)还是必填字段(required)还是可重复字段(repeated)。以下是一个.proto文件的样例: message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [

tensorflow c/c++库使用方法

本秂侑毒 提交于 2019-12-26 19:51:27
tensorflow目前支持最好的语言还是python,但大部分服务都用C++ or Java开发,一般采用动态链接库(.so)方式调用算法,因此tensorflow的c/c++ API还是有必要熟悉下,而且经过本人测试,相同算法,c接口相比python速度更快。 下面讲解如何让程序调用tensorflow c/c++库 1.编译库 先在github上下载tensorflow源码,执行./configure先配置项目,然后按照 这篇 博客里写的利用bazel编译动态链接库,编译命令如下 C版本: bazel build :libtensorflow.so C++版本: bazel build :libtensorflow_cc .so 编译成功后,在bazel-bin/tensorflow/目录下会出现 libtensorflow.so/ libtensorflow_cc.so文件 2.其他依赖 在使用tensorflow c/c++接口时,会有很多头文件依赖、protobuf版本依赖等问题 (1 )tensorflow/contrib/makefile 目录下,找到build_all_xxx.sh 文件并执行,例如准备在linux 上使用,就执行build_all_linux.sh 文件,成功后会出现一个gen文件夹 (2 )把tensorflow 和bazel-genfiles

<微服务架构>—gRPC篇

▼魔方 西西 提交于 2019-12-26 16:38:00
简介 gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等 gRPC 默认使用 protocol buffers,这是 Google 开源的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。 安装 官方参考文档 gRPC 的安装: $ pip install grpcio 安装 ProtoBuf 相关的 python 依赖库: $ pip install protobuf 安装 python grpc 的 protobuf 编译工具: $ pip install grpcio-tools 实践 定义一个消息类型 先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果