গেম ডেভলপমেন্টের জন্য কীভাবে নেটওয়ার্কিং এর মাধ্যমে ক্লকগুলি সিঙ্ক করবেন?


10

আমি এমন একটি গেম লিখছি যার অনেক সময় ভিত্তিক দিক রয়েছে। নেটওয়ার্ক স্টল এবং প্যাকেটগুলি (এবং প্যাকেটের প্রাপ্তির সময় না পাওয়ার সময়) প্লেয়ারগুলি অতিক্রম না করে প্লেয়ারের অবস্থানগুলি অনুমান করতে সহায়তা করার জন্য আমি সময় ব্যবহার করি। এটি একটি প্যাকম্যান টাইপ খেলা এই অর্থে যে কোনও খেলোয়াড় একটি দিক নিয়ে যায় এবং চলমান থামাতে পারে না, সুতরাং সেই ব্যবস্থাটি বোঝায় (বা কমপক্ষে আমি মনে করি এটি এটি করে) does

সুতরাং আমার দুটি প্রশ্ন রয়েছে: 1) নেটওয়ার্কে দেরি হওয়ার কারণে আমি কীভাবে শুরুতে গেমসের ঘড়িগুলি সিঙ্ক করব। 2) এগুলি কী সিঙ্ক করা ঠিক নয় এবং কেবল ধরে নেওয়া উচিত যে সেগুলি একই (আমার কোড সময়-অঞ্চলটি স্বাধীন)। এটি একটি দুর্দান্ত প্রতিযোগিতামূলক খেলা নয় যেখানে লোকেরা তাদের ঘড়িগুলি ঠকায় বদলে দেবে, তবে এখনও।

গেমটি জাভা এবং পাইথনে প্রোগ্রাম করা হচ্ছে (প্রকল্প হিসাবে সমান্তরাল বিকাশ)



5
আমি নিশ্চিত যে এই প্রশ্নটি ইতিমধ্যে গেমদেব.স্ট্যাকেক্সেক্সঞ্জ.কম এ coveredাকা আছে বা কমপক্ষে এটি সেখানে রয়েছে there
কংগ্রেসবঙ্গাস

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

2
আপনি ইতিমধ্যে আইপিভি 4 বিকল্পটি টাইমস্ট্যাম্প ব্যবহার করার চেষ্টা করেছেন? আরও তথ্য রয়েছে linux.die.net/man/7/socket সেখানে থেকে linux.die.net/man/3/cmsg একটি ক্ষুদ্র উদাহরণ প্রোগ্রাম এবং তারপর pdbuchan.com/rawsock/rawsock.html আগে গত এক আইপিভি 6 বিভাগ।
অট--

2
গেমস (অ্যাপ্লিকেশন) সিস্টেম ঘড়ির স্পর্শ করা উচিত নয়।
মনিকা পুনরায় ইনস্টল করুন - এম শ্র্র্ডার

উত্তর:


9

আমি মনে করি এটি অবশ্যই সিস্টেমে ঘড়ির সাথে সংহত করা ঠিক নয় । ব্যবহারকারী আপনাকে সিস্টেম সেটিংস স্পর্শ করবে এমন প্রত্যাশা করে না এবং অনেকগুলি সিস্টেম আপনাকে এমনকি করতে দেয় না।

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

প্রাথমিক ধারণাটি হ'ল প্রতিটি প্যাকেটের মাধ্যমে আপনি টাইমস্ট্যাম্প প্রেরণ করেছিলেন এবং যখন আপনি অন্য দিক থেকে শেষ প্যাকেটটি পেয়েছেন তখন এটি পাঠিয়েছেন এবং টাইমস্ট্যাম্পের সিকোয়েন্স নম্বর এবং টাইমস্ট্যাম্প। এ থেকে আপনি রাউন্ডট্রিপ গণনা করুন: উদাহরণস্বরূপ যদি প্যাকেট কিউ বলে যে এটি 1000 এ প্রেরণ করা হয়েছিল এবং প্যাকেট পি 500 পেয়েছিল, আপনি প্যাকেট পি 0 পাঠিয়েছেন এবং 800 এ কিউ পাচ্ছেন, রাউন্ড ট্রিপটি (800 - 0 ) - (1000 - 500) = 300. অ্যাসিমেট্রিটি জানার কোনও উপায় নেই, সুতরাং আপনি কেবল ধরে নিন যে প্যাকেটটি উভয় দিকের অর্ধেক (150) টিক নেয়। এবং সেই দূরবর্তী টাইমস্ট্যাম্পটি স্থানীয় - 1000 - (800 - 150) = 350 টিকি দ্বারা এগিয়ে। রাউন্ড ট্রিপ বিভিন্ন হবে। আপনি যদি ধরে নেন যে ঘড়িটি যুক্তিসঙ্গতভাবে সুনির্দিষ্ট হয় তবে আপনার সম্পর্কের দীর্ঘমেয়াদী গড় ব্যবহার করা উচিত।

দ্রষ্টব্য, আপনি ঘড়িটির জন্য সিস্টেম ঘড়িটি ব্যবহার করতে চান না। তারা আপনাকে মাঝপথে ফেলে দিয়ে পুনরায় সংক্রামিত হতে পারে। আপনার clock(CLOCK_MONOTONIC)ইউনিক্স বা GetTickCountউইন্ডোজে ব্যবহার করা উচিত (কীভাবে এই মুহুর্তে জাভা বা পাইথনগুলিতে এই API গুলি মোড়ানো রয়েছে তা নিশ্চিত নয়) not


দ্রষ্টব্য: SO_TIMESTAMPসকেট বিকল্প ( সকেট দেখুন ()) উট দ্বারা উল্লেখ করা হয়েছে - প্রশ্নে মন্তব্য করে) প্যাকেটগুলি প্রাপ্ত ইভেন্ট লুপটির বিলম্বের প্রভাবকে পৃথক করার জন্য কার্যকর হবে। আপনার প্রচেষ্টাটি কতটা যথাযথ নির্ভুলতার প্রয়োজন তা নির্ভর করে।


1

আপনি কীভাবে জানবেন কোন খেলোয়াড়ের ঘড়িটি সঠিক? আপনি না, তাই একটি রেফারেন্স ক্লক ব্যবহার করুন ।

এনটিপি এখানে ওভারকিল করেছে - আপনার কেবলমাত্র second 1 সেকেন্ডের যথার্থতা প্রয়োজন - তাই rdate ব্যবহার করুন বা অনেকগুলি ক্লক সিঙ্ক্রোনাইজেশন অ্যালগরিদম থেকে একটি বেছে নিন

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


1

আমি দ্বিতীয় বিবৃতি দিয়ে বলছি যে আপনি এটির জন্য এনটিপি ব্যবহার বা সিস্টেম ঘড়ির কাছাকাছি যাওয়া উচিত নয়। যদি আপনি প্রকৃতপক্ষে এই প্রয়োজনীয়তাটি পরীক্ষা করেন তবে আপনি নীচের প্রয়োজনীয়তাগুলি দেখতে পাচ্ছেন:

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

এটি একটি সরলিকৃত রূপরেখা - আমি বিলম্বিতা / বাদ পড়া প্যাকেট / ইত্যাদি সম্পর্কিত বিষয়গুলি মোকাবিলার চেষ্টা করি না - তবে এটি মূল কাঠামো যার ভিত্তিতে পুরো জিনিসটি ভিত্তিক হওয়া উচিত।

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

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