ক্লায়েন্ট এবং সার্ভার উভয়ই পদার্থবিজ্ঞানের সিমুলেশন চালাবেন?


13

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

  1. বর্তমানে আমার কাছে একটি অনুমোদিত গেম সার্ভার রয়েছে যা বাক্স 2 ডি দিয়ে পদার্থবিজ্ঞানের অনুকরণ করে এবং প্রতি সেকেন্ডে প্রায় 20 বার ক্লায়েন্টদের কাছে বিশ্বের অবস্থা প্রেরণ করে। প্রতিটি ক্লায়েন্ট সর্বশেষ প্রাপ্ত কয়েকটি স্ন্যাপশট ট্র্যাক করে রাখে এবং স্প্রাইটের চলাচল মসৃণ করতে দুটি রাজ্যের মধ্যে লিপ্প করে। তবে এটি এতটা মসৃণ নয়। এটি কিছুক্ষণের জন্য মসৃণ হতে পারে, তারপরে কিছুটা ঝাঁকুনির পরে, আবার মসৃণ হয়ে যাওয়া ইত্যাদি I আমি টিসিপি এবং ইউডিপি উভয়ই চেষ্টা করেছি, উভয়ই প্রায় একই। আমার সমস্যা কি হতে পারে কোন ধারণা? (দ্রষ্টব্য: আমি এটি প্রথম একক প্লেয়ারের জন্য প্রয়োগ করেছি এবং পদার্থবিজ্ঞানের জগতে প্রতি সেকেন্ডে মাত্র 20 বার আপডেট করার সময় স্প্রেট মুভমেন্ট 60fps এ পুরোপুরি মসৃণ হয়)।

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

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

ধন্যবাদ!

উত্তর:


10

অবশ্যই ক্লায়েন্ট এবং সার্ভার উভয়ই সিমুলেশন চালান। অন্য যে কোনও কিছুতে খুব দীর্ঘ বিলম্ব রয়েছে। আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে একই ক্রমে অবজেক্টগুলি সন্নিবেশ করে নির্দিষ্ট সময় পদক্ষেপটি ব্যবহার করে এবং পয়েন্টার তুলনা এড়িয়ে সিমুলেশনগুলি মিলছে। আমি বক্স 2 ডি দিয়ে এটি চেষ্টা করে দেখিনি তবে একটি পদার্থবিজ্ঞানের সিমুলেশনে সাধারণত সমস্ত মেশিনে একই আচরণ অর্জন করা সম্ভব। সমস্ত গণিত সাধারণত আইইইই 754 বাইনারি 32 ফ্লোটের উপর ভিত্তি করে থাকে এবং তাদের আচরণটি +-*/কয়েকটি নামকরণের মতো ক্রিয়াকলাপের জন্য কঠোরভাবে সংজ্ঞায়িত হয় । আপনার সম্পর্কে যত্নবান হওয়া দরকার sin,cosএবং পছন্দগুলি শক্ত, যেহেতু তারা রানটাইমের মধ্যে পার্থক্য করতে পারে (একাধিক প্ল্যাটফর্মের জন্য বিকাশ করার সময় এটি বিশেষত গুরুত্বপূর্ণ)। এছাড়াও আপনি আপনার সংকলকটিতে ভাসমান অপ্টিমাইজেশনের জন্য একটি কঠোর সেটিংস ব্যবহার করেছেন তা নিশ্চিত করুন। আপনি এখনও সার্ভার থেকে অবজেক্টের স্থিতি পর্যায়ক্রমে প্রেরণ করে অবজেক্টগুলি সিঙ্ক্রোনাইজ করতে পারেন। অপ্রয়োজনীয় স্টাটারিং এড়ানোর জন্য পার্থক্যটি একটি প্রান্তিকের চেয়ে বড় না হওয়া পর্যন্ত আপডেট করবেন না।

একটি বিষয় যা মনে মনে আসে তা হ'ল নতুন অবজেক্ট তৈরি এবং এটি কীভাবে ক্লায়েন্টদের মধ্যে সিমুলেশন পরিবর্তন করে। এটির সমাধানের একটি উপায় হ'ল সার্ভারকে সমস্ত অবজেক্ট তৈরি করতে দেওয়া। বর্তমান সময়ের পদক্ষেপটি যদি হয় tতবে সার্ভারটি একটি সামগ্রীতে যোগ করার জন্য সময় নির্ধারণ করবে t+d। সুতরাং, যুক্ত করতে ও কখন যুক্ত করতে হবে সেগুলি সহ একটি নতুন-অবজেক্টের তালিকা সমস্ত ক্লায়েন্টে বজায় রাখা যেতে পারে এবং সার্ভারের দ্বারা আগেই আপডেট করা যায়। যদি dযথেষ্ট বড় হয় তবে আপনি বিভিন্ন ফলাফলের ঝুঁকি হ্রাস করেন। আপনি যদি সত্যিই পার্থক্য পরিচালনা করতে না পারেন তবে আপনি কোনও ক্লায়েন্টকে সেই সময় পদক্ষেপের অনুকরণের আগে নির্দিষ্ট সময়ের জন্য নতুন অবজেক্টগুলির জন্য তথ্যের জন্য অপেক্ষা করতে বাধ্য করতে পারেন।


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

ইরিন কাত্তো মনে করেন, একাধিক বক্স 2 ডি ওয়ার্ল্ডের পুরো রাজ্যকে সিঙ্কের মধ্যে রাখার চেষ্টা করা হেরে যাওয়া লড়াই ( box2d.org/forum/viewtopic.php?f=3&t=8462 )
পাভেল

বিবৃতি "আইইইই 754 বাইনারি 32 ভাসমান [..] আচরণ যেমন কঠোরভাবে সংজ্ঞায়িত করা হয় যেমন অপারেশনগুলির জন্য +-*/" সম্পূর্ণ মিথ্যা। আইইইই -754 এ সমস্ত অপারেশন বাস্তবায়নের ভিত্তিতে পরিবর্তিত হতে পারে। দেখুন এখানে এবং এখানে আরও তথ্যের জন্য।
ব্লুরাজা - ড্যানি প্লেফুঘুফুট

1
না। এটি সম্পূর্ণ সত্য। আপনার লিঙ্কটি যে সমস্যাটি বর্ণনা করেছে তা x87 fpu এর বিভিন্ন মোড এবং ট্রান্সসেন্ডেন্টালের বাস্তবায়নের সাথে সম্পর্কিত। আইইইই 754 binary32 হয় কঠোরভাবে মৌলিক অপারেশন জন্য সংজ্ঞায়িত। সঠিক মোডগুলি সেট করা এবং সঠিক নির্দেশাবলীর ব্যবহার করা আপনার উপর নির্ভর করে যাতে মান অনুসরণ করা হয়। কেবল এসএসই নির্দেশাবলী ব্যবহার করুন এবং x87 এফপিইউ অনেক সহায়তা করে না।
রসমাস

4

এটি সম্ভবত এতটা ভাল লাগছে না যেহেতু তাদের মধ্যে ইন্টারপোল্টিং সর্বদা পরের ডেটার অভ্যন্তরে বিভক্ত হওয়ার উপর নির্ভর করে। এর অর্থ হ'ল, যদি একটি সংক্ষিপ্ত পিছনে স্পাইক থাকে তবে সমস্ত কিছু ধরতে অপেক্ষা করতে হবে।

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


এই ক্ষেত্রে হতে পারে। সার্ভার থেকে 3 টি স্ন্যাপশট না পাওয়া পর্যন্ত আমি যা করার চেষ্টা করছি তা বিলম্ব হয়। আমি প্রথমে শট 1 থেকে শট 2 তে লারপ করেছিলাম। তারপরে শট 2 থেকে শট 3 এ। কোনও পয়েন্টে যদি আমি কোনও প্যাকেট মিস করি তবে আমি 1 থেকে 2 এর পরিবর্তে 1 থেকে 3 পর্যন্ত লার্প করতে পারি, যদি এটি বোঝা যায়। যদিও আমি এখনও এটি সঠিকভাবে প্রয়োগ করতে যাচ্ছি না। নিবন্ধটির লিঙ্কের জন্য ধন্যবাদ!
ভেনেসেট্রিক্স

1

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

অবশ্যই, এখানে সমস্যাটি হ'ল সত্তার উপর কোনও কেন্দ্রীভূত নিয়ন্ত্রণ নেই, তবে আমি মনে করি যে এটি সার্ভারের পাশাপাশি ফিজিক্সের সার্ভার-সাইড সিমুলেশন করেও করা যেতে পারে think


আপনার ইনপুট জন্য ধন্যবাদ। প্রতারণা রোধ করতে আমাদের কেন্দ্রীয় নিয়ন্ত্রণের প্রয়োজন হবে, তাই ক্লায়েন্টরা কী করছেন তারা কি করছে তা সম্ভব কিনা তা জানতে আমাদের কমপক্ষে একটি সিমুলেশন চালাতে হবে।
ভেনেসেক্ট্রিক্স

1

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

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

প্রশ্ন 1 হিসাবে, আমি বলছি যে সমস্যাটি বিলম্বের দিকে ওঠানামা হবে, কারণ স্ন্যাপশট প্রাপ্তির মধ্যে প্রতিটি প্রাপ্তির মধ্যে একেবারে নিখুঁত 20 সেকেন্ড ব্যবধান থাকবে কিনা এমন কোনও গ্যারান্টি নেই। আমাকে চিত্রিত করতে দিন (সময়টি "টি" হিসাবে মিলি সেকেন্ডে পরিমাপ করা হয়):

1) টি = 20 এ গেম শুরু হওয়ার পরে, ক্লায়েন্ট একটি স্ন্যাপশট পেয়েছিল এবং সাফল্য এবং সাবলীলভাবে ইন্টারপোলেশনটি করেছিল।

২) টি = ৪০ এ সার্ভার এবং ক্লায়েন্টের মধ্যে একটি বিলম্ব হয়েছে এবং স্ন্যাপশটটি কেবল টি = 41 এ পৌঁছানোর জন্য ঘটেছে।

3) টি = 60 এ, সার্ভারটি অন্য একটি স্ন্যাপশট প্রেরণ করেছে, তবে সিমুলেশনের এক সেকেন্ডের বিলম্বের কারণে ক্লায়েন্টাইড নষ্ট হয়েছিল। যদি স্ন্যাপশট টি = 60 এ আসে, ক্লায়েন্টটি 40 এবং 60 তাত্ক্ষণিকের সংক্ষেপণ করবে না, তবে তাত্ক্ষণিকভাবে 41 থেকে 60 পর্যন্ত আলাদা আচরণ তৈরি করবে। এই অনর্থকতা পরিণতিগত "জারকি" হওয়ার কারণ হতে পারে।

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


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

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