FlatBuffers Buffer থেকে ডাটা পড়া
FlatBuffers ব্যবহারের সময়, সিরিয়ালাইজ করা ডেটা একটি বাইনারি ফরম্যাটে সংরক্ষণ করা হয়। ডাটা পড়ার জন্য FlatBuffers লাইব্রেরি ব্যবহার করে আমরা এই বাইনারি ডেটা থেকে বিভিন্ন ফিল্ডের মান সহজে বের করতে পারি। নিচে FlatBuffers Buffer থেকে ডাটা পড়ার প্রক্রিয়া উদাহরণসহ আলোচনা করা হলো।
উদাহরণ Schema
এখানে একটি FlatBuffers Schema তৈরি করা হয়েছে, যা Monster টেবিলের ফিল্ডগুলি সংজ্ঞায়িত করে।
namespace MyGame.Sample;
// Monster টেবিল
table Monster {
id: int; // মনস্টারের আইডি
name: string; // মনস্টারের নাম
health: float; // স্বাস্থ্য মান
inventory: [string]; // ইনভেন্টরির আইটেমের তালিকা
}
// মূল ধরনের সংজ্ঞা
root_type Monster;
১. স্কিমা ফাইল কম্পাইল করা
FlatBuffers কম্পাইলার (flatc) ব্যবহার করে স্কিমা ফাইলটি কম্পাইল করুন, যাতে C++ কোড উৎপন্ন হয়।
flatc --cpp monster.fbs
২. ডাটা সিরিয়ালাইজেশন
FlatBuffers ব্যবহার করে কিছু ডেটা সিরিয়ালাইজ করুন। নিচে একটি C++ প্রোগ্রাম উদাহরণ দেওয়া হলো।
C++ কোড (ডেটা সিরিয়ালাইজেশন)
#include "monster_generated.h" // উৎপন্ন FlatBuffers ফাইল
#include <iostream>
#include <fstream>
using namespace MyGame::Sample;
void serializeData() {
flatbuffers::FlatBufferBuilder builder;
// Monster টেবিল তৈরি করা
auto name = builder.CreateString("Orc");
auto inventory = builder.CreateVector({"Sword", "Axe"});
MonsterBuilder monster_builder(builder);
monster_builder.add_id(1);
monster_builder.add_name(name);
monster_builder.add_health(100.0f);
monster_builder.add_inventory(inventory);
auto orc = monster_builder.Finish();
builder.Finish(orc);
// বাইনারি ডেটা সংরক্ষণ করা
std::ofstream ofs("monster_data.bin", std::ios::binary);
ofs.write(reinterpret_cast<const char*>(builder.GetBufferPointer()), builder.GetSize());
ofs.close();
std::cout << "Monster data serialized and saved to monster_data.bin" << std::endl;
}
৩. Buffer থেকে ডাটা পড়া
ডেটা পড়ার জন্য আমরা ডেটাকে বাইনারি ফাইল থেকে লোড করবো এবং FlatBuffers লাইব্রেরি ব্যবহার করে ডেটার ফিল্ডগুলি অ্যাক্সেস করবো।
C++ কোড (ডেটা পড়া)
void deserializeData() {
// বাইনারি ডেটা পড়া
std::ifstream ifs("monster_data.bin", std::ios::binary);
std::vector<char> buffer((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
// FlatBuffers থেকে ডেটা অ্যাক্সেস করা
const Monster* monster = GetMonster(buffer.data());
// ডেটা প্রদর্শন করা
std::cout << "Monster ID: " << monster->id()
<< ", Name: " << monster->name()->c_str()
<< ", Health: " << monster->health() << std::endl;
// ইনভেন্টরি আইটেমগুলো প্রিন্ট করা
for (const auto& item : *monster->inventory()) {
std::cout << "Inventory Item: " << item->c_str() << std::endl;
}
}
৪. মূল প্রোগ্রাম
int main() {
// প্রথমে ডেটা সিরিয়ালাইজ করা
serializeData();
// পরে ডেটা ডেসিরিয়ালাইজ করা
deserializeData();
return 0;
}
কোডের ব্যাখ্যা
- serializeData: FlatBuffers ব্যবহার করে ডেটা তৈরি করে এবং একটি বাইনারি ফাইলে সংরক্ষণ করে।
- deserializeData: সংরক্ষিত বাইনারি ফাইল থেকে ডেটা পড়ে এবং FlatBuffers লাইব্রেরি ব্যবহার করে ডেটা অ্যাক্সেস করে।
- GetMonster: বাইনারি ডেটা থেকে Monster অবজেক্টকে ফিরে দেয়, যাতে ফিল্ডগুলির মান অ্যাক্সেস করা যায়।
- Zero-Copy Access: ডেটা অ্যাক্সেস করার সময় বাইনারি ডেটা সরাসরি অ্যাক্সেস করা হয়, যা মেমোরি ব্যবস্থাপনাকে উন্নত করে।
সারসংক্ষেপ
- FlatBuffers Schema: ডেটার কাঠামো নির্ধারণ করে।
- ডেটা সিরিয়ালাইজেশন: C++ কোড ব্যবহার করে ডেটা তৈরি এবং বাইনারি ফাইলে সংরক্ষণ।
- Buffer থেকে ডাটা পড়া: FlatBuffers লাইব্রেরি ব্যবহার করে বাইনারি ফাইল থেকে ডেটা পড়া এবং অ্যাক্সেস।
FlatBuffers এর মাধ্যমে ডাটা পড়া একটি দ্রুত এবং কার্যকরী পদ্ধতি, যা গেম ডেভেলপমেন্ট এবং অন্যান্য উচ্চ কার্যক্ষমতা সম্পন্ন অ্যাপ্লিকেশনগুলির জন্য বিশেষভাবে উপকারী।
Read more