কীভাবে একটি রিপ্লে সিস্টেম ডিজাইন করবেন


75

তাহলে আমি কীভাবে একটি রিপ্লে সিস্টেম ডিজাইন করব?

আপনি ওয়ার্কক্র্যাফট 3 বা স্টারক্রাফ্টের মতো নির্দিষ্ট গেমগুলি থেকে এটি জানতে পারেন যেখানে ইতিমধ্যে খেলাটি খেলার পরে আপনি আবার গেমটি দেখতে পারেন।

আপনি তুলনামূলকভাবে ছোট রিপ্লে ফাইলটি শেষ করেন। সুতরাং আমার প্রশ্নগুলি হ'ল:

  • কীভাবে ডাটা সেভ করবেন? (কাস্টম ফর্ম্যাট?) (ছোট ফাইলাইজ)
  • কি রক্ষা হবে?
  • এটি কীভাবে জেনেরিক করা যায় যাতে এটি অন্যান্য গেমগুলিতে একটি সময়কাল রেকর্ড করতে ব্যবহার করা যায় (এবং উদাহরণস্বরূপ একটি সম্পূর্ণ ম্যাচ নয়)?
  • ফরোয়ার্ড এবং রিওয়াইন্ড করা সম্ভব করুন (ডাব্লুসি 3 আমার যতদূর মনে পড়ে রিওয়াইন্ড করতে পারে না)

3
যদিও নীচের উত্তরগুলি অনেক মূল্যবান অন্তর্দৃষ্টি সরবরাহ করে, আমি কেবল আপনার গেম / ইঞ্জিনটিকে উচ্চতর ডিস্ট্রিমেন্টিক ( en.wikedia.org/wiki/Deterministic_algorithm ) হিসাবে গড়ে তোলার প্রয়োজনীয়তার উপর জোর দিতে চেয়েছিলাম , কারণ এটি আপনার লক্ষ্য অর্জনের জন্য প্রয়োজনীয়।
এরি প্যাট্রিক

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

5
বেশিরভাগ পদার্থবিজ্ঞানের ইঞ্জিনগুলি যতক্ষণ না আপনি একটি স্থির টাইমস্টেপ ব্যবহার করেন, ততক্ষণ তা নির্ধারক। হাভোক না থাকলে আমি খুব অবাক হব। অ-নির্ধারণবাদ কম্পিউটারে আসা মোটামুটি কঠিন ...

4
নির্ণায়ক মানে একই ইনপুট = একই আউটপুট। যদি আপনি একটি প্ল্যাটফর্মে ভাসমান এবং অন্যটিতে ডাবল হয়ে থাকেন (উদাহরণস্বরূপ), বা ইচ্ছাকৃতভাবে আপনার আইইইই ভাসমান পয়েন্ট স্ট্যান্ডার্ড বাস্তবায়নকে অক্ষম করে রেখেছেন, তার অর্থ আপনি একই ইনপুটগুলি নিয়ে চলছেন না, এটি যে নির্বিচারক নয় not

3
এটি কি আমি, বা এই প্রশ্নটি প্রতি অন্য সপ্তাহে একটি অনুগ্রহ পেতে পারে?
কমিউনিস্ট হাঁস

উত্তর:


39

এই দুর্দান্ত নিবন্ধটি অনেকগুলি বিষয়কে কভার করে: http://www.gamasutra.com/view/feature/2029/developing_your_own_replay_system.php

নিবন্ধটিতে উল্লেখ করা এবং ভালভাবে করা কয়েকটি বিষয়:

  • আপনার গেমটি হ্রাসকারী হতে হবে।
  • এটি প্রথম ফ্রেমে গেম সিস্টেমগুলির প্রাথমিক অবস্থা এবং গেমপ্লে চলাকালীন কেবল প্লেয়ার ইনপুট রেকর্ড করে।
  • বিট কম # ইনপুট পরিমাণে। অর্থাৎ। বিভিন্ন ব্যাপ্তির (যেমন। [0, 1] বা [-1, 1] কম বিটগুলির মধ্যে বিস্তৃত প্রতিনিধিত্ব করে actual প্রকৃত গেম খেলার সময়ও কোয়ান্টাইজড ইনপুটগুলি গ্রহণ করতে হবে।
  • কোনও ইনপুট স্ট্রিমটিতে নতুন ডেটা রয়েছে কিনা তা নির্ধারণ করতে একটি বিট ব্যবহার করুন। যেহেতু কিছু স্ট্রিম ঘন ঘন পরিবর্তিত হয় না, এটি ইনপুটগুলিতে অস্থায়ী সামঞ্জস্যকে কাজে লাগায়।

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

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

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


যদি সেখানে আরএনজি জড়িত থাকে তবে উক্ত আরএনজির ফলাফলগুলি স্ট্রিমগুলিতে অন্তর্ভুক্ত করুন
র‌্যাচেট ফ্রিক

1
@ র্যাচেট ফ্রিক: পিআরএনজি-র নিরোধক ব্যবহারের মাধ্যমে আপনি চেকপয়েন্টগুলির সময় কেবলমাত্র তার বীজ সংরক্ষণের মাধ্যমে পেতে পারেন।
অংক সংখ্যা

22

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

যেহেতু রিন্ডাইন্ডিংয়ের জন্য আপনার যে কোনও উপায়ে চেকপয়েন্টিং লাগানো দরকার, তাই আপনি বিষয়গুলিকে জটিল করার আগে এটি সহজ উপায়ে বাস্তবায়নের চেষ্টা করতে পারেন।


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

@ সমরসা - আপনি যদি একটি স্ট্যান্ডার্ড সংকোচনের গ্রন্থাগার (উদাহরণস্বরূপ gzip) ব্যবহার করেন তবে রাষ্ট্র পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে দেখার মতো কাজগুলি নিজে হাতে না করে আপনি একই (সম্ভবত আরও ভাল) সংক্ষেপণ পাবেন।
জাস্টিন

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

1
@ জোড়বাথুত তত্ত্বের ক্ষেত্রে হ্যাঁ, তবে বাস্তবে এটি কি চেষ্টা করার মতো?
জাস্টিন

4
আপনার প্রচেষ্টা কতটা মূল্যবান তা সম্পূর্ণ নির্ভর করে আপনার কতটা ডেটা রয়েছে on যদি আপনি শত বা হাজার হাজার ইউনিট নিয়ে আরটিএস পেয়ে থাকেন তবে এটি সম্ভবত গুরুত্বপূর্ণ। আপনার যদি ব্রেডের মতো মেমরিতে রিপ্লেগুলি সঞ্চয় করতে হয় তবে এটি সম্ভবত গুরুত্বপূর্ণ।

21

যেমন যদি এটা যুক্তরাষ্ট্র এবং ফাংশন, যেখানে একটি ফাংশন একটি সিরিজ গঠিত হয় আপনি আপনার সিস্টেম দেখতে পারেন f[j]ইনপুট দিয়ে x[j]সিস্টেম রাষ্ট্র পরিবর্তন s[j]দশায় s[j+1], তাই মত:

s[j+1] = f[j](s[j], x[j])

একটি রাষ্ট্র আপনার সমগ্র বিশ্বের ব্যাখ্যা। প্লেয়ারের অবস্থানগুলি, শত্রুর অবস্থান, স্কোর, অবশিষ্ট গোলাবারুদ ইত্যাদি আপনার গেমের ফ্রেম আঁকতে আপনার প্রয়োজনীয় সমস্ত কিছুই।

একটি ফাংশন এমন কিছু যা বিশ্বকে প্রভাবিত করতে পারে। একটি ফ্রেম পরিবর্তন, একটি কিপ্রেস, একটি নেটওয়ার্ক প্যাকেট।

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

এই ব্যাখ্যাটির জন্য, আমি নিম্নলিখিত অনুমানগুলি করব:

অনুমান 1:

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

অনুমান 2:

একটি একক রাষ্ট্রের সঞ্চয় করার স্পেসিয়াল ব্যয় (মেমরি, ডিস্ক) কোনও ফাংশন এবং এর ইনপুট সংরক্ষণ করার চেয়ে অনেক বেশি।

অনুমান 3:

একটি রাজ্য উপস্থাপনের অস্থায়ী ব্যয় (সময়) একই, বা একটি রাজ্যের উপর কোনও ফাংশন গণনার চেয়ে মাত্রার মাত্র এক বা দুটি অর্ডারের বেশি।

আপনার রিপ্লে সিস্টেমের প্রয়োজনীয়তার উপর নির্ভর করে রিপ্লে সিস্টেম প্রয়োগের বিভিন্ন উপায় রয়েছে, তাই আমরা সহজতমটি দিয়ে শুরু করতে পারি। আমি দাবার খেলাটি কাগজের টুকরোতে রেকর্ড করে ব্যবহার করে একটি ছোট উদাহরণ তৈরি করব।

পদ্ধতি 1:

স্টোর s[0]...s[n]। এটি খুব সহজ, খুব সোজা। অনুমান 2 এর কারণে এর স্পেসিয়াল ব্যয় বেশ বেশি।

দাবা জন্য, এটি প্রতিটি পদক্ষেপের জন্য পুরো বোর্ড অঙ্কন করে সম্পন্ন হবে।

পদ্ধতি 2:

আপনার যদি কেবল ফরওয়ার্ড রিপ্লে দরকার হয় তবে আপনি কেবল সঞ্চয় করতে পারেন s[0]এবং তারপরে সংরক্ষণ করতে পারেন f[0]...f[n-1](মনে রাখবেন, এটি কেবল ফাংশনটির আইডির নাম) এবং x[0]...x[n-1](এই ফাংশনের প্রতিটিটির জন্য কী ইনপুট ছিল)। পুনরায় খেলতে, আপনি কেবল শুরু করে s[0]গণনা করুন

s[1] = f[0](s[0], x[0])
s[2] = f[1](s[1], x[1])

এবং তাই ...

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

তবে আপনার প্রোগ্রামটি সম্ভবত বাহ্যিক প্রোগ্রামগুলির উপর নির্ভর করে, গ্রন্থাগারগুলি থেকে শুরু করে সিপিইউর প্রকৃত বাস্তবায়ন পর্যন্ত, আপনার ফাংশনগুলি প্ল্যাটফর্মগুলির মধ্যে একইরকম আচরণ করে তা নিশ্চিত করে তোলা বেশ কঠিন হতে পারে।

আপনি যদি সিউডো-এলোমেলো নম্বর ব্যবহার করেন তবে আপনি উত্পাদিত সংখ্যাগুলি আপনার xইনপুটটির অংশ হিসাবে সংরক্ষণ করতে পারেন , বা প্রিং ফাংশনটির রাজ্যটিকে আপনার রাজ্যের sঅংশ হিসাবে এবং এর প্রয়োগের ক্রিয়াকলাপ হিসাবে সংরক্ষণ করতে পারেন f

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

পদ্ধতি 3:

এখন, আপনি সম্ভবত আপনার রিপ্লেতে সন্ধান করতে সক্ষম হতে চান। এটি s[n]একটি স্বেচ্ছাসেবকের জন্য গণনা করুন n। পদ্ধতি 2 ব্যবহার করে, আপনি গণনা s[0]...s[n-1]করার আগে আপনাকে গণনা করতে হবে s[n]যা অনুমান 2 অনুসারে, বেশ ধীর হতে পারে।

এই বাস্তবায়ন করার জন্য, পদ্ধতি 3 পদ্ধতি 1 এবং 2 একটি সাধারণীকরণ হল: দোকান f[0]...f[n-1]এবং x[0]...x[n-1]মাত্র পদ্ধতি 2 মত, কিন্তু এ সঞ্চয় s[j], সব জন্য j % Q == 0একটি ধ্রুবক দেওয়া Q। সহজ শর্তে, এর অর্থ হ'ল আপনি প্রতিটি Qরাজ্যের মধ্যে একটিতে বুকমার্ক সঞ্চয় করেন । উদাহরণস্বরূপ, জন্য Q == 100, আপনি সঞ্চয়s[0], s[100], s[200]...

অর্ডার নিরূপণ করার জন্য s[n]একটি অবাধ জন্য n, আপনাকে অবশ্যই প্রথমে লোড পূর্বে সঞ্চিত s[floor(n/Q)], এবং তারপর থেকে সব ফাংশন নিরূপণ floor(n/Q)করতে n। সর্বাধিক, আপনি Qফাংশন গণনা করা হবে। এর ক্ষুদ্রতর মানগুলি Qগণনা করার জন্য দ্রুত তবে অনেক বেশি স্থান গ্রহণ করে, তবে বৃহত্তর মানগুলি Qকম স্থান গ্রহণ করে তবে গণনা করতে বেশি সময় নেয়।

পদ্ধতি 3 সহ Q==1পদ্ধতি 1 এর সমান, অন্যদিকে পদ্ধতি 3 Q==infপদ্ধতি 2 এর মতোই।

দাবা জন্য, এটি প্রতিটি পদক্ষেপ অঙ্কন, পাশাপাশি প্রতি 10 বোর্ডের মধ্যে একটি (যেমন Q==10) দ্বারা সম্পন্ন হবে।

পদ্ধতি 4:

আপনি রিপ্লে বিপরীত চান, আপনি পদ্ধতি 3. একটি ছোট প্রকরণ ধরুন করতে পারেন Q==100, এবং আপনি গণনা করতে চান s[150]মাধ্যমে s[90]বিপরীত। আনমোডাইফাইড পদ্ধতি 3 দিয়ে আপনার 50 টি গণনা করতে হবে s[150]এবং তারপরে আরও 49 টি গণনা পেতে হবে s[149]এবং এ জাতীয়। আপনি যেহেতু s[149]পাওয়ার জন্য ইতিমধ্যে গণনা করেছেন তাই আপনি প্রথমবারের জন্য গণনা s[150]করার s[100]...s[150]সময় একটি ক্যাশে তৈরি করতে পারেন s[150]এবং তারপরে আপনাকে s[149]এটি প্রদর্শনের দরকার হলে আপনি ইতিমধ্যে ক্যাশে রেখে যেতে পারেন।

আপনার প্রদত্ত যে কোনও s[j]জন্য কেবল প্রতিবার গণনা করার সময় আপনাকে ক্যাশেটি পুনরায় জেনারেট করতে হবে । এবার, বৃদ্ধির ফলে আরও ছোট আকার হবে (কেবল ক্যাশে হবে) তবে দীর্ঘ সময় (কেবল ক্যাশে পুনরুদ্ধারের জন্য)। রাজ্য এবং ফাংশন গণনা করার জন্য প্রয়োজনীয় আকার এবং সময়গুলি জানা থাকলে এর জন্য একটি অনুকূল মান গণনা করা যেতে পারে।j==(k*Q)-1kQQ

দাবা জন্য, এটি প্রতিটি পদক্ষেপ অঙ্কন করে সম্পন্ন হবে, পাশাপাশি প্রতি 10 বোর্ডের মধ্যে একটিতে (যেমন Q==10), তবে এটির জন্য পৃথক কাগজের টুকরো আঁকতে হবে, আপনি গণনা করেছেন এমন 10 টি বোর্ড।

পদ্ধতি 5:

যদি রাজ্যগুলি কেবল অতিরিক্ত পরিমাণে স্থান নেয় বা ফাংশনগুলি খুব বেশি সময় ব্যয় করে তবে আপনি এমন একটি সমাধান তৈরি করতে পারেন যা বাস্তবে প্রয়োগ করে (জাল নয়) বিপরীত পুনরায় খেলানো। এটি করার জন্য, আপনার অবশ্যই প্রতিটি ফাংশনের বিপরীত ফাংশন তৈরি করতে হবে। যাইহোক, এটির জন্য আপনার প্রতিটি ফাংশন একটি ইঞ্জেকশন প্রয়োজন। যদি এটি করণীয় হয় তবে f'ফাংশনের বিপরীতটি চিহ্নিত করার জন্য fগণনা s[j-1]করা তত সহজ

s[j-1] = f'[j-1](s[j], x[j-1])

মনে রাখবেন যে এখানে, ফাংশন এবং ইনপুট উভয়ই j-1নয় j। আপনি যদি গণনা করে থাকেন তবে এই একই ফাংশন এবং ইনপুটটি আপনি ব্যবহার করতে পারেন

s[j] = f[j-1](s[j-1], x[j-1])

এই ফাংশনগুলির বিপরীতটি তৈরি করা জটিল অংশ। তবে আপনি সাধারণত পারবেন না, যেহেতু একটি গেমের প্রতিটি ফাংশনের পরে কিছু স্টেটের ডেটা সাধারণত হারিয়ে যায়।

এই পদ্ধতিটি যেমন হয়, গণনা বিপরীত করতে পারে s[j-1], তবে কেবল যদি আপনার কাছে থাকে s[j]। এর অর্থ হ'ল আপনি কেবল পিছন দিকে রিপ্লেটি দেখতে পারবেন, আপনি যে বিন্দুতে পিছনের দিকে পুনরায় খেলতে চান তা থেকে শুরু করে। আপনি যদি একটি স্বেচ্ছাসেবী বিন্দু থেকে পিছনে পুনরায় খেলতে চান তবে আপনাকে অবশ্যই পদ্ধতি 4 এর সাথে এটি মিশ্রিত করতে হবে।

দাবা জন্য, এটি প্রয়োগ করা যাবে না, যেহেতু প্রদত্ত বোর্ড এবং পূর্ববর্তী পদক্ষেপের সাহায্যে আপনি জানতে পারবেন কোন টুকরোটি সরানো হয়েছিল, তবে এটি কোথা থেকে স্থানান্তরিত হয়েছিল not

পদ্ধতি 6:

অবশেষে, আপনি যদি আপনার সমস্ত ফাংশনগুলি ইঞ্জেকশনগুলির গ্যারান্টি দিতে না পারেন তবে আপনি এটি করার জন্য একটি ছোট কৌশল করতে পারেন। প্রতিটি ফাংশন কেবল একটি নতুন, স্টেটের পরিবর্তে ফিরে আসার পরিবর্তে, আপনি এটি ফেলে দেওয়া ডেটাও এটি ফিরিয়ে দিতে পারেন:

s[j+1], r[j] = f[j](s[j], x[j])

কোথায় r[j]ফেলে দেওয়া ডেটা। এবং তারপরে আপনার বিপরীত ফাংশন তৈরি করুন যাতে তারা ফেলে দেওয়া ডেটা গ্রহণ করে, যেমন:

s[j] = f'[j](s[j+1], x[j], r[j])

এর উপরন্তু f[j]এবং x[j], এছাড়াও আপনি সংরক্ষণ করতে হবে r[j]প্রতিটি ফাংশন জন্য। আবারও, আপনি যদি সন্ধান করতে সক্ষম হতে চান তবে আপনার অবশ্যই বুকমার্কগুলি সংরক্ষণ করতে হবে, যেমন পদ্ধতি 4। সহ।

দাবা জন্য, এটি পদ্ধতি 2 এর সমান হবে তবে পদ্ধতি 2 এর বিপরীতে যা কেবলমাত্র কোন টুকরোটি কোথায় যায় তা আপনাকে জানাতে হবে, প্রতিটি টুকরোটি কোথা থেকে এসেছে store

বাস্তবায়ন:

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

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

আমি কিছু বড় গেমগুলিতে এটি প্রয়োগ করে দেখেছি, বেশিরভাগ সাম্প্রতিক ডেটা তাত্ক্ষণিকভাবে পুনরায় প্লে করার জন্য যখন কোনও ইভেন্ট (fps এ টুকরো টুকরো টুকরো টুকরো টুকরো স্পোর্টস গেমসে একটি স্কোর) ঘটে থাকে।

আমি আশা করি এই ব্যাখ্যা খুব বিরক্তিকর ছিল না।

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


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

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

@ অস্কার (কিছুটা পরিশ্রমী, ব্যস্ত, পরে সম্পাদনা করা হতে পারে): যদিও কিছু কঠোর, তাত্ত্বিক দিক থেকে আপনি ইনপুট হিসাবে থ্রেডের সময় ইত্যাদি দাবি করতে পারেন, এটি কোনও ব্যবহারিক অর্থে কার্যকর নয়, যেহেতু তারা সাধারণত পর্যবেক্ষণ করতে পারে না প্রোগ্রাম নিজেই বা সম্পূর্ণ বিকাশকারী দ্বারা নিয়ন্ত্রিত। তদ্ব্যতীত, একটি প্রোগ্রাম নিরঙ্কুশাত্মক নয়, এটি নন-ডিস্ট্রিমেন্টিক (রাষ্ট্রীয় মেশিন অর্থে) হয়ে যাওয়ার চেয়ে আলাদা different আমি শব্দটির অর্থ বুঝতে পারি। আমি আশা করি তারা পূর্ব-বিদ্যমান শব্দটিকে বেশি চাপ দেওয়ার পরিবর্তে অন্য কিছু চয়ন করত।
krdluzni

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

9

এমন একটি জিনিস যা অন্যান্য উত্তরগুলি এখনও আবৃত করেনি সেগুলি হ'ল ভাসমানদের বিপদ। আপনি ফ্লোটগুলি ব্যবহার করে পুরোপুরি নির্বিচার প্রয়োগ করতে পারবেন না।

ফ্লোটগুলি ব্যবহার করে, আপনি একটি সম্পূর্ণ নির্মূল ব্যবস্থা করতে পারেন তবে কেবল যদি:

  • ঠিক একই বাইনারি ব্যবহার করে
  • ঠিক একই সিপিইউ ব্যবহার করা

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

এটি এএমডি বনাম ইন্টেল বিটকে কীভাবে প্রভাব ফেলবে তা পুরোপুরি স্পষ্ট - উদাহরণস্বরূপ বলা যাক যে একটি 80 বিট ফ্লোট এবং অন্যটি 64 ব্যবহার করে - তবে কেন একই বাইনারি প্রয়োজন?

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

আপনি সর্বনিম্ন সম্ভাব্য নির্ভুলতা ব্যবহার করতে _control87 () / _ controlfp () পতাকা সেট করে এটিতে সহায়তা করতে পারবেন । তবে কিছু লাইব্রেরি এটিকেও স্পর্শ করতে পারে (কমপক্ষে কিছু কিছু ডি 3 ডি সংস্করণ করেছে)।


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

8

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

আরএনজিগুলি পুনরায় সেট করুন এবং ইনপুটটি আবার খেলুন। এটাই.

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

ফাইল ফর্ম্যাটটির বিবরণ কোনও বিষয় নয়, তবে বেশিরভাগ ইঞ্জিনের কাছে কমান্ডগুলি এবং রাজ্যটিকে ইতিমধ্যে সিরিয়ালাইজ করার একটি উপায় রয়েছে - নেটওয়ার্কিং, সংরক্ষণ বা যা কিছু হোক for শুধু যে ব্যবহার।


4

আমি ডিটারমিনিস্টিক রিপ্লেলিংয়ের বিরুদ্ধে ভোট দেব। এটি প্রতি সেকেন্ডের 1 / Nth প্রতি প্রতিটি সত্তার অবস্থা সংরক্ষণ করতে এয়ার সহজ এবং এফআর কম ত্রুটিযুক্ত।

প্লেব্যাকটিতে আপনি যা দেখাতে চান তা সংরক্ষণ করুন - যদি এটি কেবল অবস্থান এবং শিরোনাম হয় তবে আপনি যদি পরিসংখ্যানগুলিও এটি প্রদর্শন করতে চান তবে সাধারণভাবে যতটা সম্ভব সাশ্রয় করুন।

এনকোডিংটি টুইঙ্ক করুন। প্রতিটি কিছুর জন্য যতটা সম্ভব বিট ব্যবহার করুন। রিপ্লেটি ততক্ষণ নিখুঁত হতে হবে না যতক্ষণ এটি যথেষ্ট ভাল দেখাচ্ছে। এমনকি যদি আপনি শিরোনামের জন্য একটি ফ্লোট ব্যবহার করেন তবে আপনি এটিকে একটি বাইটে সংরক্ষণ করতে পারেন এবং 256 সম্ভাব্য মান (1.4º যথার্থতা) পেতে পারেন। এটি আপনার বিশেষ সমস্যার জন্য যথেষ্ট বা এমনকি অনেক বেশি হতে পারে।

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

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

অবশেষে, পুরো জিনিস gzip :)


1
এটি যদিও গেম টাইপের উপর কিছুটা নির্ভর করে।
জারি কম্প্পা

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

2

এটা কঠিন. সবার আগে এবং বেশিরভাগই জারি কম্প্পার উত্তরগুলি পড়ুন।

আমার কম্পিউটারে তৈরি একটি রিপ্লে আপনার কম্পিউটারে কাজ নাও করতে পারে কারণ ভাসমান ফলাফল খুব আলাদা। এটা একটা বড় চুক্তি.

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

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

প্রধান পয়েন্টগুলি হ'ল - এলোমেলো সংখ্যার সাথে ডিলিং - ইনপুট (প্লেয়ার) এবং দূরবর্তী প্লেয়ার (গুলি) - ফাইলগুলি ঘুরে দেখার জন্য রাষ্ট্র ডাম্পিং এবং ... - ফ্লাট নয় BREAK জিনিসগুলি (হ্যাঁ, আমাকে চিৎকার করতে হয়েছিল)


2

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

পার্শ্ব প্রতিক্রিয়া হিসাবে এটি আপনাকে একটি ছোট ফাইল আকারের সুবিধাও দেয়, আবার ধরে ধরে আপনি ব্যান্ডউইথ-প্রীতি নেটওয়ার্ক কোডে কাজ করছেন।

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

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


0

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

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

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

রিওয়াইন্ডিং হ'ল ডিস্ট্রিমেন্টিক পদ্ধতি ব্যবহার করে এবং গেমের স্ন্যাপশট ব্যবহার করা এবং আপনি যে সময়ে পয়েন্টে দেখতে চান সেখানে দ্রুত অগ্রসর হওয়া ছাড়াও প্রতিটি সমস্যা পুরো গেম স্টেটের রেকর্ডিংয়ের চেয়ে বেশি কিছু করতে পারে না a

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

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

দ্রষ্টব্য: যদি আপনার গেমটিতে সামগ্রীর গতিশীল স্ট্রিমিং জড়িত থাকে বা আপনার একাধিক থ্রেডে বা বিভিন্ন কোরগুলিতে গেম-লজিক থাকে ... শুভকামনা।


0

উভয় রেকর্ডিং এবং রিওয়ন্ডিং সক্ষম করতে, সমস্ত ইভেন্ট রেকর্ড করুন (ব্যবহারকারী উত্পন্ন, টাইমার উত্পন্ন, যোগাযোগ উত্পন্ন, ...)।

ইভেন্টের প্রতিটি ইভেন্ট রেকর্ড সময়ের জন্য, কী পরিবর্তন করা হয়েছিল, পূর্ববর্তী মানগুলি, নতুন মান।

গণনাটি এলোমেলো না হলে গণনা করা মানগুলি রেকর্ড করার দরকার নেই
(এই ক্ষেত্রে আপনি হয় গণিত মানগুলিও রেকর্ড করতে পারেন, বা প্রতিটি এলোমেলো গণনার পরে বীজের পরিবর্তিত রেকর্ড করতে পারেন)।

সংরক্ষিত ডেটা পরিবর্তনগুলির একটি তালিকা।
পরিবর্তনগুলি বিভিন্ন ফর্ম্যাটে (বাইনারি, এক্সএমএল, ...) সংরক্ষণ করা যায়।
পরিবর্তনতে সত্তা আইডি, সম্পত্তির নাম, পুরানো মান, নতুন মান থাকে।

আপনার সিস্টেমটি এই পরিবর্তনগুলি ফিরিয়ে আনতে পারে তা নিশ্চিত করুন (পছন্দসই সত্তা অ্যাক্সেস করুন, পছন্দসই সম্পত্তিকে নতুন রাজ্যে প্রেরণ করা বা পুরানো অবস্থায় ফিরে যেতে হবে)।

উদাহরণ:

  • শুরুর সময় = টি 1, সত্তা = প্লেয়ার 1, সম্পত্তি = অবস্থান, থেকে a তে পরিবর্তিত হয়েছে
  • শুরু থেকে শুরু = টি 1, সত্তা = সিস্টেম, সম্পত্তি = গেম মোড, সি থেকে ডিতে পরিবর্তিত হয়েছিল
  • শুরু থেকে শুরু = টি 2, সত্তা = প্লেয়ার 2, সম্পত্তি = রাজ্য, ই থেকে চ এ পরিবর্তন হয়েছে
  • কেবলমাত্র নির্দিষ্ট সময়সীমাগুলিকে দ্রুত রিয়েলাইন্ডিং / ফাস্টফোরওয়ার্ডিং বা রেকর্ডিং সক্ষম করতে,
    মূল ফ্রেমগুলি প্রয়োজনীয় - যদি এখন সমস্ত সময় রেকর্ড করা হয় এবং তবে পুরো গেমের অবস্থা সংরক্ষণ করুন।
    যদি কেবলমাত্র একটি নির্দিষ্ট সময়ের সীমা রেকর্ড করা হয় তবে শুরুতে প্রাথমিক অবস্থাটি সংরক্ষণ করুন।


    -1

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

    আপনি দেখতে পাবেন যে কেউ ডিটারমিনিস্টিক / নন-ডিটারমিনিস্টিক, ফ্লোট ভেরিয়েবল বা নির্দিষ্ট সিপিইউ সম্পর্কে অভিযোগ পূর্বাবস্থায় ফিরিয়ে আনতে / পুনরায় করতে চান না।


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

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