সার্ভার-সাইড ইনপুট


9

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

এটি একটি বড় সমস্যা ব্যতীত: সত্যিই ভাল কাজ করে: প্রান্তগুলি বন্ধ হয়ে। মূলত, যদি কোনও খেলোয়াড় কোনও প্রান্তের দিকে হাঁটতে থাকে, একটি ক্লিফটি বলুন এবং প্রান্ত থেকে যাওয়ার আগে থামে, কখনও কখনও দ্বিতীয় পরে, তাকে প্রান্তের বাইরে টেলিফোর্ড করা হবে। এর কারণ সার্ভার তথ্য প্রসেস করার পরে "আমি টিপতে ডাব্লু" প্যাকেট প্রেরণ করা হয়।

আমার অর্থ কী তা বুঝতে আপনাকে সাহায্য করতে এখানে একটি ল্যাগ ডায়াগ্রাম রয়েছে: http://i.imgur.com/Prr8K.png

সার্ভারটি প্রক্রিয়া করার জন্য আমি প্রতিটি ফ্রেমকে কেবল "ডাব্লু প্রেসিডে" প্যাকেট পাঠাতে পারি, তবে এটি ব্যান্ডউইথ-ব্যয়বহুল সমাধান বলে মনে হয়।

কোন সাহায্য প্রশংসা করা হয়!

উত্তর:


5

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

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

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

আমার মনে হয় যা হওয়া উচিত is

client sends a move + position update
server gets it t+latency time later
server verifies and sends out info to all clients
client receives this at (t+latency + latency)

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


ক্লায়েন্ট তার অবস্থানটি মোটেও প্রেরণ করে না; এটি কেবল ভবিষ্যদ্বাণী করে / ইন্টারপোলিট করে। এই কারণেই এটি প্রান্তে পড়ে যখন মনে হয় এটি প্রান্তে রয়েছে। এছাড়াও, আমি দেখতে পাচ্ছি না যে আমি কোথায় পিছিয়েছিলাম 1 সেকেন্ড, এটি 8 মিমি (স্থানীয় টেস্টিং) থেকে 100 মিমি (ইন্টারনেটের মাধ্যমে) এর মতো। আমি বলেছিলাম যে প্লেয়ারটি পরে ফিরে আসছিল কারণ আমি পর্যায়ক্রমে পুরো পজিশনের আপডেট পাঠিয়ে থাকি। আমি কি বোঝার ক্ষেত্রে সঠিক হয়েছি যে ক্লায়েন্টটি চাপানো চাবিগুলি সহ ক্লায়েন্টের এটির হওয়া উচিত বলে মনে করে সেই অবস্থানটি পাঠানো উচিত এবং সার্ভারটি যাচাই করা সম্ভব হয়েছে তা যাচাই করা উচিত?
থমাস

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

এটি কি এখনও প্লেয়ারটিকে সার্ভারের কিনারায় পড়ে যেতে পারে না? আমি প্রতিটি ফ্রেমকে প্যাকেট না পাঠালে সার্ভারটি এখনও ভাবতে পারে যে প্লেয়ারটি প্রায় 32 মিমি নিয়ে চলেছে। (আমি কেবল প্রতি তিনটি ফ্রেমে প্যাকেট পাঠাই)। বা আপনি কি পরামর্শ দিচ্ছেন যে আমি সার্ভারে মোটেও ইনপুট অনুকরণ করি না, তবে কেবল অবস্থানটি চাপানো ইনপুটের সীমানায় রয়েছে কিনা তা পরীক্ষা করে দেখুন?
থমাস

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

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

0

আমি আপনার প্রশ্নটি বুঝতে পেরেছি:

আমি 'ফরোয়ার্ড' বোতাম টিপতে শুরু করি এবং শেষ পর্যন্ত 'ফরওয়ার্ড' বোতামটি ছেড়ে দিলে সার্ভারটি একটি প্যাকেট পায়। সুতরাং সার্ভারে আসল চলাচল শুরু হয় এবং প্রায় 100 মিলিসেকেন্ড 'খুব দেরিতে' বাস্তব খেলায় বনাম। খেলোয়াড় ক্লায়েন্ট-সাইডে কী প্রকাশ করছে। সুতরাং যদি প্লেয়ারটি 10 ​​সেকেন্ড সরে যেতে চায়, তবে x >= 1অনলাইনে পরিবর্তে সে 10.x সেকেন্ড সরে যেতে পারে ।

এটি একটি খারাপ ডিজাইনের কৌশল কারণ এটি খেলোয়াড়ের ইচ্ছা হিসাবে গেমের জগতে প্লেয়ারের ইচ্ছাকে প্রকাশ করে না, বরং ব্যবহারকারীদের বরং অভিজ্ঞতা অর্জন করে।

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

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

সুতরাং মূলত আপনাকে কোন প্যাকেট প্রেরণ করতে হবে যে কোন বোতামটি টিপিত হয় এবং বাটনটি টিপে দেওয়ার আসল খেলার সময়টি ছিল এবং তারপরে, কোন বোতামটি প্রকাশ হয়েছিল এবং কোন সঠিক সময়ে।


যেমন আমি প্যাট্রিককে বলেছিলাম, আমি মনে করি যে সমাধানটি আরও বেশি একটি তাত্ত্বিক পদ্ধতির হবে; সার্ভারটি "দ্য ম্যান" হওয়ার পরিবর্তে সার্ভারটি বৈধতার জন্য ক্লায়েন্টের ডেটা পরীক্ষা করে। অবশ্যই এটি কিছুটা অবকাশ তৈরি করতে হবে যাতে পিছনে বা অন্যান্য নেটওয়ার্ক সমস্যাগুলি মিথ্যা ধনাত্মকতা তৈরি না করে।
থমাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.