150 lines
7.3 KiB
Markdown
150 lines
7.3 KiB
Markdown
# FlatBuffers
|
|
|
|
FlatBuffers is an efficient cross platform serialization library for C++,
|
|
with support for Java, C# and Go. It was created at Google specifically for game
|
|
development and other performance-critical applications.
|
|
|
|
It is available as Open Source on [GitHub](http://github.com/google/flatbuffers)
|
|
under the Apache license, v2 (see LICENSE.txt).
|
|
|
|
## Why use FlatBuffers?
|
|
|
|
- **Access to serialized data without parsing/unpacking** - What sets
|
|
FlatBuffers apart is that it represents hierarchical data in a flat
|
|
binary buffer in such a way that it can still be accessed directly
|
|
without parsing/unpacking, while also still supporting data
|
|
structure evolution (forwards/backwards compatibility).
|
|
|
|
- **Memory efficiency and speed** - The only memory needed to access
|
|
your data is that of the buffer. It requires 0 additional allocations.
|
|
FlatBuffers is also very
|
|
suitable for use with mmap (or streaming), requiring only part of the
|
|
buffer to be in memory. Access is close to the speed of raw
|
|
struct access with only one extra indirection (a kind of vtable) to
|
|
allow for format evolution and optional fields. It is aimed at
|
|
projects where spending time and space (many memory allocations) to
|
|
be able to access or construct serialized data is undesirable, such
|
|
as in games or any other performance sensitive applications. See the
|
|
[benchmarks](md__benchmarks.html) for details.
|
|
|
|
- **Flexible** - Optional fields means not only do you get great
|
|
forwards and backwards compatibility (increasingly important for
|
|
long-lived games: don't have to update all data with each new
|
|
version!). It also means you have a lot of choice in what data you
|
|
write and what data you don't, and how you design data structures.
|
|
|
|
- **Tiny code footprint** - Small amounts of generated code, and just
|
|
a single small header as the minimum dependency, which is very easy
|
|
to integrate. Again, see the benchmark section for details.
|
|
|
|
- **Strongly typed** - Errors happen at compile time rather than
|
|
manually having to write repetitive and error prone run-time checks.
|
|
Useful code can be generated for you.
|
|
|
|
- **Convenient to use** - Generated C++ code allows for terse access
|
|
& construction code. Then there's optional functionality for parsing
|
|
schemas and JSON-like text representations at runtime efficiently if
|
|
needed (faster and more memory efficient than other JSON
|
|
parsers).
|
|
|
|
Java and Go code supports object-reuse.
|
|
|
|
- **Cross platform C++11/Java/C#/Go code with no dependencies** - will work
|
|
with any recent gcc/clang and VS2010. Comes with build files for the tests &
|
|
samples (Android .mk files, and cmake for all other platforms).
|
|
|
|
### Why not use Protocol Buffers, or .. ?
|
|
|
|
Protocol Buffers is indeed relatively similar to FlatBuffers,
|
|
with the primary difference being that FlatBuffers does not need a parsing/
|
|
unpacking step to a secondary representation before you can
|
|
access data, often coupled with per-object memory allocation. The code
|
|
is an order of magnitude bigger, too. Protocol Buffers has neither optional
|
|
text import/export nor schema language features like unions.
|
|
|
|
### But all the cool kids use JSON!
|
|
|
|
JSON is very readable (which is why we use it as our optional text
|
|
format) and very convenient when used together with dynamically typed
|
|
languages (such as JavaScript). When serializing data from statically
|
|
typed languages, however, JSON not only has the obvious drawback of runtime
|
|
inefficiency, but also forces you to write *more* code to access data
|
|
(counterintuitively) due to its dynamic-typing serialization system.
|
|
In this context, it is only a better choice for systems that have very
|
|
little to no information ahead of time about what data needs to be stored.
|
|
|
|
Read more about the "why" of FlatBuffers in the
|
|
[white paper](md__white_paper.html).
|
|
|
|
### Who uses FlatBuffers?
|
|
- [Cocos2d-x](http://www.cocos2d-x.org/), the #1 open source mobile game
|
|
engine, uses it to serialize all their
|
|
[game data](http://www.cocos2d-x.org/reference/native-cpp/V3.5/d7/d2d/namespaceflatbuffers.html).
|
|
- [Facebook](http://facebook.com/) uses it for client-server communication in
|
|
their Android app. They have a nice
|
|
[article](https://code.facebook.com/posts/872547912839369/improving-facebook-s-performance-on-android-with-flatbuffers/)
|
|
explaining how it speeds up loading their posts.
|
|
- [Fun Propulsion Labs](https://developers.google.com/games/#Tools)
|
|
at Google uses it extensively in all their libraries and games.
|
|
|
|
## Usage in brief
|
|
|
|
This section is a quick rundown of how to use this system. Subsequent
|
|
sections provide a more in-depth usage guide.
|
|
|
|
- Write a schema file that allows you to define the data structures
|
|
you may want to serialize. Fields can have a scalar type
|
|
(ints/floats of all sizes), or they can be a: string; array of any type;
|
|
reference to yet another object; or, a set of possible objects (unions).
|
|
Fields are optional and have defaults, so they don't need to be
|
|
present for every object instance.
|
|
|
|
- Use `flatc` (the FlatBuffer compiler) to generate a C++ header (or
|
|
Java/C#/Go/Python.. classes) with helper classes to access and construct
|
|
serialized data. This header (say `mydata_generated.h`) only depends on
|
|
`flatbuffers.h`, which defines the core functionality.
|
|
|
|
- Use the `FlatBufferBuilder` class to construct a flat binary buffer.
|
|
The generated functions allow you to add objects to this
|
|
buffer recursively, often as simply as making a single function call.
|
|
|
|
- Store or send your buffer somewhere!
|
|
|
|
- When reading it back, you can obtain the pointer to the root object
|
|
from the binary buffer, and from there traverse it conveniently
|
|
in-place with `object->field()`.
|
|
|
|
## In-depth documentation
|
|
|
|
- How to [build the compiler](md__building.html) and samples on various
|
|
platforms.
|
|
- How to [use the compiler](md__compiler.html).
|
|
- How to [write a schema](md__schemas.html).
|
|
- How to [use the generated C++ code](md__cpp_usage.html) in your own
|
|
programs.
|
|
- How to [use the generated Java/C# code](md__java_usage.html) in your own
|
|
programs.
|
|
- How to [use the generated Go code](md__go_usage.html) in your own
|
|
programs.
|
|
- [Support matrix](md__support.html) for platforms/languages/features.
|
|
- Some [benchmarks](md__benchmarks.html) showing the advantage of using
|
|
FlatBuffers.
|
|
- A [white paper](md__white_paper.html) explaining the "why" of FlatBuffers.
|
|
- A description of the [internals](md__internals.html) of FlatBuffers.
|
|
- A formal [grammar](md__grammar.html) of the schema language.
|
|
|
|
## Online resources
|
|
|
|
- [GitHub repository](http://github.com/google/flatbuffers)
|
|
- [Landing page](http://google.github.io/flatbuffers)
|
|
- [FlatBuffers Google Group](http://group.google.com/group/flatbuffers)
|
|
- [FlatBuffers Issues Tracker](http://github.com/google/flatbuffers/issues)
|
|
- Videos:
|
|
- Colt's [DevByte](https://www.youtube.com/watch?v=iQTxMkSJ1dQ).
|
|
- GDC 2015 [Lightning Talk](https://www.youtube.com/watch?v=olmL1fUnQAQ).
|
|
- FlatBuffers for [Go](https://www.youtube.com/watch?v=-BPVId_lA5w).
|
|
- Evolution of FlatBuffers
|
|
[visualization](https://www.youtube.com/watch?v=a0QE0xS8rKM).
|
|
- Useful documentation created by others:
|
|
- [Using FlatBuffers in Unity](http://exiin.com/blog/flatbuffers-for-unity-sample-code/)
|