নিয়মিত বিরতিতে এমএমওগুলিতে লগ ইন করা সমস্ত অক্ষর সংরক্ষণ করার পারফরম্যান্স সুবিধাটি কী?


26

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


34
এটি পারফরম্যান্সের জন্য নয়; এটি নির্ভুলতার জন্য কিছুটা পারফরম্যান্স ত্যাগ করছে , এটি আরও গুরুত্বপূর্ণ।
ম্যাসন হুইলারের

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

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

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

2
@ লুয়ান: প্রতিটি রাজ্যের পরিবর্তনকে অবিচ্ছিন্ন স্টোরেজে সংরক্ষণ করা পুরোপুরি সম্ভব, এমনকি যান্ত্রিক এইচডিডি তেও। (আপনার ব্যস্ত সার্ভারগুলিতে কয়েকটি দরকার হতে পারে)। কৌশলটি হ'ল পৃথক বস্তুগুলি আপডেট না করা । পরিবর্তে, আপনি একটি লেনদেন লগ "প্লেয়ার (এ) সংরক্ষণ করুন n ইনভেন্টরি + = অবজেক্ট (বি)`। পর্যায়ক্রমে আপনি সম্পূর্ণ রাজ্যে ফ্লাশ করেন recover পুনরুদ্ধার করার জন্য, আপনি সর্বশেষ পূর্ণ সংরক্ষণ পুনরায় লোড করুন এবং লেনদেন লগ থেকে নতুন লেনদেন প্রয়োগ করেন Since ধারাবাহিকভাবে একটি ফাইল লিখছি, আপনি যান্ত্রিক এইচডিডি'র জন্য শীর্ষ সম্পাদনা পৌঁছেছেন But তবে লেনদেনের লগ যুক্তিসঙ্গত আকারে রাখতে আপনার পর্যায়ক্রমিক পূর্ণ সঞ্চয় প্রয়োজন
এমসাল্টার্স 11:55

উত্তর:


66

এটি পারফরম্যান্সের জন্য নয়। এটি একটি ব্যর্থতা বিশ্ব যদি প্রতি কয়েক মিনিটে সঞ্চয় করে, তবে সার্ভারের সাথে যদি কিছু ঘটে থাকে এবং সবাই বন্ধ হয়ে যায় তবে কয়েক মিনিটের অগ্রগতি হারাবে।

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

তারা ডেটা লোকসানের ঝুঁকি অপসারণ করতে সামান্য পারফরম্যান্স ত্যাগ করে।

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


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


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

5

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

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

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

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

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

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

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

একটি আধুনিক এমএমও ডিজাইন করার সময়, আপনি একটি ডাটাবেসে সঞ্চিত পদ্ধতি তৈরি করতে এবং লেনদেন সম্পাদন করতে সেই পদ্ধতিগুলি ব্যবহার করতে চান। উদাহরণস্বরূপ, দুটি খেলোয়াড়ের মধ্যে বাণিজ্য করার সময় এটি দেখতে এটির মতো হতে পারে:

start transaction;
insert into inventory (playerid, itemid) values (111, 222);
delete from inventory where playerid=111 and itemid=444;
insert into inventory (playerid, itemid) values (333, 444);
delete from inventory where playerid=333 and itemid=222;
commit;

(দ্রষ্টব্য: এই এসকিউএল, ব্যবহারিক উপায়ে লেখা হয়নি এবং এটি কেবল উদাহরণ হিসাবে বোঝানো হয়েছে)।

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

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