C ++ में क्रमांकन के लिए अच्छे समाधान क्या हैं? [बन्द है]


18

मैं उत्सुक हूं कि विभिन्न प्रकार के डेटा को उनके गेम के लिए सौदा करने के लिए डेवलपर्स ने क्या समाधान गेम तैयार किया है। क्या आप लोग कुछ अखंड गेमऑबजेक्ट पदानुक्रम का उपयोग करते हैं जो व्युत्पन्न प्रकारों के लिए एक क्रमबद्ध इंटरफ़ेस का उपयोग करते हैं, कस्टम आरटीटीआई-आधारित समाधान के प्रकार का उपयोग करते हैं, कुछ वर्गों के लिए स्पष्ट धारावाहिकिकरण करते हैं, या कुछ ओपन सोर्स समाधानों का उपयोग करते हैं (बूस्ट) सीरियल: s11n, आदि)।


1
मुझे लगता है कि खेल विकास प्रोग्रामिंग में क्रमांकन एक महत्वपूर्ण विषय है, लेकिन मुझे यह सवाल पसंद नहीं है। आप क्या करने की कोशिश कर रहे हैं? आप किन विशिष्ट समस्याओं को हल करने की कोशिश कर रहे हैं? इसके बदले में, मैंने इसे एक समुदाय विकी में बदल दिया, ताकि यह एक चर्चा प्रारूप का अधिक हो।
तेतराद

मुझे लगता है कि इसके लिए कुछ प्रारूपण लागू करना अच्छा होगा, (संस्करण नियंत्रण प्रश्न)।
जेसी दोर्से

जवाबों:


9

Google से प्रोटोकॉल बफ़र्स c ++ ऑब्जेक्ट्स को क्रमबद्ध करने के लिए एक बहुत अच्छा दृष्टिकोण हो सकता है। आपको कुछ मध्यवर्ती वस्तुओं को क्रमांकन प्रक्रिया का हिस्सा बनाना पड़ सकता है, लेकिन यह कई प्लेटफार्मों और भाषाओं में भी काम करती है।


1
मैं इसका उपयोग कर रहा हूं और यह आसान है यदि आप अपनी निर्माण प्रणाली में कोड पीढ़ी को स्वचालित कर सकते हैं। हालांकि वास्तव में उत्कृष्ट लाभ यह है कि यह आपको उपयोग किए गए प्लेटफ़ॉर्म के बारे में बिना दूरस्थ मशीनरी पर डेटा स्थानांतरित करने की अनुमति देता है, और यह इसके लिए अनुकूलित है ताकि उत्पन्न वस्तुएं बड़ी न हों।
12

10

हम अपने खेल में केवल बूस्ट का उपयोग करते हैं। गर्भाधान , इसका उपयोग करना बहुत आसान है और बहुत तेज है, लेकिन यह मेरी राय में savegames के लिए उपयोगी है। यदि आप वर्ण बनाने की कोशिश करते हैं, तो मैं आपको कुछ XML'ish या JSON आधारित चीजों की सलाह देता हूं, क्योंकि वे पढ़ने में आसान हैं और भले ही आपके पास संपादक न हों।


मैंने बढ़ावा देखा है :: क्लाइंट / सर्वर संचार के लिए भी क्रमिक रूप से उपयोग किया जाता है। हालांकि, AFAIK यह स्ट्रीम-आधारित है, इसलिए यह बिल्कुल सहिष्णु संस्करण नहीं है। यह क्लाइंट / सर्वर संचार के लिए एक सौदा-ब्रेकर नहीं हो सकता है, लेकिन यदि आप इसे सहेजे गए गेम के लिए उपयोग करते हैं, तो गेम डेटा संरचनाओं में कोई भी परिवर्तन पुराने सहेजे गए गेम को लोड कर रहा है एक आभासी असंभवता (पुराने ऑब्जेक्ट संस्करणों को लोड करने के लिए समर्थन) एक असली घर का काम बन जाता है। )।
माइक स्ट्रोबेल

2
@MikeStrobel मैं हाल ही में कुछ क्रमांकन और json किट की समीक्षा कर रहा था और इस टिप्पणी पर आया। बढ़ावा :: क्रमांकन स्पष्ट रूप से संस्करण का समर्थन करता है। क्रमबद्ध कॉल एक संस्करण संख्या प्राप्त कर सकते हैं और फिर यह मूल ब्रांचिंग लॉजिक (यदि (संस्करण> 1.0) ...) को लागू करने के लिए उपयोगकर्ता पर निर्भर है। कुल मिलाकर काफी मजबूत लग रहा है।
M2tM

शर्म की बात है कि यह कस्टम एलोकेटर / डिलेटर का समर्थन नहीं करता है।
जेम्समड

1
मैंने सिर्फ़ सीरियलाइज़ेशन से लेकर अनाज तक को बढ़ावा दिया है। पोर्ट उल्लेखनीय रूप से चिकना था । इसने एक जादू की तरह काम किया। अनाज xml, json, बाइनरी और पोर्टेबल बाइनरी का समर्थन करता है । कारण है कि मैं अनाज के लिए रखी पिछले एक था। मुझे पोर्टेबल बाइनरी आर्काइव्स की आवश्यकता थी क्योंकि मैं एक सर्वर चलाता हूं जिसके लिए क्लाइंट (अब एक मैक, जल्द ही आईओएस और एंड्रॉइड) कनेक्ट होते हैं। मैं सीरियलाइजेशन को बढ़ावा देने के साथ काफी खुश था लेकिन मुझे लगता है कि अनाज की कुछ विशेषताएं इसे बेहतर तरीके से आगे बढ़ाती हैं, जैसे कि उल्लेखित पोर्टेबल बाइनरी सीरियलाइजेशन। लैंग्वेज इंटरॉप प्रोटोकॉल बफ़र्स के लिए और यह बेहतर है।
जर्मेन डियागो

डॉक्स प्रति बढ़ावा। थरथराइज़ेशन थ्रेड-सुरक्षित नहीं है। न तो अनाज है कि एक समान एपीआई का उपयोग करता है।
हाय-एंजेल

3

मैं क्रमबद्धता के लिए JSON पसंद करता हूं। यह पार्स करने के लिए बहुत सरल है और http://jsoncpp.sourceforge.net/ पर मुफ्त लाइब्रेरी उपलब्ध हैं। मैं C ++ में कभी भी बूस्ट या RTTI का प्रशंसक नहीं रहा हूं। Tinyxml xml क्रमांकन और डीसेरिएलाइज़ेशन के लिए भी अच्छी तरह से काम करता है। http://www.grinninglizard.com/tinyxml/ अंत में मुझे क्रमिककरण के लिए जितना अधिक समय देना है उतना मैं नहीं चाहता।


2

Google FlatBuffers जावा और गो के समर्थन के साथ, C ++ के लिए एक कुशल क्रॉस प्लेटफॉर्म क्रमांकन लाइब्रेरी है। यह Google पर विशेष रूप से खेल विकास और अन्य प्रदर्शन-महत्वपूर्ण अनुप्रयोगों के लिए बनाया गया था।

यह अपाचे लाइसेंस, वी 2 के तहत खुले स्रोत के रूप में उपलब्ध है।



1

XDS केवल इस उद्देश्य के लिए डिज़ाइन किया गया था, यह आपको विकास के दौरान XML के लाभ और वितरण समय पर एक कॉम्पैक्ट बाइनरी प्रतिनिधित्व के लाभ प्रदान करता है।


मुझे वास्तव में यकीन नहीं है कि एक्सडीएस Google प्रोटोकॉल बफ़र्स से अलग क्या है? वे उसी उद्देश्य की सेवा करते हैं, सिवाय इसके कि XDS पहले था।
जैकोमो

आप निश्चित रूप से एक्सएसडी का मतलब है और एक्सडीएस नहीं? codeynthesis.com/products/xsd मैं सूची को पूरा करने के लिए इसके बारे में एक उत्तर पोस्ट करना चाहता था।
v.oddou

1

यदि आप एक लिनक्स प्लेटफॉर्म पर हैं, तो आप सीधे json.hक्रमांकन के लिए लाइब्रेरी का उपयोग कर सकते हैं । यहाँ नमूना कोड मैं भर आया हूँ। स्रोत: जसन सीरियल

//============================================================================
// Name        : JsonTest.cpp
// Author      : Manis Kumar Khedawat
//============================================================================

#include <iostream>
#include <json/json.h>

using namespace std;

struct objStruct{
    string str;
    int n1;
    int n2;
};

typedef objStruct obj;

void serializeToJson(json_object *jObj,obj* pObj)
{
    /*
    string str;
    int n1;
    int n2;
    */

    // Create json object for every member in struct Obj.

    json_object *jstr = json_object_new_string (pObj->str.c_str());
    json_object *jn1 =json_object_new_int(pObj->n1);
    json_object *jn2 =json_object_new_int(pObj->n2);

    // Add all above created object into jObj

    json_object_object_add(jObj,"str",jstr);
    json_object_object_add(jObj,"n1",jn1);
    json_object_object_add(jObj,"n2",jn2);

    // pObj is Serialzed into jObj
}

void deSerializeToJson(json_object *jObj,obj* pObj)
{
    /*
    string str;
    int n1;
    int n2;
    */

    // Get every member as different json obj from jObj
    json_object *jstr = json_object_object_get (jObj,"str");
    json_object *jn1 =json_object_object_get(jObj,"n1");
    json_object *jn2 =json_object_object_get(jObj,"n2");

    pObj->str=json_object_get_string(jstr);
    pObj->n1=json_object_get_int(jn1);
    pObj->n2=json_object_get_int(jn2);

    // jObj is DeSerialzed into pObj
}

int main() {
    // Lets Create an Object which we will serialze into Json
    obj obj1;
    obj1.n1=3;
    obj1.n2=6;
    obj1.str="This is String";

    // Create a json Object
    json_object* jObj=json_object_new_object();

    // To serialize into Json Object
    // Please Keep in mind , we are passing address of object (pointer) & not object
    serializeToJson(jObj,&obj1);

    obj obj2;
    // To serialize into Json Object
    // Please Keep in mind , we are passing address of object (pointer) & not object
    deSerializeToJson(jObj,&obj2);

    cout<<"String str == "<<obj2.str<<endl;
    cout<<"n1 & n2 : "<<obj2.n1<<" "<<obj2.n2<<endl;

    return 0;
}

0

JsonCpp और प्रोटोकॉल बफ़र दोनों ही अच्छे विकल्प हैं। मेरी जानकारी में दोनों ही आपको बॉक्स से पेड़ की संरचनाओं को सिलसिलेवार करने की अनुमति देने जा रहे हैं (कृपया मुझे गलत समझें तो सही करें)। बढ़ावा देने :: :: क्रमांकन मनमाने ढंग से रेखांकन संभाल सकता है, लेकिन एक अच्छा पाठ प्रारूप नहीं है जैसे कि json (मुझे लगता है कि एक xml प्रारूप है)

व्यक्तिगत रूप से मुझे लगता है कि डोज़ो ने जोसन क्रमांकन के लिए दृष्टिकोण सबसे अच्छा है
http://docs.dojocampus.org/dojox/json/ref

मैंने इसे c ++ में jsoncpp का उपयोग करते हुए अपना खुद का संस्करण बनाया, वह भी टाइप की गई वस्तुओं को डिसेर्बलाइज़ करेगा (मेरे पास मेरे सभी प्रकारों के लिए बड़े कारखाने हैं)। यह मुझे जसन फ़ाइलों के संग्रह से एक दृश्य बनाने की अनुमति देता है जिसे किसी भी तरह से संदर्भित किया जा सकता है कृपया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.