سؤال

لذلك أنا أحاول أن أعمل في بلدي قليلا لعبة 3d.الآن أنا أكثر أو أقل تفعل هذا تعلم C#.كنت أتساءل ما هي أفضل منهجية التعبئة والتغليف الأصول مثل القوام/النصية ؟

عموما ما كنت أفكر به هو هذا:

[header]
[number of records]
[Offset to Record 1 from End of header]
[Offset to Record 2 from end of Record 1]
.
.
[Offset to record N from Record N-1]
[record 1]
[256 bytes represent the filename]
[32 byte size]
[binary data]
[record 2]
.
.

الآن أريد فقط أن متجر, بسيطة الصور و الملفات النصية.لقد فعلت بعض النظر حول أفضل شيء أنا حقا وجدت قديما مثال على كيفية العذاب واد يتم تخزينها.

هل من أحد لديه أي خبرة ؟

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

المحلول

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

ومعظم الناس استخدام المكتبة التي تتيح لهم الوصول إلى الرمز البريدي، جرة، .pak (تنسيق الزلزال)، أو أخرى مماثلة (مضغوط أو لا) تنسيق أرشيف، كما لو كانت جزءا من نظام الملفات (أي، يتم الوصول إلى السجلات بواسطة سلسلة المفاتيح). أود بالتأكيد الذهاب بهذه الطريقة إذا كان يمكنك العثور مكتبة بالفعل، على سبيل المثال، truezip للحصول على جافا. أباتشي العموم واحدة، ولكن لا أعرف كم هو سهل لدمج ث / صافي (انها رمز قاعدة C كبيرة أعتقد). ZipFS يبدو انها ملف المركب البريدي. NET الفعلي الذي يحمل سوى الرؤوس في الذاكرة.

وأو مع الارجح سوى أقل قليلا من الراحة، يمكنك استخدام DotNetZip مباشرة

نصائح أخرى

لا تضيعوا وقتكم اختراع تنسيق تخزين الخاص بك.

ويمكنك استخدام SharpZipLib أو مكتبة ضغط أخرى حرة لصافي. مع أنه يمكنك أيضا حزمة ملفات متعددة في أرشيف واحد واستخراج الملفات التي تريد بشكل منفصل على الطلب.

التصميم الخاص بك تبدو جيدة بالنسبة لي, على الرغم من أنني افترض أن المقصود 32 بت الحجم بدلا من 32 بايت!

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

في هذه الحالة قد ترغب في محاولة أكثر فهرسة تصميم, ربما شيء من هذا القبيل:

[HEADER]
[Miscellaneous header stuff]
[Offset to index from start of file]
[Number of entries in index]
[RECORD 1]
[Asset data]
[RECORD 2]
[Asset data]
.
.
[RECORD N]
[Asset data]
[INDEX]
[ID or filename of asset 1]
[Size of asset 1]
[Offset to asset 1 from start of file]
[Other asset 1 flags or whatever]
[ID or filename of asset 2]
[Size of asset 2]
[Offset to asset 2 from start of file]
[Other asset 2 flags or whatever]
.
.

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

سبب وضع المؤشر في نهاية الملف بدلا من الجبهة هو أنه يجعل من الأسهل لإضافة أصول أخرى إلى ملف pack دون الحاجة إلى إعادة بناء كل شيء.وإلا إضافية الدخول في الفهرس الخاص بك سوف رمي كل ما تبذلونه من إزاحة.


تحرير: للرد على التعليقات...

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

ويقول كنت تريد أن تقرأ في نسيج يسمى "TankTexture.بابوا نيو غينيا".هنا هو كيف يمكنك أن تذهب نحو ذلك:

  1. فتح ملف حزمة.
  2. قراءة في حجم ثابت رأس.
  3. استخراج مؤشر إزاحة عدد من المشاركات من الرأس.
  4. تسعى إلى بدء المؤشر.
  5. قراءة مؤشر إلى الصفيف (ثابت مؤشر إدخال حجم مرات عدد إدخالات).
  6. البحث من خلال فهرس الأصول يسمى "TankTexture.بابوا نيو غينيا".
  7. استخراج الأصول إزاحة حجم من إدخال الفهرس.
  8. تسعى إلى بدء الأصول.
  9. قراءة في عدد وحدات البايت التي قدمها حجم الأصول.

بالطبع اللاحقة الأصول سوف تحتاج فقط للخطوات 6-9.

آمل أن يساعد في تفسير ما كنت أفكر.اسمحوا لي أن أعرف إذا كان لديك أي أسئلة أخرى.

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

وأوصى أيضا وجود إدخال إضافي 32 بت "الأعلام" في TOC الخاصة بك والتي من شأنها أن تسمح لك لاستخدام bitfield لتمكين خيارات مثل نوع ضغط، والتشفير وغيرها

وعلى أمل أن يساعد

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

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

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

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