গেম স্টেট সেভিং / লোডিং?


12

গেমের স্টেট (প্রোফাইলগুলি) সংরক্ষণের জন্য সর্বাধিক ব্যবহৃত পদ্ধতি বা অ্যালগরিদম কী, এনক্রিপশন কীভাবে যায় এবং কীভাবে সম্পর্কিত জিনিসগুলি ডাটাবেসগুলি পাঠ্য ফাইল files

আমি দেখেছি সিজার IV মাইএসকিউএল ব্যবহার করেছে।

কোন পরামর্শ.

উত্তর:


20

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

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

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

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


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

আপনার সমস্ত গেমের স্টেটের ডেটা এক শ্রেণিতে রাখুন, প্রয়োগ করে ক্লাসকে সিরিয়ালাইজেবল করে তুলুন Serializable, transientআপনি বিশেষ ইনস্ট্যান্টিয়েটেড ভেরিয়েবলগুলি শ্রেণিতে মিশ্রিত করলে কীওয়ার্ডটি ব্যবহার করুন (ক্ষণস্থায়ী বস্তুগুলি সিরিয়ালযুক্ত নয়), এবং কেবল ObjectOutputStreamফাইলটিতে লিখতে এবং ফাইল ObjectInputStreamথেকে পড়তে ব্যবহার করুন । এটাই.


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

গেমস সংরক্ষণের জন্য আমি। নেট বাইনারি সিরিয়ালাইজেশন ব্যবহার করেছি এবং সি # সম্ভবত জাভা যা গেমস বিকাশ করবে তার চেয়ে কিছুটা যুক্তিসঙ্গত প্ল্যাটফর্ম। আমি পছন্দ করি এটি কীভাবে স্বয়ংক্রিয়ভাবে পুরো বস্তুর গ্রাফটি সংরক্ষণ করে। এটি আরও অনেক কঠিন হতে ব্যবহৃত। অবশ্যই এখন টেক্সচারের মতো অপ্রয়োজনীয় টুকরো বাদ দেওয়ার চ্যালেঞ্জ রয়েছে তবে এটি সম্পাদন করা কোনও বড় বিষয় নয়।
BlueMonkMN

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

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

অন্তর্নির্মিত বাইনারি বিন্যাস ব্যবহার করার সময়, সি # /। নেট-তে সিরিয়ালাইজেশন থেকে নির্দিষ্ট ক্ষেত্রগুলি বাদ দিলে এগুলি [নন-সিরিজযুক্ত] অ্যাট্রিবিউট দিয়ে সজ্জিত করার মতোই সহজ। তবে যেটি উপেক্ষা করা সহজ, তা হ'ল সংকলক-উত্পন্ন ইভেন্টগুলি (যেমন কাস্টম অ্যাড / অপারেটর অপসারণ ছাড়া কোনও ইভেন্ট) তাদের গ্রাহকদের সংরক্ষণের জন্য একটি ব্যাকিং ফিল্ড তৈরি করে। সুতরাং, দুর্ঘটনাক্রমে (এবং অজান্তেই) সিরিয়ালযুক্ত অবজেক্ট গ্রাফে ইভেন্ট হ্যান্ডলারগুলি অন্তর্ভুক্ত করা সহজ। এটি পেতে, আপনাকে ইভেন্টের ঘোষণায় ননশিরাইলযুক্ত বৈশিষ্ট্য যুক্ত করতে হবে, তবে আপনাকে "ক্ষেত্র:" যোগ্যতা যুক্ত করতে হবে:[field: NonSerialized]
মাইক স্ট্রোবেল

3

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

বা, আপনি যদি কোনও মানব পাঠযোগ্য সমাধান চান তবে আপনি র‌্যাপিডএক্সএমএল এর মতো কিছু ব্যবহার করতে পারেন ।

আপনি যদি কোনও ধরণের কাঠামো ব্যবহার করেন তবে এটির ফাইল সমর্থন ফাংশনগুলি দেখুন। আছে HTH


0

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

  1. মেমরিতে ফাইল পড়ুন।
  2. বাফার থেকে অবজেক্ট টাইপ পয়েন্টার কাস্ট করুন।

এটি দ্রুত, তবে এটি রক্ষণাবেক্ষণ, প্ল্যাটফর্ম-নির্দিষ্ট এবং জটিল নয় a

ইদানীং, আমি বেশ কয়েকটি গেম এসকিউএলাইট ব্যবহার করতে দেখেছি। আমি যাদের সাথে কথা বলেছি তারা এটিকে পছন্দ করে বলে মনে হচ্ছে।


0

সিরিয়ালাইজেশন অন্যান্য উত্তরগুলির মধ্যে কয়েকটি উল্লেখ করা হয়েছে, এবং আমি সম্মত যে এটি একটি যুক্তিসঙ্গত সমাধান। সংস্করণে থাকলেও এটি একরকম ব্যর্থ।

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

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

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


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

দীর্ঘমেয়াদী বজায় রাখা অনেক সহজ - চারপাশে "প্রতিটি পূর্ববর্তী গেমের ফাইল লোড করুন" ফাংশনগুলির একটি সিরিজ রাখা খুব শীঘ্রই বহু-কালীন ক্রিয়ায় রূপান্তরিত হয়।
জোর্বাথুত

আমি যে গেমগুলিতে কাজ করেছি সেগুলিতে এটি জটিল নয় - একক পদ্ধতিতে কোন বাইটগুলি পড়তে এবং লিখতে হবে তা নির্ধারণ করতে সংস্করণ নম্বরটি ব্যবহার করে একক পদ্ধতিতে লোড / সেভ পদ্ধতির একাধিক অনুলিপি রাখে না। এটি কেবল আরও সহজ করা হয়েছে যদি আপনি কেবল কাঠামো না লিখেন তবে আদিম তথ্য টাইপ স্তরে (উদাঃ ReadByte / ReadFload / ইত্যাদি) অপারেশন হিসাবে লোডিং এবং সেভিং প্রয়োগ করুন। তারপরে আপনি যদি কোনও নতুন সদস্য যুক্ত করেন তবে আপনি এমন কিছু করতে পারেন যেমন (সংস্করণ> 10) {someNewByte = ReadByte (); This এটিকে এভাবে প্রয়োগ করা বিভিন্ন এন্ডিয়ান প্ল্যাটফর্মগুলিকে সমর্থন করা আরও সহজ করে তোলে।
কেভিন 42

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

0

আপনি যদি আপনার স্তরগুলিকে সঞ্চয় করতে একই বিন্যাসটি ব্যবহার করতে পারেন তবে এটি একটি বোনাস।

উদাহরণস্বরূপ, পেগলের মতো একটি খেলায় প্রাথমিক বোর্ড লেআউট, বলের সংখ্যা, বর্তমান স্কোর (প্রাথমিক বোর্ডের জন্য 0) ইত্যাদি থাকতে পারে। তাহলে কোনও সংরক্ষিত গেমটি ঠিক একই বিন্যাসটি ব্যবহার করতে পারে।

আপনি যদি একই ফর্ম্যাটটি ব্যবহার করেন তবে সেভ গেম এবং স্তরের লোড কোডটি আপনার কাজকে আরও সহজ করে তুলতে পারে!

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

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