এপিআই অ্যাগনস্টিক ব্রিজ (যেমন ওপেনজিএল / ডি 3 ডি / যাই হোক না কেন)। আপনি কীভাবে এগুলি তৈরি করেন আপনি সেগুলি ব্যবহার করেন। প্রো এবং কন এর [বন্ধ]


12

আপনি একটি 3 ডি ইঞ্জিন তৈরি করছেন। আপনি সেরা মাল্টিপ্লাটফর্ম ওয়ার্ল্ড চান। হঠাৎ আপনি বুঝতে পারছেন যে আপনি যদি উইন্ডোজ মেশিনে ডাইরেক্ট 3 ডি এবং ওএসএক্স / লিনাক্সের ওপেনগিএল ব্যবহার করতে চান তবে আপনাকে কমপক্ষে সাধারণ বিভাজন উভয়ের সমর্থিত বৈশিষ্ট্যগুলি ত্যাগ করতে হবে।

কেউ কেউ তিনটি ওএস জুড়েই ওপেনজিএল ব্যবহার করতে পারেন, যেহেতু এটি নিজেরাই স্বল্পতম সাধারণ ডোনমিনেটর হিসাবে দেখা যায়। সব ভাল. তারপরে, আপনাকে আপনার গ্রাফিক্স এপিআই ব্যাকএন্ডটি নিন্টেন্ডোর জিএক্স-তে পোর্ট করতে হবে, আপনাকে একটি PS3 এবং Xbox360 পাথও করতে হবে।

আপনি কি করেন? আপনি কি নিজের নিজস্ব এপিআই ডিজাইন করেন যা নিজেই সর্বনিম্ন সাধারণ ডিনোমিনেটর এবং প্রতিটি প্ল্যাটফর্মের জন্য এটির জন্য ব্যাকএন্ড বাস্তবায়ন লেখেন বা প্রতিটি প্ল্যাটফর্মের জন্য এটি নিজস্ব শাখা লেখেন?

আপনি যদি নিজের নিজস্ব এপিআই ডিজাইন করতে চান, আপনি কি ব্রিজ প্যাটার্ন বা নিজের ভুডো ব্যবহার করেন? পাগলামি কোথায় থামবে যেখানে আপনি সবকিছু বুঝতে এবং রান্নাঘরের সিঙ্ক পদ্ধতির অবশ্যই থামতে হবে এবং আপনার কাছে প্রতিটি প্ল্যাটফর্মের জন্য একটি শাখা হিসাবে মূলত পৃথক ইঞ্জিন রয়েছে। অথবা আপনি সমস্ত কিছু এবং রান্নাঘরের ডোবায় আটকে থাকেন এবং প্রতিটি প্ল্যাটফর্মের জন্য ব্যাকএন্ড মডিউল বিশেষায়নের ক্ষেত্রে প্ল্যাটফর্মের বিশদটি রাখেন।

উত্তর:


9

আমি সর্বনিম্ন-সাধারণ বর্ণবাদী পদ্ধতির ভক্ত নই। যদি আপনি এটি করেন তবে আপনার পঙ্গু বৈশিষ্ট্য এবং দুর্বল অভিনয় রয়েছে।

পরিবর্তে, আমি অতীতে যা করেছি তা হ'ল একটি লাইব্রেরিতে কিছুটা উচ্চ স্তরের কার্যকারিতা সরবরাহ করা। সেই লাইব্রেরিটি (বেশিরভাগ ক্ষেত্রে) এপিএন অজোনস্টিক এবং যে কোনও জায়গায় ব্যবহার করা যেতে পারে তবে লাইব্রেরির প্রয়োগ বিভিন্ন প্ল্যাটফর্ম / গ্রাফিক্স ব্যাকেন্ডের জন্য সম্পূর্ণ আলাদা। সুতরাং উদাহরণস্বরূপ, একটি সেটস্টেটএক্স () ফাংশন না করার পরিবর্তে আপনার কাছে রেন্ডারমেশ () বা ক্রিয়েটরেন্ডার টার্গেট () এর মতো উচ্চতর ফাংশন রয়েছে।

আপনি যখনই নতুন প্ল্যাটফর্মে চলে আসেন এটি সত্যই পাতলা স্তরের চেয়ে বেশি কাজ করবে তবে এটি সম্পূর্ণরূপে মূল্যবান হবে কারণ আপনি সেই প্ল্যাটফর্মের জন্য সর্বোত্তম উপায়ে জিনিসগুলি কার্যকর করতে সক্ষম হবেন এবং আপনি নিতে সক্ষম হবেন নেটিভ, অনন্য বৈশিষ্ট্যগুলির সুবিধা।

আরও একটি জিনিস: এনক্যাপসুলেশনটি সামান্য ভাঙতে ভয় পাবেন না। হতাশার আর কিছু নেই যে আপনি নির্দিষ্ট ক্ষমতা সহ প্ল্যাটফর্মে রয়েছেন এবং সেগুলি ব্যবহার করতে সক্ষম হচ্ছেন না জেনে। কোনও ধরণের ব্যাকডোর ছেড়ে দেওয়া যাতে উচ্চ-স্তরের কোডটি প্ল্যাটফর্মটির সুবিধা নিতে পারে (উদাহরণস্বরূপ, ডি 3 ডি ডিভাইস বা ওপেনগিএল প্রসঙ্গে পুনরুদ্ধার করতে সক্ষম হওয়া)।


3
আমি মনে করি আপনি যা বলেছিলেন আমি যা বলার চেষ্টা করছিলাম তা আরও ভাল।
এশেলি

6

আমি যা বলতে পারি তা হ'ল ওগ্রে 3 ডি একবার দেখুন । এটি সি ++, ওপেন সোর্স (এমআইটি লাইসেন্স এখন) তে লেখা আছে এবং বাক্সের বাইরে প্রতিটি বড় প্ল্যাটফর্মে চলে। এটি রেন্ডারিং এপিটিকে বিমূর্ত করে তোলে এবং ডাইরেক্টএক্স ব্যবহার করে ওপেনজিএল থেকে কিছু সেটিংসের মধ্যে পরিবর্তন করতে পারে। তবে, ডাইরেক্টএক্স এবং ওপেনজিএল এর বৈশিষ্ট্য সেটগুলির মধ্যে পার্থক্য সম্পর্কে আমি যথেষ্ট জানি না যে এটি নির্দিষ্ট বৈশিষ্ট্যটি করে বা সমর্থন করে না support

রুনিক গেমস দ্বারা টর্চলাইট ওগ্রে ব্যবহার করে লেখা হয়েছিল এবং আমি এটি ম্যাক এবং পিসিতে খেললাম এবং এটি উভয়র উপর খুব ভাল চলে।


2
ওগ্রে পদ্ধতির জন্য +1। আমি এটি সম্পর্কে জানি, কিছু কোডের মাধ্যমে পড়েছি। যদিও আমি এই পদ্ধতির বিষয়ে এবং অন্যান্য ব্যক্তিরা এরকম পরিস্থিতিতে কী করে সে সম্পর্কে ব্যক্তিগত গল্প শুনতে আগ্রহী was
কীফ্রেমে

2
ধন্যবাদ! ওয়েল আমি বেশিরভাগভাবে ওগ্রির মতোই করতাম। আমি অনেকগুলি ক্রস প্ল্যাটফর্ম বিকাশে ইন্টারফেস / কারখানার পদ্ধতির ব্যবহার করেছি এবং আমি আসলে নিশ্চিত নই যে আমি অন্যথায় এটি কীভাবে করব। আমি বলব যে আপনাকে একই সময়ে একাধিক প্ল্যাটফর্মগুলিতে কাজ করা দরকার। উদাহরণস্বরূপ উইন্ডোতে এবং ম্যাকের কাছে পোর্ট করার চেয়ে সবকিছুকে কোড করার চেষ্টা করবেন না।
কেসি

হ্যাঁ! আমি আমার নিজের ক্রস-এপিআই র‌্যাপারটি ঘূর্ণায়িত করে সত্যিই ক্লান্ত হয়ে উঠছিলাম এবং তারপরে আমি কেবল ওগ্রে ব্যবহার শুরু করেছি। পিছনে ফিরে তাকাতে হয়নি। :)
জ্যাকোমে

1

আমি গ্রাফিক্সের জন্য এটি করিনি, তবে আমি একটি ক্রস-প্ল্যাটফর্ম অডিও সরঞ্জামকিট তৈরি করেছি (পিসি / এক্সবক্স / পিএস 2)। আমরা সর্বনিম্ন-সাধারণ-ডিনোমিনেটর সক্ষমতার পাশাপাশি platformচ্ছিক প্ল্যাটফর্ম-সক্ষমতা সহ আমাদের নিজস্ব API তৈরির পথে চলেছি। এখানে শিখে নেওয়া হয়েছে কিছু পাঠ:

মূলটি হ'ল এমন একটি প্রক্রিয়াজাতকরণের পথটি সংজ্ঞায়িত করা হয় যা প্রতিটি প্ল্যাটফর্মের মূল ক্ষমতাগুলিকে আবদ্ধ করে এবং বৃদ্ধির অনুমতি দেয়। এটি করার জন্য, আপনাকে প্রতিটি প্ল্যাটফর্মের নিম্ন স্তরের এপিআই বুঝতে হবে যাতে আপনি সঠিক বিমূর্ততা সনাক্ত করতে পারেন। সর্বাধিক সক্ষম প্যাটফর্মের উন্নত বৈশিষ্ট্যগুলিতে অ্যাক্সেস সরবরাহ করার সময় চেইনটি কমপক্ষে সক্ষম প্ল্যাটফর্মের জন্য কাজ করে তা নিশ্চিত করুন। এই অধিকার পেতে কাজ করুন এবং আপনি পরে অনেক প্রচেষ্টা বাঁচাতে হবে।

অডিওর জন্য, চেইনটি এমন কিছু ছিল SoundSources -> [Decoders] -> Buffers -> [3D Positioner] ->[Effects] -> Players

গ্রাফিক্সের জন্য, এটি হতে পারে Model -> Shapes -> Positioner -> Texturer -> [Lighting] -> [Particle Effects] -> Renderer(এটি সম্ভবত সম্পূর্ণ ভুল সেট, আমি কোনও গ্রাফিক্স লোক নই)।

আপনার মূল অবজেক্টগুলিকে পরিচালনা করে এমন একটি ফ্রন্ট-এন্ড এপিআই এবং একটি প্ল্যাটফর্ম-নির্দিষ্ট ব্যাক এন্ড লিখুন যা এপিআইকে নিম্ন স্তরের দক্ষতার মানচিত্র করে। প্রতিটি সক্ষমতা জন্য একটি সর্বোত্তম প্রচেষ্টা প্রদান। উদাহরণস্বরূপ, পিসি এবং এক্সবক্সে 3 ডি অডিও পজিশনিং সাউন্ড চিপগুলির এইচআরটিএফ ক্ষমতাগুলি ব্যবহার করে করা হয়েছিল, যখন পিএস 2 একটি সাধারণ প্যান এবং বিবর্ণ ব্যবহার করেছিল। কোনও গ্রাফিক্স ইঞ্জিন আলোকের সাথে অনুরূপ কিছু করতে পারে।

প্ল্যাটফর্মের নিরপেক্ষ কোড দিয়ে যতটা সম্ভব সামনের প্রান্তটি কার্যকর করুন। কোনও শব্দ অবজেক্টের সাথে রিভারব অবজেক্ট সংযুক্ত করার কোড বা কোনও আকৃতি অবজেক্টের একটি টেক্সচার সম্পদ পুরোপুরি সাধারণ হওয়া উচিত, যেমন কোডটি পুনরাবৃত্তি করতে এবং সক্রিয় অবজেক্টগুলিতে প্রক্রিয়া করা উচিত। অন্যদিকে, নিম্ন স্তরের অবজেক্টগুলি সাধারণ ইন্টারফেস বাদে সম্পূর্ণ প্ল্যাটফর্ম নির্দিষ্ট হতে পারে।

নিশ্চিত হয়ে নিন যে API, বা কনফিগারেশন ফাইলগুলি ব্যবহারকারীকে প্ল্যাটফর্ম-নির্দিষ্ট বিকল্পগুলি নির্দিষ্ট করার অনুমতি দেয়। আমরা কনফিগারেশন ফাইলগুলিতে রেখে প্ল্যাটফর্ম-নির্দিষ্ট কোডটিকে গেমের স্তরে ঠেলাতে এড়াতে চেষ্টা করেছি: একটি প্ল্যাটফর্মের কনফিগার ফাইলটি "প্রভাব: সুপারডুপার্পার্টিক্যালজেনেটর" নির্দিষ্ট করতে পারে এবং অন্যটি বলে "প্রভাব: সফটগ্লো"

সমান্তরালে অবশ্যই প্ল্যাটফর্মগুলি বিকাশ করুন। প্ল্যাটফর্ম নির্দিষ্ট ইন্টারফেসগুলি তাদের নিজের মতো করে সংজ্ঞাযুক্ত এবং পরীক্ষার যোগ্য কিনা তা নিশ্চিত করুন। এটি অনেকগুলি প্রতিরোধ করে "এটি প্ল্যাটফর্ম স্তর বা এপিআই স্তর?" ডিবাগ করার সময় সমস্যাগুলি।


0

আমি মোবাইল প্ল্যাটফর্মের জন্য ইওগার্টগাম (উইন্ডোজ মোবাইল, অ্যান্ড্রয়েড) নামে একটি ওপেন সোর্স গেম ইঞ্জিন লিখছি। এটি আমার একটি বড় বড় সমস্যা ছিল। প্রথমে আমি এটি এর মতো সমাধান করেছি:

class RenderMethod
{

public:

  virtual bool Init();
  virtual bool Tick();
  virtual bool Render();

  virtual void* GetSomeData(); 

}

তুমি কি স্পট করেছ void*? এটি কারণ RenderMethodDirectDrawএকটি ডাইরেক্টড্র পৃষ্ঠ উপস্থাপন করে যখন RenderMethodDirect3Dএকটি ভার্টেক্স পুলটি দেয়। অন্য সব কিছুই বিভক্ত ছিল। আমার একটি Spriteক্লাস ছিল যার SpriteDirectDrawপয়েন্টার বা SpriteDirect3Dপয়েন্টার ছিল। এটা চুষে এক ধরনের।

তাই ইদানীং, আমি জিনিসগুলি অনেকটা আবার লিখছি। আমার এখন যা আছে তা একটি RenderMethodDirectDraw.dllএবং এ RenderMethodDirect3D.dll। আপনি প্রকৃতপক্ষে ডাইরেক্ট 3 ডি ব্যবহার করার চেষ্টা করতে পারেন, ব্যর্থ হতে পারেন এবং এর পরিবর্তে ডাইরেক্টড্র ব্যবহার করতে পারেন। কারণ এপিআই একই থাকে।

আপনি যদি একটি স্প্রিট তৈরি করতে চান তবে আপনি এটি সরাসরি না করে কারখানার মাধ্যমে করেন। কারখানাটি তখন ডিএলএলে সঠিক ফাংশনটি কল করে এবং এটিকে পিতামাতার মধ্যে রূপান্তর করে।

সুতরাং, এটি RenderMethodএপিআইতে রয়েছে:

virtual Sprite* CreateSprite(const char* a_Name) = 0;

এবং এটি এই সংজ্ঞা RenderMethodDirectDraw:

Sprite* RenderMethodDirectDraw::CreateSprite(const char* a_Name)
{
    bool found = false;
    uint32 i;
    for (i = 0; i < m_SpriteDataFilled; i++)
    {
        if (!strcmp(m_SpriteData[i].name, a_Name))
        {
            found = true;
            break;
        }
    }

    if (!found) 
    {
        ERROR_EXPLAIN("Could not find sprite named '%s'", a_Name);
        return NULL; 
    }

    if (m_SpriteList[m_SpriteTotal]) { delete m_SpriteList[m_SpriteTotal]; }
    m_SpriteList[m_SpriteTotal] = new SpriteDirectDraw();

    ((SpriteDirectDraw*)m_SpriteList[m_SpriteTotal])->SetData(&m_SpriteData[i]);

    return (m_SpriteList[m_SpriteTotal++]);
}

আশা করি এটা বোধ গম্য। :)

পিএস আমি এটির জন্য এসটিএল ব্যবহার করতে পছন্দ করতাম তবে অ্যান্ড্রয়েডে কোনও সমর্থন নেই। :(

মূলত:

  • প্রত্যেকটি রেন্ডারকে তার নিজস্ব প্রসঙ্গে রাখুন। হয় একটি ডিএলএল, বা একটি স্ট্যাটিক লাইব্রেরি বা শিরোনামের একগুচ্ছ। যতক্ষণ আপনার কাছে রেন্ডারমেথডএক্স, স্প্রিটএক্স এবং স্টাফএক্স থাকে আপনি সোনার হয়ে থাকেন।
  • ওগ্রে উত্স থেকে যতটা সম্ভব চুরি করুন।

সম্পাদনা: হ্যাঁ এটির মতো ভার্চুয়াল ইন্টারফেসগুলি বোধগম্য হয়। যদি আপনার প্রথম প্রচেষ্টা ব্যর্থ হয়, আপনি অন্য রেন্ডার পদ্ধতিতে চেষ্টা করতে পারেন। এইভাবে আপনি আপনার সমস্ত কোড রেন্ডার পদ্ধতি অগ্নিস্টিক রাখতে পারেন।


1
আপনি যদি একই সময়ে একাধিক বাস্তবায়ন সক্রিয় না করে থাকেন তবে ভার্চুয়াল ইন্টারফেসটি রাখা কি আসলেই বোঝা যায়?
নিখর্টড্রাগন

0

আমি এর জন্য এসডিএল ব্যবহার করতে চাই । এটি ডি 3 ডি, ওপেনজিএল, ওপেনজিএল ইএস এবং কয়েকটি প্ল্যাটফর্ম-নির্দিষ্ট ব্যাকেন্ডের জন্য রেন্ডারার ব্যাকেন্ড পেয়েছে এবং এটি বিভিন্ন ধরণের বিভিন্ন প্ল্যাটফর্মের জন্য উপলব্ধ এবং বর্তমানে সক্রিয় বিকাশের অধীনে রয়েছে এবং বিভিন্ন ভাষায় বাঁধাই রয়েছে।

এটি বিভিন্ন রেন্ডারার ধারণাটিকে দূরে সরিয়ে ভিডিও তৈরি করে (পাশাপাশি সাউন্ড এবং ইনপুট এবং অন্যান্য কয়েকটি জিনিস পরিচালনা করে) একটি সহজ, ক্রস-প্ল্যাটফর্ম এপিআইতে উপলব্ধ। এবং এটি সিম ল্যান্টিংগা ডিজাইন করেছিলেন, ব্লিজার্ডের অন্যতম শীর্ষস্থানীয় ডেভস, বিশেষত পোর্টিং গেমস তৈরি এবং ক্রস-প্ল্যাটফর্ম গেম সহজতর করার জন্য, যাতে আপনি জানেন যে আপনি একটি উচ্চ মানের লাইব্রেরি নিয়ে কাজ করছেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.