গেম ডেটার জন্য 'বাইনারি এক্সএমএল'?


17

আমি একটি লেভেল এডিটিং সরঞ্জামে কাজ করছি যা এর ডেটা এক্সএমএল হিসাবে সংরক্ষণ করে।

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

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

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

তবে ট্যাগ / বৈশিষ্ট্যর নামগুলির বিশাল সদৃশতা সরাতে - আমাকে এটি আরও কমপ্যাক্ট ফর্ম্যাটে সংরক্ষণ করতে হবে। বৈশিষ্ট্যগুলি দেশীয় প্রকারগুলিও দিতে পারে, সুতরাং, উদাহরণস্বরূপ ভাসমান-পয়েন্টের ডেটা স্টাট হিসাবে নয়, ফ্লোট প্রতি 4 বাইট হিসাবে সংরক্ষণ করা হয়।

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

নাকি আমাকে এই চাকাটি পুনরায় উদ্ভাবন করা উচিত?

বা আমি কি আদর্শকে ভুলে যাওয়া এবং আমার কাঁচা .xML ডেটা (এটি জিপ-এর মতো সংকোচনের সাথে ভালভাবে প্যাক করা উচিত) কমপ্রেস করেছিলাম, এবং কেবল স্মৃতি / পারফরম্যান্সটি অন-লোডে নিয়ে যাচ্ছি?


1
এক্সএমএল খুব ভালভাবে জিজিপ এট ব্যবহার করে সংকুচিত হতে পারে ।
চোরমাস্টার

উত্তর:


18

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

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


1
বিএসএন নামক জেএসএনের একটি বাইনারি সংস্করণ রয়েছে ।
ফিলিপ

12

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

এটার মতো কিছু:

data loadXml(xmlFile)
{
    if (xmlFile has changed OR binFile doesn't exist)
    {
        binFile = convertToBinary(xmlFile)
        save(binFile)
    }
    return loadBinaryXml(binFile)
}

এইভাবে আপনি উভয় বিশ্বের সেরা পেতে। মুক্তির সময়, আপনাকে কেবল সমস্ত বাইনারি ফাইল রয়েছে তা নিশ্চিত করতে হবে।


5

গুগল প্রোটোকল বাফারগুলি যাওয়ার পথে মনে হচ্ছে তবে আমি সেগুলি নিজে ব্যবহার করি নি have
http://code.google.com/p/protobuf/

আপনি একটি। প্রোফাইল ফাইল সংজ্ঞায়িত করেন যা ফাইল ফর্ম্যাটটি বর্ণনা করে:

message Person {
  required int32 id = 1;
  required string name = 2;
  optional string email = 3;
}

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

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

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

আপডেট: প্রোটোকলবাফারগুলির সাথে কাজ করার জন্য সি # এর মতো অন্যান্য ভাষার বেশ কয়েকটি প্রকল্প রয়েছে:
http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns


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

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

"আমি জিনিসের সরঞ্জামগুলির জন্য সি # ব্যবহার করছি" সি # এর জন্য বেশ কয়েকটি প্রকল্প রয়েছে। আমার উত্তর আপডেট।
স্টিফেন

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

4

JSON- ফর্ম্যাট সম্পর্কে কি?

http://www.json.org/xml.html


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

1
@ ব্লুস্ক্রন: না, এতে সমস্যা নেই। অবজেক্টস একটি কাঠামো; আপনি অ্যারেও ব্যবহার করতে পারেন [যা কেবল, দেখতে, এর মতো]। এর অর্থ আপনি গাড়ির নাম এবং বৈশিষ্ট্যগুলি সংরক্ষণ করার জন্য এরকম কিছু দিয়ে শেষ করতে পারেন: "cars":{"ford":[8C,FA,BC,2A,384FFFFF],"holden":[00,00,04,FF,04FF54A9]}আপনি এমনকি "গাড়ি" সনাক্তকারীকে বাদ দিতে পারেন এবং যদি সরাসরি জানেন যে গাড়ির ক্ষেত্রটি কোথায় থাকবে। এমনকি আপনি "ফোর্ড" এবং "হল্ডেন" নামগুলো বাদ পারেন যদি আপনি, সঙ্গে আপনি যাব যে ডেটা সংরক্ষণ করতে হবে না: [...,[[8C,FA,BC,2A,384FFFFF],[00,00,04,FF,04FF54A9]]]। এটি আরও কমপ্যাক্ট পায়?
doppelgreener

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

@ জো: ব্লুস্ক্রন মনে হয় এমন একটি পঠনযোগ্য ফর্ম্যাট সন্ধান করছে যাটির সদৃশ নাম নেই। আমি ঠিক যে অফার করতে JSON এর ক্ষমতা চিত্রিত ছিল। আমি সম্পূর্ণরূপে একমত হয়েছি যদিও একটি নির্দিষ্ট সময়ে আপনি সম্ভবত অবাক হন কেন আপনি এমনকি এইরকম মার্কআপ নিয়ে কেন বিরক্ত করছেন।
ডপপেলগ্র্রেনার

4

JSON ব্যবহার করুন।

(মিউনিসিফ্যান্টের প্রতিক্রিয়ার ভিত্তিতে এবং মূলত অন্য কোথাও প্রকাশিত আপনার উদ্বেগের জবাবে)

আপনি উদ্বেগের বিষয়টি উল্লেখ করেছেন যে XML এর মতো স্থানের নামকরণ উপাদানগুলি নষ্ট করার বিষয়টি JSON এর রয়েছে। এটা না।

জেএসএন দুটি কাঠামোর উপর নির্মিত: নাম / মান জোড়া ( বস্তু ) এবং মানগুলির তালিকা ( অ্যারে ) অর্ডার করা । এক্সএমএল কেবল নাম / মান জোড়ায় নির্মিত।

আপনি যদি মনে করেন যে JSON আপনি যে JSON পড়ছেন তার উপর নির্ভর করে যা স্ব-বর্ণনামূলক এবং মানব-পঠনযোগ্য হতে তৈরি হয়েছে, যেমন (একক বাইট উপস্থাপনের জন্য অষ্টাল অঙ্কের জোড় ব্যবহার করে):

{
    "some": ...,
    "data": ...,
    "fields": ...,
    "cars": [
        {"name":"greg","cost":8C,"speed":FA,"age":04,"driverID":384FFFFF},
        {"name":"ole rustbucket","cost":00,"speed":00,"age":2A,"driverID":04FF54A9}
    ]
}

তবে আপনার কাছে এটির মতো এটি লেখার বিকল্পও রয়েছে, যতক্ষণ আপনি জানেন যে সবকিছু কোথায় থাকবে (এবং আপনার গাড়িগুলির তালিকা পাওয়ার জন্য "গাড়ি" অবজেক্টের চেয়ে সূচক 4 সন্ধান করতে পারেন):

{
    [
        ...,
        ..., 
        ...,
        [["greg",8C,FA,04,384FFFFF],["ole rustbucket",00,00,2A,04FF54A9]],
        ...,
    ]
}

এটা ঠিক না থাকার চেয়ে বেশি সংক্ষিপ্ত পেতে দেয় [, ], ,এবং আপনার মান?

ঠিক আছে, আপনি খাঁটি বাইনারি স্ট্রিমের সন্নিকটে এবং কাছাকাছি যেতে ইচ্ছুক হলে এটি তা করে।

"cars":{"names":["greg","ole rustbucket"],"stream":8CFA04384FFFFF00002A04FF54A9}
or
[["greg","ole rustbucket"],8CFA04384FFFFF00002A04FF54A9]

খুব বেশি অনুকূলিত হয়ে কেবল নিজেকে পায়ে গুলি করবেন না।


2

আমি জানি আপনি একটি উত্তর গ্রহণ করেছেন, তবে গুগল দুটি "ফাস্ট ইনফোজেট" (বাইনারি এক্সএমএল) এবং ভিটিডি-এক্সএমএল।

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

উপরের দুটিরই জনপ্রিয় ভাষাগুলিতে বাইন্ডিং রয়েছে (যার মধ্যে সি # অন্তর্ভুক্ত রয়েছে)।

চিয়ার্স

সমৃদ্ধ


1

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

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

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

এটি একটি চেষ্টা মূল্য হতে পারে। আপনি যেহেতু সি # ব্যবহার করছেন, এটি আপনার ভাষার সাথে ঠিক খাপ খায় কারণ এটি এক্সএনএ (উইন্ডোজ, এক্সবক্স 360, এবং উইন্ডোজ ফোন 7) এর সাথে কাজ করে যা আপনি আইফোনটির উল্লেখ করার পরে থেকে আপনার আগ্রহী বলে মনে করেন?)

সম্পাদনা করুন: কেবলমাত্র সরঞ্জামগুলির জন্য আপনার সি # ব্যবহারের বিষয়টি লক্ষ্য করেছেন। এটি সম্ভবত আপনার কর্মপ্রবাহে খুব ভাল মানায় না। কিছু কারণে আমার মাথায় এক্সএনএ ছিল।

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