আমি একটি দ্রুত গতিতে পদার্থবিজ্ঞানের খেলা করছি যা একটি টেবিল হকি। দুটি মাললেট এবং একটি পাক দিয়ে। গেমটি আইফোন / আইপ্যাডে চলে এবং আমি গেমসেন্টারটির মাধ্যমে মাল্টিপ্লেয়ার অংশটি করছি।
নেটওয়ার্ক সিস্টেমটি এভাবেই কাজ করে। ক্লায়েন্ট যা ম্যাচটি তারা করে, এটি সার্ভার হিসাবে নিষ্পত্তি হবে এবং ম্যাচের অনুরোধটি গ্রহণকারী হ'ল ক্লায়েন্ট।
'সার্ভারে' পদার্থবিজ্ঞান চলছে এবং প্রতিক্রিয়া তাত্ক্ষণিক এবং ক্লায়েন্টের সাথে তাদের পদার্থবিজ্ঞানও চলছে তাই বার্তা বিনিময়ের মধ্যে এটি মসৃণ দেখাচ্ছে সার্ভার হিসাবে আমি যা করি তা হ'ল আমি ক্লায়েন্টকে আমার হাঁসের বেগ এবং আমার অবস্থান প্রেরণ করি এবং ক্লায়েন্টটি তার সিঙ্গী ধরে রাখতে সার্ভারের সাথে সম্পর্কিত তার হাঁসের বেগ / অবস্থান সামঞ্জস্য করে। অন্যথায় পদার্থবিজ্ঞান বিভক্ত হয় এবং এটি এটিকে স্ক্রু করে দেয়।
নেটওয়ার্কের বিলম্বিতা যখন ভাল হয়, তখন 100 মিমি ফলাফল খুব ভাল হয়, আমি ক্লায়েন্টের পক্ষে একটি মসৃণ প্লেযোগ্য খেলাম এবং অদ্ভুত আচরণ সর্বনিম্ন। ল্যাগটি 150 থেকে 200 মিমি হয়ে গেলে সমস্যাটি ঘটে। সেক্ষেত্রে ঘটে যায় যে আমার ক্লায়েন্ট পাকটি ইতিমধ্যে একটি কিনারা এবং উল্টানো দিকটি আঘাত করেছে তবে এটি সার্ভার থেকে একটি বিলম্ব বার্তা পেয়েছে এবং এটি কিছুটা ব্যাক করে যাতে বল আচরণের জন্য একটি অদ্ভুত অনুভূতি হয়।
আমি এটি সম্পর্কে কয়েকটি জিনিস পড়েছি:
সিঙ্ক্রোনাইজেশন উদাহরণ ক্লিক করুন
সুতরাং, আমি কীভাবে এটি সমাধান করতে পারি? আমি যতক্ষণ না আমার কাছে সর্বোত্তম বিকল্পটি পড়েছি তা হ'ল একটি টাইমস্ট্যাম্প সহ সার্ভার / ক্লায়েন্টের সাথে একটি ক্লক সিঙ্ক্রোনাইজেশন করা যাতে আমি যখন আমার ঘড়ির সাথে সম্পর্কিত বিলম্ব বার্তাগুলি পাই তখন আমি কেবল তখনই উপেক্ষা করে ক্লায়েন্টদের সিমুলেশনটি করি কাজ। আপনি কি এর সাথে একমত? এবং যেহেতু আমি ডেটা অবিশ্বাস্য (ইউডিপি) প্রেরণ করছি আমি বিলম্বিত বার্তা বা বার্তাগুলিকে ক্রম ছাড়িয়ে যেতে পারি।
যদি এটি সর্বোত্তম পন্থা হয় তবে আমি কীভাবে ক্লক সিঙ্ক্রোনাইজেশন প্রয়োগ করব। আমি কীভাবে করব সে সম্পর্কে পদক্ষেপগুলি পড়েছি কিন্তু আমি এটি বেশ বুঝতে পারি নি।
এটি বলে যে:
- ক্লায়েন্ট বর্তমান সময়ের স্থানীয় সময়কে "সময় অনুরোধ" প্যাকেটে স্ট্যাম্প দেয় এবং সার্ভারে প্রেরণ করে।
- সার্ভার দ্বারা প্রাপ্তি পরে, সার্ভার সার্ভার-সময় স্ট্যাম্প এবং রিটার্ন
- ক্লায়েন্ট দ্বারা প্রাপ্তির পরে, ক্লায়েন্ট প্রেরিত সময় থেকে বর্তমান সময়কে বিয়োগ করে এবং গণনা করতে বিলম্বের জন্য দুটি দ্বারা ভাগ করে। এটি ক্লায়েন্ট-সার্ভারের সময় ব-দ্বীপ নির্ধারণের জন্য সার্ভার সময় থেকে বর্তমান সময়কে বিয়োগ করে এবং সঠিক ঘড়ির ব-দ্বীপটি পেতে অর্ধ-বিলম্বিতভাবে যুক্ত করে। (এখনও পর্যন্ত এই অ্যালগোথিম এসএনটিপির সাথে খুব মিল)
- ক্লায়েন্ট প্রতিটি সময় কয়েক সেকেন্ড বিরতি দিয়ে 1 থেকে 3 পাঁচ বা তার বেশি বার পুনরাবৃত্তি করে। অন্তর্বর্তী সময়ে অন্যান্য ট্র্যাফিকের অনুমতি দেওয়া যেতে পারে তবে সেরা ফলাফলের জন্য এটি হ্রাস করা উচিত প্যাকেটের প্রাপ্তিগুলির ফলাফলগুলি সঞ্চিত হয় এবং সর্বাধিক-বিলম্বিত ক্রমে সর্বনিম্ন-বিন্যাসে বাছাই করা হয়। এই আদেশ তালিকা থেকে মিড পয়েন্ট নমুনা বাছাইয়ের মাধ্যমে মিডিয়েন ল্যাটেন্সি নির্ধারণ করা হয়।
- মিডিয়ান থেকে আনুমানিক 1 স্ট্যান্ডার্ড-বিচ্যুতির উপরের সমস্ত নমুনাগুলি বাতিল করা হয় এবং বাকী নমুনাগুলি একটি গাণিতিক গড় ব্যবহার করে গড়ে গড়ে নেওয়া হয়।
এই উদাহরণ অনুসরণ করে আমার এই হবে:
গেমটি লোড হয়ে গেছে এবং আমার ক্লায়েন্টের সময় এখন 0 হয়ে গেছে তা ভেবে দেখা যাক, তাই আমি সার্ভারে প্রেরণ করি যে আমার সময় 0।
এই বার্তাগুলি সার্ভারে পেতে 150 মিমি লাগে তবে সার্ভারের ঘড়িটি ইতিমধ্যে শুরু হয়ে গেছে এবং ক্লায়েন্টের থেকে 1 সেকেন্ড এগিয়ে। যখন সার্ভার বার্তাটি পাবে তখন সময়টি হবে: 1.15 এবং ক্লায়েন্টকে সেই সময়টি প্রেরণ করে, আমরা কি ভাল আছি? আমাদের ল্যাগটি 150 মিমি থেকে ধ্রুবক রয়েছে tend
এখন ক্লায়েন্টটি 1.15 সময় গ্রহণ করে এবং প্রেরিত সময় থেকে বর্তমান সময়কে বিয়োগ করে এবং দুটি দ্বারা বিভাজন গণনা করতে বিলম্ব করে। যা হ'ল: 0.3 - 0 = 0.3 / 2 -> 150 মিমি।
এটি ক্লায়েন্ট-সার্ভারের সময় ব-দ্বীপ নির্ধারণের জন্য সার্ভার সময় থেকে বর্তমান সময়কে বিয়োগ করে এবং সঠিক ঘড়ির ব-দ্বীপটি পেতে অর্ধ-বিলম্বিতভাবে যুক্ত করে:
ক্লায়েন্টের সময়: 0.3 সার্ভারের সময় 1.15
0.3 - 1.15 = .85 + ল্যাটেন্সি (.15) = 1
কীভাবে এটি সিঙ্ক্রোনাইজ করা হয়? আমি কী মিস করছি?
এটি মাল্টিপ্লেয়ার এবং নেটওয়ার্কের অভিজ্ঞতায় আমার প্রথমবার, তাই আমি কিছুটা বিভ্রান্ত।
ধন্যবাদ.