সম্ভাব্য অসীম 2D মানচিত্রের ডেটা সংরক্ষণ করার একটি উপায়?


29

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

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


2
কিছু ডেটা স্ট্রাকচার যা আপনি আরও অনুপ্রেরণার সন্ধান করতে পারেন তা হ'ল বিরল ম্যাট্রিক্স এবং (মাল্টিলেভেল) পৃষ্ঠার সারণী
অ্যান্ড্রু রাসেল

নিম্ন অগ্রাধিকার: "দীর্ঘ" ডেটা টাইপটি 32- বা 64-বিট হলে আপনি কি পরিষ্কার করতে পারবেন?
র‌্যান্ডল্ফ রিচার্ডসন

2
@ র্যান্ডল্ফ জানিয়েছে যে এটি সি #, সম্ভবত তার অর্থ সি # longযা -৪-বিট (তাই সর্বোচ্চ Int64.MaxValue)।
অ্যান্ড্রু রাসেল

উত্তর:


17

আপনার গেমের জন্য একটি কাস্টম মানচিত্র বিন্যাস তৈরি করুন। এটি আপনার ভাবার চেয়ে সহজ। কেবল বাইনারি রাইটার ক্লাসটি ব্যবহার করুন। প্রথমে কয়েকটি কালি বা ইন্টিতে হেডারটি লিখুন। শিরোনামে অন্তর্ভুক্ত করার তথ্য:

  • আপনার যাদু স্ট্রিং / ম্যাজিক নম্বর ফাইল ফর্ম্যাট।
  • এই ফাইলটিতে বর্ণিত খণ্ডগুলির শুরু / শেষ / আকার

এবং এছাড়াও (এবং এখানে পারফরম্যান্স সমালোচনা অংশ আসে

  • ints যা ফাইলের অভ্যন্তরীণ অবস্থানের বর্ণনা করে। সুতরাং আপনাকে নির্দিষ্ট খণ্ডগুলির জন্য অনুসন্ধান করতে হবে না।

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

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

ফাইলের সামগ্রীর বর্ণনা সবচেয়ে দক্ষতার সাথে শিরোনাম সহ ফাইল ফর্ম্যাটটির নকশা সম্পর্কে।

আপনার তৈরি কাস্টম এক্সটেনশনের সাহায্যে ফাইলগুলি সংরক্ষণ করুন এবং আপনি সেখানে যান।

বোনাস: ফাইল / পুরো বিষয়বস্তুর (শিরোনাম নয়!) নির্দিষ্ট অঞ্চলে BZip2 সংক্ষেপণ যুক্ত করুন, যাতে আপনি খুব ছোট মেমরির পদক্ষেপের জন্য ফাইল থেকে নির্দিষ্ট অংশগুলি আনপ্যাক করতে পারেন।


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

এই মুহুর্তে, আপনি কি কেবল একটি ফ্ল্যাটফিল ডাটাবেস বাস্তবায়ন করছেন না?
এপি-ইনাগো

13

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

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

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

আমি এখনও এটি কোনও ফাইলে ডেটা সঞ্চয় করতে ব্যবহার করি নি তবে এটি একটি আকর্ষণীয় সমস্যা এবং এরপরে আমি সামলাতে পারি।


সুতরাং এটি মূলত একটি সম্প্রসারণযোগ্য গাছ, তাই না? আমি কী মিস করছি?
KaoD

2
একটি প্রসারণযোগ্য গাছের উপরে সবচেয়ে বড় উন্নতি হ'ল এটি গাছের নির্দিষ্ট নোডকে 'সমতল' করে তোলে যা গাছের মতো কাঠামোগত রাখার পরিবর্তে ভারী জনবহুল (ডিফল্ট 70%) 2D অ্যারে পরিণত হয়। এটি আপনাকে অসীম বিন্যাসের (অসীম) আকার ব্যতীত আরে অনুসন্ধানের গতি দেয়।
dlras2

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

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

1
আমি এর দৃষ্টি হারিয়েছি, দুঃখিত! আমি এখনও এটি পরিষ্কার করতে চাই, তবে আমি ধীরে ধীরে ক্লাস এবং হোম ওয়ার্কের মধ্যে কিছু কোড পুনরায় কাজ করছি, যাতে এটি কিছু সময়ের জন্য না হয়। আপাতত, পুরানো, সুন্দর-সুন্দর ডেমোটি এখানে রয়েছে: j.mp/qIwKYt আন-সুন্দর দ্বারা, আমি আংশিকভাবে বোঝাতে চাইছি এর অনেক ব্যাখ্যা প্রয়োজন, সুতরাং README পড়তে ভুলবেন না এবং এখানে প্রশ্ন জিজ্ঞাসা করতে দ্বিধা বোধ করবেন না বা ইমেইলের মাধ্যমে.
dlras2

3

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

  পোস্টগ্র্যাস এসকিউএল (বিনামূল্যে এবং ওপেন সোর্স)
  http://www.postgresql.org/

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

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

আমি লক্ষ্য করেছি যে কিছু গেম প্রথমবার প্রাপ্তির পরে স্থানীয় হার্ড ড্রাইভে মানচিত্রের ডেটার একটি "ক্যাশে" রাখে (এটি নিঃসন্দেহে নেটওয়ার্ক I / O হ্রাস করতে পারে), যেমন অ্যাশেন সাম্রাজ্য:

  অ্যাশেন সাম্রাজ্য (খেলতে বিনামূল্যে, সুন্দর 2 ডি বাস্তবায়ন)
  http://www.ashenempires.com/

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

অ্যাশেন সাম্রাজ্যের একটি স্ক্রিন শট (কয়েকটি চরিত্র স্থানীয় ব্যাঙ্কে রয়েছে, এবং মেঝেতে bones হাড়গুলির চেহারা দেখে মনে হচ্ছে কয়েকটি কঙ্কালের দানব অবশ্যই ভ্রমন করেছিল এবং সম্ভবত স্থানীয় শহরের রক্ষীরা তাকে হত্যা করেছিল):

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


2

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

তাত্ত্বিকভাবে আপনি আক্ষরিক অসীম মানচিত্রটি করতে পারেন যা খুব ছোট ফাইলটিতে এভাবে সংরক্ষণ করবে।


@ জোশ পেট্রি আমার পোস্টে উল্লেখযোগ্য এবং দুর্দান্ত ভাষা / স্টাইলিস্টিক সংশোধনের জন্য ধন্যবাদ। আফসোস আমি কোনও সম্পাদনা upvote করতে পারি না :-D
sh কোড

1

আপনি কি কিছু অংশ বিভাজন করতে পারেন (আপনার বিশ্বে কিছু ধরণের 'সাবকন্টিনেন্ট / দেশ')? সুতরাং আপনার কাছে এমন কিছু সূচি ফাইল থাকতে পারে যা আপনাকে দ্রুত সন্ধান করতে দেয় যে কোন সাব-ফাইল / বড় ফাইলের অংশ আপনাকে মেমোরির খণ্ড খণ্ডন করতে লোড করতে হবে ...


সবসময় এমন একটি উপায় থাকে যেখানে আপনি অংশগুলি বিভক্ত করতে পারেন। সর্বদা. তারা প্লেয়ারের কাছে দৃশ্যমান হোক / সিস্টেমের অন্যান্য অংশের সাথে প্রাসঙ্গিক থাকুক বা না থাকুক না কেন, সর্বদা একাধিক বিভিন্ন উপায়ে বিশ্বব্যাপী ডেটা ভাগ করার উপায় রয়েছে।
sh কোড

0

আপনি মাইনক্রাফ্ট থেকে ধারণা নিতে পারেন। মূলত তাদের কাছে প্রতি ফাইলের ফাইল ছিল। এখন তারা এমসিআরজিওনের ফর্ম্যাটটি ব্যবহার করে যা 32x32 টি অঞ্চলে বিভক্ত হয় এবং প্রতি ফাইলের মধ্যে একটি সংরক্ষণ করে।

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