অন্তহীন রানারে আসলে কী চলছে?


107

উদাহরণস্বরূপ বিখ্যাত ফ্লাপি পাখি খেলা, বা যা কিছু সত্যিই সাজান, সে খেলোয়াড় (এক্ষেত্রে পাখি, বা আপনি যে ক্যামেরাটিকে পছন্দ করেন) এগিয়ে চলেছেন বা পুরো পৃথিবী পিছনের দিকে এগিয়ে চলেছে (পাখিটি কেবলমাত্র Y এর অবস্থান পরিবর্তন করে এবং এর একটি রয়েছে ধ্রুব এক্স অবস্থান)?


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

উত্তর:


146

ফিলিপের উত্তরের সাথে আমি কিছুটা দ্বিমত পোষণ করছি ; বা কমপক্ষে কীভাবে তিনি এটি উপস্থাপন করেছিলেন with এটি এমন ধারণা দেয় যে প্লেয়ারের চারপাশে বিশ্বকে সরিয়ে নেওয়া আরও ভাল ধারণা হতে পারে; যখন এটি ঠিক বিপরীত সুতরাং এখানে আমার নিজস্ব উত্তর ...


উভয় বিকল্পই কাজ করতে পারে তবে বিশ্বজুড়ে খেলোয়াড়ের চেয়ে খেলোয়াড়কে ঘিরে বিশ্বজুড়ে "পদার্থবিজ্ঞান উল্টে দেওয়া" সাধারণত একটি খারাপ ধারণা।


কর্মক্ষমতা ক্ষতি / অপচয়:

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

এটি (স্পষ্টতই) কেবল যা চালিত হচ্ছে তা চালানোর চেয়ে যথেষ্ট ব্যয়বহুল (প্লেয়ার এবং সম্ভবত আরও কয়েকটি স্টাফ)।


রক্ষণাবেক্ষণ এবং এক্সটেনসিবিলিটি:

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

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


তাহলে উত্তরটি কেবল তখনই প্লেয়ারকে সরানো!

ভাল ... হ্যাঁ এবং না । ফিলিপের উত্তরে যেমন উল্লেখ করা হয়েছে, অসীম-রানার ধরণের খেলায় (বা কোনও বৃহত বিরামবিহীন ব্যবহারযোগ্য অঞ্চল সহ যে কোনও খেলা), উত্স থেকে অনেক দূরে গেলে অবশেষে লক্ষণীয় এফপিপিই ( ভাসমান-পয়েন্ট যথার্থ ত্রুটি ) প্রবর্তিত হবে , এবং আরও অবশেষে, সংখ্যার প্রকারকে উপচে পড়ুন, হয় আপনার গেমটি ক্র্যাশ করে দেয় বা মূলত গেম-ওয়ার্ল্ড ধূমপানকে ক্র্যাক করে তোলে ... স্টেরয়েডগুলিতে! 😵 (কারণ এই মুহুর্তে, এফপিপিইস গেমটি ইতিমধ্যে "স্বাভাবিক" ক্রাকে পরিণত করবে)


প্রকৃত সমাধান:

দুটোই কর না এবং কর! আপনার উচিত বিশ্ব স্থির রাখা, এবং প্লেয়ারটিকে তার চারপাশে সরিয়ে নেওয়া। খেলোয়াড় যখন দৃশ্যের মূল (অবস্থান ) থেকে খুব দূরে যেতে শুরু করেন তবে খেলোয়াড় এবং বিশ্ব উভয়ই "রি-রুট" হন । [0, 0, 0]

আপনি যদি জিনিসগুলির আপেক্ষিক অবস্থান (চারপাশের বিশ্বের খেলোয়াড়) রাখেন এবং এই প্রক্রিয়াটি একক ফ্রেম-আপডেটে করেন তবে (প্রকৃত) প্লেয়ারটি এমনকি খেয়াল করবে না!

এটি করতে আপনার কাছে দুটি প্রাথমিক বিকল্প রয়েছে:

  1. প্লেয়ারটিকে দৃশ্যের মূলে নিয়ে যান এবং প্লেয়ারের তুলনায় বিশ্বব্যাপী তার নতুন অবস্থানে নিয়ে যান।
  2. গ্রিডের মতো বিশ্বকে ভাবুন; প্লেয়ারটি গ্রিডের যে অংশটি মূলের সাথে রয়েছে সে অংশটি সরান এবং প্লেয়ারটিকে গ্রিডের সেই অংশের তুলনায় নতুন অবস্থানে নিয়ে যান।

কার্যত এই প্রক্রিয়াটির একটি উদাহরণ এখানে


তবে, কত দূরে?

আপনি যদি ইউনিটির উত্স-কোডটি দেখেন তবে তারা 1e-5( 0.00001) দুটি ভাসমান-পয়েন্টের মানগুলিকে "সমান" বিবেচনা করার ভিত্তি হিসাবে ব্যবহার করে Vector2এবং Vector3(বস্তুর অবস্থানের জন্য দায়ী ডেটা-প্রকার, [এলিউর-] আবর্তন এবং স্কেল)। যেহেতু ভাসমান-পয়েন্ট যথার্থতা ক্ষতি শূন্য থেকে উভয় পথ দূরে ঘটে, তাই এটি ধরে নেওয়া নিরাপদ যে দৃশ্যের মূল / উত্স থেকে দূরে 1e+5( 100000) ইউনিটের অধীনে যে কোনও কিছুই কাজ করা নিরাপদ।

কিন্ত! থেকে...

  1. এই রি-রুটিং প্রক্রিয়াগুলি স্বয়ংক্রিয়ভাবে পরিচালনা করার জন্য একটি সিস্টেম তৈরি করা আরও উপযুক্ত।
  2. আপনার গেমটি যাই হউক না কেন, বিশ্বের ১০০,০০০ ইউনিট (মিটার [?]) প্রশস্ত হওয়ার জন্য একটি সুসংগত "বিভাগ" দরকার নেই।

... তবে সম্ভবত এটি 100000 ইউনিট চিহ্নের চেয়ে অনেক বেশি তাড়াতাড়ি / আরও প্রায়শই পুনঃনির্মাণ করা ভাল ধারণা। উদাহরণস্বরূপ, আমি যে ভিডিও ভিডিও সরবরাহ করেছি তা প্রতি 1000 ইউনিট বা এরকম করে।


2
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে । এখানে আরও মন্তব্য পোস্ট করার পরিবর্তে দয়া করে সেই চ্যাটটি ব্যবহার করুন।
আলেকজান্দ্রে ভেল্যানকোর্ট

> এটি (স্পষ্টতই) কেবল যা চালিত হচ্ছে তার চেয়ে বেশি ব্যয়বহুল <এটি কি? রেন্ডারিংয়ের সময়, আপনাকে যে কোনও উপায়ে ক্যামেরা ম্যাট্রিক্সের সাথে একটি ম্যাট্রিক্স গুণ করতে হবে, ক্যামেরায় পরিচয় স্থির করা এই পদ্ধতিতে কম ব্যয়বহুল হবে ।
Matsemann

সেই মুহুর্তে যখন গেমের বিকাশ unity
ক্যের

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

@LJ ᛃ প্রশ্ন করা হয়েছিল বিশেষভাবে ঐক্য সম্পর্কে (ওপি এর ট্যাগ দেখুন [Defacing এই প্রোগ্রামটিতে] সম্পাদনাগুলি করার পূর্বে ডি Everhard এর), এবং তাই উত্তর এটা প্রতিফলিত করতে উপযোগী ছিল । --- তবে এখানে সর্বোত্তম অংশটি হ'ল: এটি ইউনিটি, অবাস্তব, ক্রেইনজাইন, উত্স, ইত্যাদি ... সর্বোত্তম এবং / অথবা সর্বাধিক জনপ্রিয় ইঞ্জিনগুলি এইভাবে কাজ করে (এবং তারা এটি কোনও কারণে করে), সুতরাং উত্তরটি কেবলমাত্র নয় সাধারণভাবে পুরোপুরি বৈধ , তবে তৈরি করা পয়েন্টগুলি এখনও নির্ভুলতার শীর্ষে রয়েছে । সাধারণভাবে বলতে গেলে, আপনি যদি পদার্থবিজ্ঞানের রেফারেন্সের ফ্রেমটি উল্টান, আপনি বিশেষত গতিশীল বস্তুগুলিতে সমস্যাগুলির মধ্যে চলে যেতে পারেন can
XenoRo

89

দুটি বিকল্পই কাজ করে।

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

সুতরাং আপনার কাছে ধারণাগতভাবে আরও স্বজ্ঞাত যা মনে হয় তা করুন।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
জোশ

1
আমি মনে করি না যে এটি কিছু সমাধান করে। প্লেয়ারের (এবং ক্যামেরা) অবস্থান রাখার পরিবর্তে আপনি বিশ্বের স্ক্রোল অবস্থান রাখেন - এটি কীভাবে আলাদা?
এজেন্ট_এল

1
@ এজেন্ট_এল সাধারণত, পৃথিবীগুলি টুকরোয়াল তৈরি করে এবং প্রতিটি টুকরোটির এক্স / ওয়াই অবস্থান থাকে। যখন টুকরোটি খেলোয়াড়ের পেছনে পর্যাপ্ত পরিমাণে (যেমন অফস্ক্রিন) পেলে তা মুছে ফেলা হয় এবং এগুলি কেবলমাত্র একটি নির্দিষ্ট পরিমাণ আগাম তৈরি হয়, তাই এগুলি সর্বদা অপেক্ষাকৃত ছোট পরিসরের মধ্যে থাকে - আমার তৈরি একটি খেলা এর চেয়ে বেশি স্থানাঙ্ক কখনও ছিল না game অসীম, এলোমেলোভাবে উত্পন্ন রানার হওয়া সত্ত্বেও ~ 1000 এর চেয়ে কম বা 0 এরও কম, এর কারণে - আমি প্রতিটি খণ্ডে প্লেয়ারের অবস্থান এবং ক্রমের প্রতিটি খণ্ডের সূচকে নজর রেখেছি।
নিক হার্টলি

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

2
প্রতি সেকেন্ডে 1000 পিক্সেল এ একটি 64৪ বিট পূর্ণসংখ্যার উপরে যেতে 586 মিলিয়ন বছর সময় লাগবে। আপনি যদি 16 বিট পূর্ণসংখ্যার মতো ছোট ছোট ধরণের ব্যবহার করেন তবে এটি কেবল সত্যই সমস্যা।
লিন্ডন হোয়াইট

38

জেনোরোর জবাব বন্ধ করে দেওয়া, তারা বর্ণিত পুনরায় মূল পদ্ধতির পরিবর্তে, কেউ নিম্নলিখিতটি করতে পারে:

উত্পন্ন আপনার অসীম মানচিত্রের অংশগুলির একটি বিজ্ঞপ্তি বাফার তৈরি করুন, যা আপনার চরিত্রটি মডুলো পাটিগণিতের সাথে আপডেট হওয়া অবস্থানের সাথে প্রবাহিত হয় (যাতে আপনি কেবল বৃত্তাকার বাফারের আশেপাশে চলে যান)। আপনার চরিত্র খণ্ড ছাড়ার সাথে সাথে আপনার বাফারের অংশগুলি প্রতিস্থাপন শুরু করুন। প্লেয়ার আপডেট সমীকরণটি এমন কিছু হবে:

player.position = (player.position + player.velocity) % worldBuffer.width;

এখানে আমি যে বিষয়ে কথা বলছি তার চিত্রের উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন

এখানে মোড়কের শেষে কী ঘটে তার একটি উদাহরণ এখানে।

এখানে চিত্র বর্ণনা লিখুন

এই পদ্ধতির সাহায্যে আপনি কখনই নির্ভুল ত্রুটিগুলি নিয়ে চলতে পারেন না, তবে আপনি খুব দূরত্বের দূরত্বে 3 ডি তে এটি করার ইচ্ছা করলে আপনার খুব বড় বাফার তৈরি করতে হবে (যেহেতু আপনাকে এখনও নিজের সামনে দেখতে সক্ষম হতে হবে) )। যদি এর flappy পাখিটি আপনার খণ্ডের আকারটি সম্ভবত একমাত্র পর্দার জন্য একক দৃশ্যের ধারণ করার মতো হবে তবে এটি আপনার আকারটি খুব ছোট হতে পারে।

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


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
জোশ

15

ইতিমধ্যে জিজ্ঞাসা করা এবং স্বীকৃত হিসাবে, এটি সত্যিই আপনার খেলার ক্ষেত্র এবং স্টাইলের উপর নির্ভর করে, তবে যেহেতু এটি উল্লেখ করা হয়নি: ফ্ল্যাপিবার্ড পর্দার জুড়ে বাধাটি সরিয়ে দেয় বিশ্বজুড়ে খেলোয়াড়কে না।

কোনও স্প্যানার Vector2.leftদিকের স্থির গতির সাথে পর্দার বাইরে অবজেক্টগুলিকে ইনস্ট্যান্ট করছে ।


3
এটি ফ্ল্যাপিবার্ডের পক্ষে কাজ করে কারণ এটি একটি খুব সাধারণ খেলা। আমার উত্তরে উল্লেখ করা হয়েছে, একই কৌশল, এখনও সম্ভব , হবে খুব কিছু আরো জটিল (আরও বিশ্বের বস্তু / বিস্তারিত) এ সমস্যাযুক্ত সাবওয়ে সার্ফার মত।
XenoRo

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