FlatBuffers是一款序列化庫,您可以在開發游戲或者上開發其他軟件的時候使用這款軟件提升數據訪問效率,軟件主要的優勢就是在不解析/解包的情況下訪問序列化數據,讓數據讀取更加快速,對于需要讀取龐大數據資源的游戲來說非常有幫助,軟件支持很多語言編輯,可以將其部署到任意平臺開發,您可以為自己的軟件附加序列化數據讀取功能,解決數據讀取效率慢的問題,軟件可以使用的場景非常多,例如開源移動游戲引擎Cocos2d-x使用它來序列化所有游戲數據,例如通訊軟件、網站平臺可以通過這款軟件提升數據讀取效率,提升加載網站帖子的速度!
FlatBuffers軟件功能
1、在不解析/解包的情況下訪問序列化數據
FlatBuffers與眾不同之處在于,它在平坦的二進制緩沖區中表示層次結構數據,使得即使不進行解析/解包也可以直接訪問分層數據,同時還支持數據結構的演進(forward /向后兼容)。
2、內存效率和速度
訪問數據所需的唯一內存是緩沖區的內存。它需要0個額外的分配(在C ++中,其他語言可能會有所不同)。FlatBuffers也非常適合與mmap(或流)一起使用,僅要求將部分緩沖區存儲在內存中。訪問僅通過一個額外的間接調用(一種vtable)即可接近原始結構訪問的速度,以允許格式演變和可選字段。它針對那些不希望花費時間和空間(許多內存分配)來訪問或構造序列化數據的項目,例如在游戲或任何其他對能敏感的應用程序中。
3、靈活
可選字段不僅意味著您具有很好的前后兼容(對于長壽命游戲也越來越重要:不必使用每個新版本更新所有數據!)。這也意味著您在寫入哪些數據,不寫入哪些數據以及如何設計數據結構方面有很多選擇。
4、微小的代碼占用空間
生成的代碼量很少,只有一個小的標頭作為最小的依賴項,非常易于集成。同樣,請參閱基準測試部分以了解詳細。
5、強類型
錯誤發生在編譯時,而不是手動編寫重復且容易出錯的運行時。可以為您生成有用的代碼。
6、使用方便
生成的C ++代碼允許簡潔的訪問和構造代碼。是可選功能,可以在需要時在運行時高效地解析模式和類似ON的文本表示形式(比其他ON解析器更快,更高效地使用內存)。
Java,Kotlin和Go代碼支持對象重用。C#具有高效的基于結構的訪問器。
7、無需依賴項的跨平臺代碼
C ++代碼可與任何最新的gcc / clang和VS2010一起使用。隨附用于測試和示例的構建文件(Andid .mk文件,以及用于所有其他平臺的cmake)。
FlatBuffers軟件特色
FlatBuffers是跨平臺序列化庫,旨在最大程度地提高內存效率。它使您可以直接訪問序列化的數據,而無需先解析/拆包,同時仍具有很好的前向/向后兼容。
支持的編程語言
C++
C#
C
Dart
Go
Java
JavaScpt
Lobster
Lua
PHP
Python
Rust
TypeScpt
FlatBuffers教程
在C中使用
C語言綁定存在于名為FlatCC的單獨項目中。
該flatcc?模式編譯器可以通過一個C庫在線生成代碼下線為好。它還可以生成緩沖區驗證器和快速ON解析器,打印機。
已經采取了非常謹慎的措施來確保與主要flatc項目的兼容。
支持平臺
Ubuntu(clang / gcc,ninja / gnu make)
OS-X(c語/ gcc,忍者/ gnu make)
Windows MSVC 2010、2013、2015年
CI在OS-X,Ubuntu和Windows上構建gcc,clang和MSVC的最新版本,并偶爾編譯較舊的編譯器版本。請參閱主要項目狀態。
包括Centos在內的其他平臺也可能工作良好,但未經過定期測試。
Monster示例項目是專門為C99編寫的,以遵循C ++版本,因此,該示例項目不適用于MSVC 2010。
模塊化對象創建
在本教程中,我們使用了調用Monster__as_ot來創建根緩沖區對象,因為在簡單的用例中,這更容易。有時我們需要更多的模塊化,因此我們可以重復使用函數以相同的方式創建嵌套表和根表。為此,我們需要flatcc_builder_buffer__call。最好將flatcc_builder呼叫隔離在最高驅動程序級別,這樣我們得到:
在自頂向下方法中,start/endvs適用相同的原理start/end_as_ot。
自上而下的例子
本教程使用自下而上的方法。在C語言中,通過開始和結束彼此嵌套的對象,也可以使用自頂向下的方法。在本教程中,沒有深層嵌套,因此差異是有限的,但是它說明了這一點:
基本思考
C-API確實支持通過從reflection.fbs架構生成的代碼讀取二進制架構(.bfbs)文件,示例用法說明了如何使用此文件。反模式文件是在運行時分發中預先生成的。
變異與反思
C-API不像C ++一樣支持變異反,閱讀器接口也不支持變異標量(而且即使在驗證之后,這樣做也是不安全的)。
生成的讀取器接口在將向量強制轉換為變異類型后支持就地排序向量,因為在構建緩沖區時這樣做并不實際。構建器文檔中對此進行了介紹。
反示例利用此功能按名稱查找對象。
可以使用現有緩沖區中的復雜對象作為源來構建新緩沖區。由于直接復制語義而無需字節序轉換或臨時堆棧分配,因此這可能非常有效。
標量,結構和字符串以及它們的向量都可以用作源。
當前不可能使用現有的表或表的向量作為源,但是有可能在某個時候添加對此的支持。
命名空間
FLATBUFFERS_WRAP_NAMESPACE當每個函數都有一個很長的名稱空間前綴時,本教程中使用的方法很方便。但這并不總是最好的方法。如果名稱空間不存在,或者簡單而內容豐富,那么我們不妨直接使用前綴。上面提到的反示例使用此方法。
現有成員
并非所有語言都支持對是否存在字段的測試,但是在C語言中,我們可以通過測試詳細說明本教程的閱讀器部分。記得將mana其設置為默認值150,因此不應存在。
添加工會的替代方法
在本教程中,我們使用了一個調用來添加聯合。在這里,我們展示了完成同一件事的不同方法。最后一種形式很少使用,但這是底層的實現方式。通過在不同時間點添加類型和數據,可以將表中的小值分組在一起。
為什么不與 flatc 工具集成?
考慮了如何將C代碼生成器集成到flatc工具中,但是它要么要求刪除模式編譯器的C實現,否則將導致過多的代碼重復,或者必須使用復雜的中間表示形式。發明的。這兩種選擇都不是很吸引人,使用flatcc工具代替使用flatcFlatBuffers C運行時庫也沒什么大不了的。
編寫模式
模式語言(又名IDL,接口定義語言)的語法對于任何C語言族的用戶和其他IDL的用戶都應該非常熟悉。讓我們先來看一個例子:
表
表是在FlatBuffers中定義對象的主要方式,由名稱(此處為Monster)和字段列表組成。每個字段都有一個名稱,類型和可選的默認值。如果未在架構中指定默認值,則它將0用于標量類型或null其他類型。某些語言支持將標量默認設置設置為null。這使得標量是可選的。
字段不必出現在導線表示中,并且可以在構造對象時選擇忽略字段。您可以靈活地添加字段,而不必擔心數據膨脹。此設計也是FlatBuffer的向前和向后兼容的機制。注意:
您只能在表定義的末尾在架構中添加新字段。較舊的數據仍將正確讀取,并在讀取時為您提供默認值。較舊的代碼將僅忽略新字段。如果要靈活地對架構中的字段使用任何順序,可以手動分配ID(與協議緩沖區類似),請參見id下面的屬。
您無法從架構中刪除不再使用的字段,但是您可以停止將它們寫入數據中以達到幾乎相同的效果。另外,您可以像deprecated上面的示例中那樣標記它們,這將防止在生成的C ++中生成訪問器,作為強制不再使用該字段的方法。(注意:這可能會代碼!)。
您可以更改字段名稱和表名稱,如果可以的話,可以使用代碼中斷功能,直到您也將其重命名為止。
結構
類似于表,僅現在所有字段都不是可選的(因此也沒有默認值),并且可能不會添加或棄用字段。結構只能包含標量或其他結構。將其用于簡單的對象,這些對象您可以確定不會進行任何更改(在示例中非常清楚Vec3)。結構使用的內存少于表,并且訪問速度甚至更快(它們始終以內聯方式存儲在其父對象中,并且不使用虛擬表)。
種類
內置標量類型為
8位:byte( int8),ubyte(uint8),bool16位:short(int16),ushort(uint16)
32位:int(int32),uint(uint32),float(float32)
位:long(int),ulong(uint),double(float)
括號中的類型名稱是別名,例如uint8可以代替ubyte,并且int32可以代替int而不影響代碼生成。
內置非標量類型:
任何其他類型的向量(以表示[type])。不支持嵌套向量,而是可以將內部向量包裝在表中。
stng,可能只包含UTF-8或7位ASCII碼。對于其他文本編碼或常規二進制數據,請使用向量([byte]或[ubyte])。
對其他表或結構,枚舉或聯合的引用(請參見下文)。
一旦使用了字段,就無法更改字段類型,但相同大小的數據除外,其中areinterpret_cast會給您帶來理想的結果,例如uint,int如果當前數據中還沒有值使用高位,則可以將a更改為a 。
數組
數組是固定長度元素的便捷捷徑。數組可用于替換以下架構:
兩種表示形式都是二進制等效的。
目前僅在中支持數組struct。