আমি মাঝারি মানের স্কেল মাল্টিপ্লেয়ারের সাথে একটি আইসোমেট্রিক 2 ডি গেম নিয়ে কাজ করছি, প্রায় 20-30 খেলোয়াড় একটানা একটানা সার্ভারে সংযুক্ত। আমার জায়গায় স্থিতিশীলতার পূর্বে ভবিষ্যদ্বাণী বাস্তবায়ন করতে কিছুটা সমস্যা হয়েছিল।
পদার্থবিজ্ঞান / মুভমেন্ট
গেমটিতে প্রকৃত পদার্থবিজ্ঞানের বাস্তবায়ন নেই, তবে চলাচল বাস্তবায়নের জন্য মূল নীতিগুলি ব্যবহার করে। ক্রমাগত পোলিং ইনপুটের পরিবর্তে, রাষ্ট্রীয় পরিবর্তনগুলি (যেমন / মাউস ডাউন / আপ / মুভ ইভেন্টগুলি) প্লেয়ারটি নিয়ন্ত্রণ করছে এমন চরিত্রের সত্তার অবস্থার পরিবর্তন করতে ব্যবহৃত হয়। প্লেয়ারের দিকনির্দেশ (অর্থাত্ / উত্তর-পূর্ব) একটি ধ্রুবক গতির সাথে একত্রিত হয়ে সত্যিকারের 3 ডি ভেক্টর - সত্তার গতিবেগে পরিণত হয়।
মূল গেমের লুপে, "অঙ্কন" এর আগে "আপডেট" বলা হয়। আপডেট যুক্তি একটি "পদার্থবিজ্ঞান আপডেট টাস্ক" ট্রিগার করে যা অ-শূন্য গতির সাথে সমস্ত সত্ত্বাকে ট্র্যাক করে সত্তাগুলির অবস্থান পরিবর্তন করার জন্য খুব বেসিক ইন্টিগ্রেশন ব্যবহার করে। উদাহরণস্বরূপ: সত্তা.পজিশন + = সত্তা.বেলোসিটি.স্কেল (এলপসডটাইম.সেকেন্ডস) (যেখানে "সেকেন্ডস" একটি ভাসমান পয়েন্ট মান, তবে একই পদ্ধতিটি মিলিসেকেন্ড পূর্ণসংখ্যার মানগুলির জন্য কাজ করবে)।
মূল বক্তব্যটি হ'ল কোনও চলাচলের জন্য কোনও অন্তরোলজ ব্যবহার করা হয় না - প্রাথমিক পদার্থবিজ্ঞানের ইঞ্জিনটির "পূর্ববর্তী অবস্থা" বা "বর্তমান অবস্থা" সম্পর্কে কোনও ধারণা নেই, কেবল একটি অবস্থান এবং গতিবেগ।
রাষ্ট্র পরিবর্তন এবং আপডেট প্যাকেট
খেলোয়াড়ের চরিত্রের সত্তার বেগ যখন পরিবর্তনগুলি নিয়ন্ত্রণ করে, সত্তার ক্রিয়া প্রকার (স্ট্যান্ড, ওয়াক, রান), দিক (উত্তর-পূর্ব) এবং বর্তমান অবস্থান সম্বলিত একটি সার্ভারে একটি "মুভ অবতার" প্যাকেট প্রেরণ করা হয়। 3 ডি প্রথম ব্যক্তি গেমগুলি কীভাবে কাজ করে তার থেকে এটি আলাদা from 3 ডি গেমের খেলায় বেগ (দিকনির্দেশ) ফ্রেম ফ্রেমে ফ্রেম পরিবর্তন করতে পারে প্লেয়ারের চারপাশে ঘোরাঘুরি। প্রতিটি রাষ্ট্র পরিবর্তন প্রেরণ কার্যকরভাবে ফ্রেম প্রতি একটি প্যাকেট প্রেরণ করবে, যা খুব ব্যয়বহুল হবে। পরিবর্তে, 3 ডি গেমগুলি রাষ্ট্রের পরিবর্তনগুলি উপেক্ষা করে একটি নির্দিষ্ট ব্যবধানে "স্টেট আপডেট" প্যাকেটগুলি প্রেরণ করবে বলে - প্রতি 80-150 মিমি বলে।
যেহেতু আমার গেমটিতে গতি এবং দিকনির্দেশের আপডেটগুলি খুব কম ঘন ঘন ঘটে তাই আমি প্রতিটি রাজ্যের পরিবর্তন প্রেরণে দূরে যেতে পারি। যদিও পদার্থবিজ্ঞানের সমস্ত সিমুলেশন একই গতিতে ঘটে এবং নির্বিচারক, তবুও বিলম্বিতা এখনও একটি বিষয়। যে কারণে আমি রুটিন পজিশন আপডেট প্যাকেটগুলি (একটি 3D গেমের অনুরূপ) প্রেরণ করি তবে খুব কম ঘন ঘন - এই মুহুর্তে প্রতি 250 মিমি অবধি, তবে আমি ভাল ভবিষ্যদ্বাণী নিয়ে সন্দেহ করি যে আমি সহজেই এটি 500ms এর দিকে বাড়িয়ে তুলতে পারি। সবচেয়ে বড় সমস্যা হ'ল আমি এখন নিয়ম থেকে বিচ্যুত হয়েছি - অন্য সমস্ত ডকুমেন্টেশন, গাইড এবং নমুনা অনলাইনে রুটিন আপডেট পাঠায় এবং দুটি রাজ্যের মধ্যে বিভক্ত হয়। এটি আমার আর্কিটেকচারের সাথে বেমানান বলে মনে হচ্ছে এবং আমার একটি আরও ভাল আন্দোলনের পূর্বাভাস অ্যালগরিদম নিয়ে আসা দরকার যা একটি (খুব প্রাথমিক) "নেটওয়ার্কযুক্ত পদার্থবিজ্ঞান" আর্কিটেকচারের কাছাকাছি।
সার্ভারটি প্যাকেটটি গ্রহণ করে এবং স্ক্রিপ্টের উপর ভিত্তি করে চলন টাইপ থেকে প্লেয়ারের গতি নির্ধারণ করে (প্লেয়ার কী রান করতে সক্ষম? প্লেয়ারের চলমান গতি পান)। একবার এর গতি হয়ে গেলে, এটি একে ভেক্টর - সত্তার গতিবেগের সাথে দিকের সাথে একত্রিত করে। কিছু প্রতারণামূলক সনাক্তকরণ এবং প্রাথমিক বৈধতা দেখা দেয় এবং সার্ভারের সাইডটি বর্তমান গতি, দিক এবং অবস্থানের সাথে আপডেট হয়। খেলোয়াড়দের চলাচলের অনুরোধের সাথে সার্ভারকে প্লাবন করা থেকে রোধ করতে বেসিক থ্রোটলিংও করা হয়।
নিজস্ব সত্তা আপডেট করার পরে, সার্ভারটি "অবতার অবস্থান আপডেট" প্যাকেটটি সীমার মধ্যে থাকা সমস্ত খেলোয়াড়ের জন্য সম্প্রচার করে। পজিশন আপডেট প্যাকেটটি রিমোট ক্লায়েন্টগুলির ক্লায়েন্ট সাইড ফিজিক্স সিমুলেশনগুলি (ওয়ার্ল্ড স্টেট) আপডেট করতে এবং ভবিষ্যদ্বাণী করতে এবং ক্ষতিপূরণে পিছিয়ে যায়।
পূর্বাভাস এবং লগ ক্ষতিপূরণ
উপরে উল্লিখিত হিসাবে, ক্লায়েন্টরা তাদের নিজস্ব অবস্থানের জন্য অনুমোদিত। প্রতারণা বা অসঙ্গতিগুলির ক্ষেত্রে ব্যতীত ক্লায়েন্টের অবতারটি সার্ভারের দ্বারা কখনও প্রতিস্থাপন করা যাবে না। ক্লায়েন্টের অবতারের জন্য কোনও এক্সট্রাপোলেশন ("এখন সরান এবং পরে ঠিক করুন") প্রয়োজন নেই - প্লেয়ার যা দেখেন তা সঠিক is যাইহোক, সমস্ত দূরবর্তী সত্তা যেগুলি চলমান হয় তাদের জন্য কিছু প্রকারের এক্সট্রাপোলেশন বা ইন্টারপোলেশন প্রয়োজন। ক্লায়েন্টের স্থানীয় সিমুলেশন / পদার্থবিজ্ঞানের ইঞ্জিনের মধ্যে স্পষ্টভাবে কোনও প্রকার ভবিষ্যদ্বাণী এবং / অথবা পিছিয়ে-ক্ষতিপূরণ প্রয়োজন।
সমস্যা
আমি বিভিন্ন অ্যালগরিদমের সাথে লড়াই করে চলেছি, এবং অনেকগুলি প্রশ্ন এবং সমস্যা রয়েছে:
আমার কি এক্সট্রাপোলটিং, ইন্টারপোলটিং বা উভয়ই হওয়া উচিত? আমার "অন্ত্রে অনুভূতি" হ'ল আমার বেগের উপর ভিত্তি করে খাঁটি এক্সট্রাপোলেশন ব্যবহার করা উচিত। রাষ্ট্রীয় পরিবর্তন ক্লায়েন্টের দ্বারা গৃহীত হয়, ক্লায়েন্ট একটি "পূর্বাভাস" গতি গণনা করে যা পিছিয়ে যাওয়ার জন্য ক্ষতিপূরণ দেয় এবং নিয়মিত পদার্থবিজ্ঞান সিস্টেম বাকী কাজটি করে। তবে এটি অন্যান্য সমস্ত নমুনা কোড এবং নিবন্ধগুলির সাথে মতবিরোধের বোধ করে - এগুলি সমস্তগুলি বেশ কয়েকটি রাজ্যের সঞ্চয় করে এবং পদার্থবিজ্ঞানের ইঞ্জিন ছাড়াই অন্তরঙ্গকরণ সম্পাদন করে বলে মনে হয়।
যখন কোনও প্যাকেট আসবে, আমি প্যাকেটের গতিবেগের সাথে একটি নির্দিষ্ট সময়কাল ধরে প্যাকেটের অবস্থানকে একত্রিত করার চেষ্টা করেছি (বলুন, 200 মিমি)। আমি তখন একটি নতুন ভেক্টর গণনা করার জন্য আন্তঃবিবাহিত অবস্থান এবং বর্তমান "ত্রুটি" অবস্থানের মধ্যে পার্থক্য নিই এবং প্রেরণীয় গতির পরিবর্তে সত্তার উপরে রাখি। তবে, ধারণাটি হ'ল সেই সময়ের ব্যবধানে অন্য একটি প্যাকেট আসবে এবং পরবর্তী প্যাকেটটি কখন আসবে "অনুমান করা" এটি অবিশ্বাস্যরকম কঠিন - বিশেষত যেহেতু তারা সবাই স্থির বিরতিতে আসে না (যেমন / রাষ্ট্রের পরিবর্তনগুলিও)। ধারণাটি মূলত ত্রুটিযুক্ত, বা এটি সঠিক তবে কিছু সংশোধন / সমন্বয় প্রয়োজন?
রিমোট প্লেয়ার থামলে কী ঘটে? আমি অবিলম্বে সত্তাকে থামাতে পারি, তবে এটি আবার না সরানো পর্যন্ত এটি "ভুল" স্পটে অবস্থান করবে। যদি আমি কোনও ভেক্টর অনুমান করি বা ইন্টারপোল্ট করার চেষ্টা করি তবে আমার একটি সমস্যা আছে কারণ আমি পূর্বের রাজ্যটি সংরক্ষণ করি না - পদার্থ বিজ্ঞানের ইঞ্জিনটির "আপনি এক্স অবস্থানে পৌঁছানোর পরে থামতে হবে" বলার উপায় নেই। এটি কেবল একটি বেগ বোঝে, এর চেয়ে জটিল কিছুই নয়। সত্তা বা পদার্থবিজ্ঞানের ইঞ্জিনে আমি "প্যাকেট মুভমেন্ট স্টেট" তথ্য যুক্ত করতে নারাজ, কারণ এটি বেসিক ডিজাইনের নীতিগুলি লঙ্ঘন করে এবং বাকি গেম ইঞ্জিনের পুরো অংশে নেটওয়ার্ক কোডকে রক্তাক্ত করে।
সত্তাগুলির সংঘর্ষ হলে কী হবে? তিনটি পরিস্থিতি রয়েছে - কন্ট্রোলিং প্লেয়ার স্থানীয়ভাবে সংঘর্ষ হয়, একটি অবস্থান আপডেটের সময় দুটি সত্ত্বার সার্ভারে সংঘর্ষ হয়, বা স্থানীয় ক্লায়েন্টের সাথে একটি দূরবর্তী সত্তা আপডেটের সংঘর্ষ ঘটে। সমস্ত ক্ষেত্রে আমি কীভাবে সংঘর্ষটি পরিচালনা করব তা অনিশ্চিত - প্রতারণা বাদ দিয়ে উভয় রাষ্ট্রই "সঠিক" তবে বিভিন্ন সময়সীমার মধ্যে। কোনও প্রত্যন্ত সত্তার ক্ষেত্রে এটি কোনও প্রাচীরের মধ্য দিয়ে হাঁটতে আঁকতে বুদ্ধিমান হয় না, তাই আমি স্থানীয় ক্লায়েন্টের সাথে সংঘর্ষ সনাক্তকরণ সম্পাদন করি এবং এটি "থামাতে" পারি। উপরের পয়েন্ট # 2 এর উপর ভিত্তি করে, আমি একটি "সংশোধনকারী ভেক্টর" গণনা করতে পারি যা ধারাবাহিকভাবে "প্রাচীরের মধ্য দিয়ে" সত্তাকে সরানোর চেষ্টা করে যা কখনই সফল হতে পারে না - ত্রুটি খুব বেশি না হওয়া পর্যন্ত দূরবর্তী অবতার সেখানে আটকে থাকে এবং এটি "স্ন্যাপস" হয়ে যায় অবস্থান। গেমগুলি কীভাবে এটিকে ঘিরে কাজ করে?