# Flatbuffers 學習篇 - 總目標: 自行解譯 tflite - 由 c++/c/python 猜想 flatbuffer 內部實作 - 迷與思: - 如何在 HW 加速, 將 memory 當 stack ? - 思考 flatbuffer 自動化了哪些部分? - 創造 json like 的 schema, 可以轉譯成類似 c/c++ header? 公用的 io streaming? 而非各類別所屬的 io streaming? - 適合多語言轉譯內容? 都需要 schema? - 能隨讀隨翻 - 每筆資料都要有長度? - 具體的 type variable 可以, 甚至可以略過長度, 只給 type, 可查對應長度 - 但多種語言都可翻譯 flatbuffer, 想來仍是 [長度,值] - 有效率的方式表達多筆同類資料 - array, list - 可能是 array 長度, type 長度, 資料 - Enum - 需要有 global index 嗎? - Union - 為了和 c/c++ 相容產生的資料型態 - 複雜結構 - 像自訂 class, 無法一開始知道長度. 如果仿 c/c++, 可用 pointer 解決. - Schema 謎與思 - Schema 像 header 提供 class. 只有 - enum 會賦值 - default value - Schema 對自訂結構, 有 struct 和 table. 差別? - Schema 內看不到 length 或 size. 那在 binary 中為何? - - 參考 [官版入門教學](https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html) ## C++ - "monster_generated.h" - 由 flac 建立 "monster_generated.h" - 內有 #include "flabuffers/flatbuffers.h" - Weapon 應是 "monster_generated.h" - Schema 如何從建立 flatbuffer array? - flatbuffers::Offset<Weapon> 可帶入 Weapon pointer - 這 offset, 可想成是 pointer of Weapon ``` std::vector<flatbuffers::Offset<Weapon>> weapons_vector; weapons_vector.push_back(sword); weapons_vector.push_back(axe); auto weapons = builder.CreateVector(weapons_vector); ``` - CreateVector() 與 CreateVectorOfStructus() - 上述 CreateVector() 接收 vector< Weapon* >, vector 內有 size ... - 而 CreateVectorOfStructs() 可接收 struct array, 但需提供 size. ``` Vec3 points[] = { Vec3(1.0f, 2.0f, 3.0f), Vec3(4.0f, 5.0f, 6.0f) }; auto path = builder.CreateVectorOfStructs(points, 2); ``` ## C