تحميل تنسيق DataFile الأمثل على وحدة التحكم في اللعبة

StackOverflow https://stackoverflow.com/questions/1727594

سؤال

أحتاج إلى تحميل نماذج كبيرة وغيرها من البيانات الثنائية المنظمة على وحدة تحكم لعبة CD المستندة إلى الأقراص المضغوطة بكفاءة قدر الإمكان. ما هي أفضل طريقة للقيام بذلك؟ سيتم تصدير البيانات من تطبيق بيثون. هذا هو مشروع هواية متقن جدا.

طلبات:

  • لا اعتماد على STL متوافق مع Standard بالكامل - قد استخدم USTL رغم ذلك.
  • في النفقات العامة قليلا قدر الإمكان. تهدف للحصول على حل جيد جدا. أنه يمكن استخدامه في PlayStation الأصلي، وحتى الآن حديثة وأنيقة قدر الإمكان.
  • لا للخلف / التوافق إلى الأمام ضروري.
  • لا يتم تحميل أي نسخ من قطع كبيرة حول - ويفضل أن يتم تحميل الملفات في ذاكرة الوصول العشوائي في الخلفية، وجميع القمادات الكبيرة التي تم الوصول إليها مباشرة من هناك في وقت لاحق.
  • يجب ألا تعتمد على الهدف وجود نفس النخلة والمحاذاة، أي البرنامج المساعد C في بيثون التي تفريغ بنياتها لن تكون فكرة جيدة للغاية.
  • يجب أن تسمح لنقل البيانات المحملة حولها، كما هو الحال مع الملفات الفردية 1/3 حجم ذاكرة الوصول العشوائي، قد يكون التجزئة مشكلة. لا MMU لسوء المعاملة.
  • التعبئة عبارة عن مكافأة كبيرة، حيث أن انتباهي فترة انتباهي قصيرة للغاية، أي سأغير توفير جزء من الرمز وننسى تحميل واحد أو العكس، لذلك سيكون لحماية غبية على الأقل لطيفة.
  • تتمثل التصريف بين البيانات المحملة وإنشائها عن البيانات التي تم إنشاؤها دون وقت التشغيل، وبدون مشاكل في إدارة الذاكرة الشديد ستكون مكافأة لطيفة.

أنا نوع من مخطط شبه محلي في رؤوس بيثون تافهة، محدودة بناء الجملة والذي سيستخدم الهياكل مع الإزاحة بدلا من المؤشرات، والراحة الملائكة الهيكل / الفصول الدراسية في التطبيق الرئيسي مع الحصول على إزاحة إلى المؤشرات المكتوبة بشكل صحيح / المراجع، ولكن أود أن أسمع اقتراحاتكم.

توضيح: الطلب هو في المقام الأول حول إطار تحميل البيانات وقضايا إدارة الذاكرة.

هل كانت مفيدة؟

المحلول

هذا هو نمط تطوير لعبة مشتركة.

النهج المعتاد هو طهي البيانات في خطوة عملية غير متصلة مسبقا. يمكن أن تدفق النقط الناتج مع الحد الأدنى من النفقات العامة. النقطة تعتمد على منصة ويجب أن تحتوي على المحاذاة المناسبة والانيدي - نيس من النظام الأساسي المستهدف.

عند وقت التشغيل، يمكنك ببساطة إلقاء مؤشر إلى ملف Blob في الذاكرة. يمكنك التعامل مع الهياكل المتداخلة كذلك. إذا حافظت على جدول محتويات مع الإزاحة لجميع قيم المؤشر داخل Blob، يمكنك بعد ذلك إصلاح المؤشرات للإشارة إلى العنوان المناسب. هذا يشبه كيف يعمل DLL Loading.

لقد كنت أعمل على مكتبة روبي، ش.م., ، أن أستخدمها لطهي بيانات لعبة iPhone الخاصة بي.

إليك تخطيط الذاكرة الذي أستخدمه له رأس Blob:

// Memory layout
//
// p begining of file in memory.
// p + 0 : num_pointers
// p + 4 : offset 0
// p + 8 : offset 1
// ...
// p + ((num_pointers - 1) * 4) : offset n-1
// p + (num_pointers * 4) : num_pointers   // again so we can figure out 
//                                            what memory to free.
// p + ((num_pointers + 1) * 4) : start of cooked data
//

إليك كيفية تحميل ملف Binary Blob وإصلاح المؤشرات:

void* bbq_load(const char* filename)
{
    unsigned char* p;
    int size = LoadFileToMemory(filename, &p);
    if(size <= 0)
        return 0;

    // get the start of the pointer table
    unsigned int* ptr_table = (unsigned int*)p;
    unsigned int num_ptrs = *ptr_table;
    ptr_table++;

    // get the start of the actual data
    // the 2 is to skip past both num_pointer values
    unsigned char* base = p + ((num_ptrs + 2) * sizeof(unsigned int));

    // fix up the pointers
    while ((ptr_table + 1) < (unsigned int*)base)
    {
        unsigned int* ptr = (unsigned int*)(base + *ptr_table);
        *ptr = (unsigned int)((unsigned char*)ptr + *ptr);
        ptr_table++;
    }

    return base;
}

لي ش.م. المكتبة ليست جاهزة تماما لمرحلة ما في الوقت المناسب، ولكنها قد تعطيك بعض الأفكار حول كيفية كتابة واحدة نفسك في بيثون.

حظا طيبا وفقك الله!

نصائح أخرى

على منصات مثل Nintendo Gamecube و DS، عادة ما يتم تخزين نماذج ثلاثية الأبعاد بتنسيق مخصص بسيط للغاية:

  • رأس موجز، يحتوي على رقم سحري يحدد الملف، وعدد الرأس، والحيوانات الطبيعية، وما إلى ذلك، واختياره اختيار الاختباري للبيانات التالية الرأس (Adler-32، CRC-16، إلخ).
  • قائمة مضغوطة ربما من 32 بت من TUPLE-TUPS 3-TUPLE لكل ناقلات وعادية.
  • قائمة مضغوطة ربما من الحواف أو الوجوه.
  • جميع البيانات موجودة في تنسيق Entian الأصلي من النظام الأساسي المستهدف.
  • غالبا ما يكون تنسيق الضغط تافهة (Huffman) أو بسيط (حسابي) أو قياسي (GZIP). كل هذه تتطلب القليل جدا من الذاكرة أو القوة الحسابية.

يمكنك التنسيقات من هذا القبيل كإشعار: إنه تمثيل مدمج للغاية.

اقتراحي هو استخدام تنسيق يشبه هياكل البيانات الخاصة بك في الذاكرة، لتقليل ما بعد المعالجة والنسخ. إذا كان هذا يعني أنك تنشئ تنسيق نفسك، فليكن ذلك. لديك احتياجات شديدة، لذلك هناك حاجة إلى تدابير متطرفة.

لاحظ أنه في أي مكان في وصفك، هل تسأل عن "سهولة البرمجة". :-)

وبالتالي، إليك ما يتبادر إلى الذهن بالنسبة لي كوسيلة لإنشاء هذا:

  • يجب أن تكون البيانات في نفس التنسيق الموجود على القرص حيث سيكون في ذاكرة الهدف، بحيث يمكنها ببساطة سحب النقط من القرص إلى ذاكرة مع عدم إعادة تهيئة ذلك. اعتمادا على مقدار الحرية التي تريدها في وضع الأمور في الذاكرة، يمكن أن يكون "النقط" هو الملف بأكمله، أو يمكن أن تكون صغيرة داخلها؛ لا أفهم بياناتك جيدا بما يكفي لتوحيد كيفية تقسيمها ولكن من المفترض أنه يمكنك ذلك. نظرا لأننا لا نستطيع الاعتماد على نفس النخلة والمحاذاة على المضيف، فستحتاج إلى أن تكون ذكيا إلى حد ما عن ترجمة الأشياء عند كتابة الملفات الموجودة على الجانب المضيف، ولكن على الأقل بهذه الطريقة تحتاج فقط إلى الذكاء على جانب واحد من النقل بدلا من كليهما.

  • من أجل توفير القليل من التأكيد على أن مطابقة الجانب المستهدف ومطابقات الجانب المضيف، يجب عليك كتابة هذا في نموذج حيث يمكنك تقديم وصف بيانات واحد ولديك بعض رمز الجيل الذي سيولد كلا رمز الجانب المستهدف و كود بيثون الجانب المضيف منه. يمكن أن يكون لديك حتى مولدك يولد رقم "إصدار" عشوائيا صغيرا في العملية، ولديه رمز الجانب المضيف يكتب هذا في رأس الملف والجانب الهدف تحقق منه، وإعطاك خطأ إذا لم تتطابق وبعد (نقطة استخدام قيمة عشوائية هي أن المعلومات الوحيدة التي تهتم بها هي ما إذا كانت تتطابق، ولا تريد أن تضطر إلى زيادة ذلك يدويا.)

النظر في تخزين البيانات الخاصة بك كقاطع في SQLite DB. SQLite محمول للغاية ومقايض، ANSI C، لديه واجهات C ++ و Python. سيعتني هذا بملفات كبيرة، لا تجزئة وسجلات متغيرة الطول مع وصول سريع وهلم جرا. الباقي هو مجرد تسلسل الهياكل لهذه النقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top