FlatBuffers Schema ডিফাইন এবং এর মাধ্যমে ডাটা গঠন
FlatBuffers Schema ডেটার কাঠামো এবং টাইপ সংজ্ঞায়িত করতে ব্যবহৃত হয়। এটি একটি .fbs ফাইল ফরম্যাটে লেখা হয়, যা ডেটার বিভিন্ন ফিল্ড, সম্পর্ক, এবং তাদের টাইপ নির্ধারণ করে। Schema ডিফাইন করা হলে, তা থেকে ডেটার জন্য কোড উৎপন্ন করা যায় যা ডেটাকে কার্যকরভাবে সংরক্ষণ ও অ্যাক্সেস করতে সাহায্য করে।
Schema ডিফাইন করার প্রক্রিয়া
১. Namespace
Namespace একটি নামের প্রাঙ্গণ তৈরি করে, যা নাম সংঘর্ষ প্রতিরোধ করতে সহায়ক। একটি Schema-তে namespace ব্যবহার করা ভাল অভ্যাস।
namespace MyGame.Sample;
২. Tables
Tables হল মূল ডেটা কাঠামো যা বিভিন্ন ফিল্ড ধারণ করে। প্রতিটি টেবিল একটি অবজেক্টের মতো কাজ করে এবং এর মধ্যে বিভিন্ন ধরনের ডেটা থাকতে পারে।
table Monster {
id: int; // সঠিক আইডি
name: string; // মনস্টারের নাম
health: float; // স্বাস্থ্য মান
inventory: [string]; // ইনভেন্টরির আইটেমের তালিকা
}
৩. Structs
Structs হল ছোট ডেটা ইউনিট যা একাধিক ফিল্ড ধারণ করে, কিন্তু টেবিলের মতো সম্বোধন করা হয় না। Structs সাধারণত স্থানীয় ডেটার প্রতিনিধিত্ব করে।
struct Vector3 {
x: float; // X অক্ষের মান
y: float; // Y অক্ষের মান
z: float; // Z অক্ষের মান
}
৪. Enums
Enum হল একটি নির্দিষ্ট সেট মানের তালিকা যা বিভিন্ন অবস্থান চিহ্নিত করার জন্য ব্যবহৃত হয়।
enum WeaponType {
None = 0, // কোন অস্ত্র নেই
Sword = 1, // তরবারি
Bow = 2, // তীর
Axe = 3 // কুঠার
}
৫. Vectors
Vectors হল ডেটার একটি সংগ্রহ যা একাধিক ফিল্ড ধারণ করে। এটি বিভিন্ন টাইপের ডেটার একটি তালিকা হতে পারে।
table Player {
id: int; // প্লেয়ারের আইডি
name: string; // প্লেয়ারের নাম
position: Vector3; // প্লেয়ারের অবস্থান
inventory: [WeaponType]; // অস্ত্রের তালিকা
}
৬. Root Type
Schema-র শেষে মূল ধরনের (root type) সংজ্ঞায়িত করা হয়, যা প্রাথমিক ডেটা ধারণ করে।
root_type Monster; // মূল ধরনের সংজ্ঞা
সম্পূর্ণ Schema উদাহরণ
নিচে একটি FlatBuffers Schema-এর সম্পূর্ণ উদাহরণ দেওয়া হলো:
// MyGame.fbs
namespace MyGame.Sample;
table Monster {
id: int; // মনস্টারের আইডি
name: string; // মনস্টারের নাম
health: float; // মনস্টারের স্বাস্থ্য
inventory: [string]; // মনস্টারের ইনভেন্টরি
position: Vector3; // 3D অবস্থান
weapon: WeaponType; // ব্যবহার করা অস্ত্র
}
struct Vector3 {
x: float; // X অক্ষের মান
y: float; // Y অক্ষের মান
z: float; // Z অক্ষের মান
}
enum WeaponType {
None = 0, // কোন অস্ত্র নেই
Sword = 1, // তরবারি
Bow = 2, // তীর
Axe = 3 // কুঠার
}
// মূল ধরনের সংজ্ঞা
root_type Monster;
Schema থেকে ডেটা গঠন
FlatBuffers কম্পাইলার (flatc) ব্যবহার করে স্কিমা ফাইলটি কম্পাইল করুন:
এই কমান্ডটি C++ কোড উৎপন্ন করবে যা FlatBuffers ডেটা স্ট্রাকচার তৈরি এবং ব্যবহারের জন্য প্রস্তুত থাকে।
flatc --cpp MyGame.fbs
ডেটা সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করুন:
একটি C++ প্রোগ্রামে উৎপন্ন কোড ব্যবহার করে ডেটা তৈরি এবং পড়ার উদাহরণ:
#include "monster_generated.h" // উৎপন্ন FlatBuffers ফাইল
using namespace MyGame::Sample;
int main() {
flatbuffers::FlatBufferBuilder builder;
// Monster টেবিল তৈরি করা
auto name = builder.CreateString("Orc");
MonsterBuilder monster_builder(builder);
monster_builder.add_id(1);
monster_builder.add_name(name);
monster_builder.add_health(100.0f);
monster_builder.add_position(Vector3(1.0f, 2.0f, 3.0f)); // Vector3 অবজেক্ট তৈরি
monster_builder.add_weapon(WeaponType::Sword);
auto orc = monster_builder.Finish();
builder.Finish(orc);
// বাইনারি ডেটা পঠন
const Monster* monster = GetMonster(builder.GetBufferPointer());
std::cout << "Monster ID: " << monster->id() << ", Name: " << monster->name()->c_str() << ", Health: " << monster->health() << std::endl;
return 0;
}
সারসংক্ষেপ
- FlatBuffers Schema: ডেটার কাঠামো এবং টাইপ সংজ্ঞায়িত করে।
- উপাদান: Namespace, Tables, Structs, Enums, Vectors, এবং Root Type।
- কর্মপ্রণালী: স্কিমা সংজ্ঞায়িত করা, ডেটা সিরিয়ালাইজ করা, এবং ডেটা অ্যাক্সেস করা।
FlatBuffers Schema ব্যবহার করে দ্রুত এবং কার্যকরী ডেটা গঠন সম্ভব, যা গেম ডেভেলপমেন্ট এবং উচ্চ কার্যক্ষমতা সম্পন্ন অ্যাপ্লিকেশনগুলিতে অত্যন্ত উপকারী।
Read more