আমি কয়েকটি মডিউল নিয়ে গেম ইঞ্জিনটি লিখছি। এর মধ্যে দুটি গ্রাফিক্স ইঞ্জিন এবং পদার্থবিজ্ঞান ইঞ্জিন ।
আমি ভাবছি তাদের মধ্যে ডেটা ভাগ করে নেওয়া যদি ভাল সমাধান হয়?
দুটি উপায় (ভাগ করে নেওয়া বা না করা) এর মতো দেখায়:
ডেটা ভাগ করে নিই
GraphicsModel{
//some common for graphics and physics data like position
//some only graphic data
//like textures and detailed model's verticles that physics doesn't need
};
PhysicsModel{
//some common for graphics and physics data like position
//some only physics data
//usually my physics data contains A LOT more informations than graphics data
}
engine3D->createModel3D(...);
physicsEngine->createModel3D(...);
//connect graphics and physics data
//e.g. update graphics model's position when physics model's position will change
আমি দুটি প্রধান সমস্যা দেখতে পাচ্ছি:
- প্রচুর রিডানড্যান্ট ডেটা (পদার্থবিজ্ঞান এবং গ্রাফিক্স ডেটা উভয়ের জন্য দুটি অবস্থানের মতো)
- ডেটা আপডেট করার ক্ষেত্রে সমস্যা (পদার্থবিজ্ঞানের ডেটা পরিবর্তিত হওয়ার সময় আমাকে গ্রাফিক্স ডেটা ম্যানুয়ালি আপডেট করতে হবে)
ডেটা ভাগ করে নেওয়ার সাথে
Model{
//some common for graphics and physics data like position
};
GraphicModel : public Model{
//some only graphics data
//like textures and detailed model's verticles that physics doesn't need
};
PhysicsModel : public Model{
//some only physics data
//usually my physics data contains A LOT more informations than graphics data
}
model = engine3D->createModel3D(...);
physicsEngine->assingModel3D(&model); //will cast to
//PhysicsModel for it's purposes??
//when physics changes anything (like position) in model
//(which it treats like PhysicsModel), the position for graphics data
//will change as well (because it's the same model)
সমস্যা এখানে:
- পদার্থবিজ্ঞান ইঞ্জিন নতুন অবজেক্ট তৈরি করতে পারে না, কেবল ইঞ্জিন 3 ডি থেকে বিদ্যমান বিদ্যমানগুলিকে "অ্যাসিডিং" করতে পারে (একরকম এটি আমার পক্ষে আরও বিরোধী স্বাধীন বলে মনে হচ্ছে)
- AssingModel3D ফাংশনে ডেটা কাস্ট করা
- পদার্থবিজ্ঞান ইঞ্জিন এবং গ্রাফিক্স ইঞ্জিন অবশ্যই সাবধান হওয়া উচিত - যখন তাদের প্রয়োজন হয় না তখন তারা ডেটা মুছতে পারে না (কারণ দ্বিতীয়টির এটির প্রয়োজন হতে পারে)। তবে এটি বিরল পরিস্থিতি। তদুপরি, তারা কেবল পয়েন্টারটি মুছতে পারে, বস্তুটি নয়। বা আমরা ধরে নিতে পারি যে গ্রাফিক্স ইঞ্জিন বস্তুগুলিকে মুছে ফেলবে, পদার্থবিজ্ঞানজাইন তাদের কেবল পয়েন্টার করে।
কোন উপায় ভাল?
ভবিষ্যতে কোনটি আরও সমস্যার সৃষ্টি করবে?
আমি দ্বিতীয় সমাধানটি আরও পছন্দ করি, তবে আমি অবাক হয়েছি কেন বেশিরভাগ গ্রাফিক্স এবং পদার্থবিজ্ঞানের ইঞ্জিনগুলি প্রথমটিকে পছন্দ করে (সম্ভবত তারা সাধারণত গ্রাফিক বা কেবল পদার্থবিজ্ঞান ইঞ্জিন তৈরি করে এবং অন্য কেউ তাদের খেলায় সংযুক্ত করে?)
তাদের কি আরও কোনও লুকানো উপকার ও বিপরীতে আছে?