ما هي أفضل مكتبة ضغط لكميات صغيرة جدًا من البيانات (3-4 KIB؟)

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

سؤال

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

لقد ضربت حاجزًا مثيرًا للاهتمام. انظر ، الحد الأقصى لحزمة الحزمة هو 2800 بايت ، ويمكن فقط الخروج لكل عميل لكل إطار.

فيما يلي البرنامج النصي للقيام بتأثير "الشرر" (يمكن أن يكون مفيدًا لشرارات تأثير الرصاص ، والصدمات الكهربائية ، وما إلى ذلك)http://pastebin.com/m7acdf519 (إذا لم تفهمها ، فلا تعرقها ؛ إنها بناء جملة مخصص قمت بإنشائها وليست ذات صلة بالسؤال الذي أطرحه.)

لقد فعلت كل شيء ممكن لتقليص حجم هذا البرنامج النصي. لقد قمت حتى بتخفيض الأسماء المتغيرة إلى رسائل واحدة. لكن النتيجة هي بالضبط 405 بايت. وهذا يعني أنه يمكنك وضع 6 من هذه الإطار على الأكثر. لديّ أيضًا في الاعتبار بعض التغييرات من جانب الخادم التي يمكن أن تحلقها في 12 ، وتغيير بروتوكول قد يوفر 6. على الرغم من أن المدخرات ستختلف اعتمادًا على البرنامج النصي الذي تعمل معه.

ومع ذلك ، من بين تلك البايتات البالغ عددها 387 ، أقدر أن 41 فقط ستكون فريدة بين استخدامات متعددة للتأثير. بمعنى آخر ، هذا مرشح رئيسي للضغط.

يحدث فقط أن R1Q2 (محرك Quake 2 متوافق مع المتخلفين مع بروتوكول شبكة ممتد) يحتوي على رمز ضغط ZLIB. يمكنني رفع هذا الرمز ، أو على الأقل متابعته عن كثب كمرجع.

ولكن هل Zlib هو بالضرورة الخيار الأفضل هنا؟ أستطيع أن أفكر في بديل واحد على الأقل ، LZMA ، ويمكن أن يكون هناك بسهولة أكثر.

المتطلبات:

  1. يجب أن يكون سريعًا جدًا (يجب أن يكون أداءً صغيرًا جدًا إذا تم تشغيله أكثر من 100 مرة في الثانية.)
  2. يجب حشر أكبر قدر ممكن من البيانات في 2800 بايت
  3. انبعاثات البيانات الوصفية الصغيرة
  4. GPL متوافق

زلب يبدو جيدًا ، لكن هل هناك أي شيء أفضل؟ ضع في اعتبارك أنه لا يتم دمج أي من هذا الرمز حتى الآن ، لذلك هناك مجال كبير للتجريب.

شكرا ، -max

تحرير: بفضل أولئك الذين اقترحوا تجميع البرامج النصية في Bytecode. كان ينبغي أن أوضح هذا- نعم ، أنا أفعل هذا. إذا كنت ترغب في ذلك ، يمكنك تصفح الكود المصدري ذي الصلة على موقع الويب الخاص بي ، على الرغم من أنه لا يزال "مسبقًا".
هذا هو رمز جانب الخادم:
مكون لوا: http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/lua/scriptedfx.lua
مكون C: http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/game/g_scriptedfx.c
بالنسبة للمثال المحدد الذي نشرته ، يحصل هذا على مصدر بايت 1172 إلى 405 بايت- لا يزال صغيرًا بما يكفي. (ضع في اعتبارك أنني أريد أن أتناسب مع أكبر عدد ممكن من هؤلاء في 2800 بايت!)

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

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

المحلول 2

التحديث النهائي: يبدو أن المكتبتين حول ما يعادل. يعطي Zlib حوالي 20 ٪ ضغطًا أفضل ، في حين أن سرعة فك تشفير LZO تبلغ حوالي ضعف السرعة ، لكن الأداء الناجم عن أي منهما صغير جدًا ، لا يكاد يكون ضئيلاً. هذا هو إجابتي النهائية. شكرا لجميع الإجابات والتعليقات الأخرى!

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

المنشور الأصلي:

حسنًا ، لقد تمكنت أخيرًا من كتابة بعض التعليمات البرمجية لهذا الغرض. لقد بدأت مع Zlib ، وهنا أول النتائج التي توصلت إليها.

ضغط Zlib هو بجنون عظيم. إنه يقلل بشكل موثوق من حزم ، على سبيل المثال ، 8.5 KIB إلى ، على سبيل المثال ، 750 بايت أو أقل ، حتى عند الضغط مع Z_BEST_SPEED (بدلاً من z_default_compression.) وقت الضغط جيد أيضًا.

ومع ذلك ، لم يكن لدي أي فكرة عن سرعة إلغاء الضغط اى شى يمكن أن يكون هذا سيئا. ليس لدي أرقام فعلية ، ولكن يجب أن يستغرق 1/8 ثانية لكل حزمة على الأقل! (Core2Duo T550 @ 1.83 GHz.) غير مقبول تمامًا.

من ما سمعت ، LZMA هي مفاضلة ذات أداء أسوأ مقابل ضغط أفضل عند مقارنتها بـ ZLIB. نظرًا لأن ضغط Zlib مبالغ فيه بالفعل وأدائه أمر سيء بالفعل ، فإن LZMA خارج عن مرئي الجدول غير مرئي في الوقت الحالي.

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

نصائح أخرى

LZO قد يكون مرشح جيد لهذا.

زلب قد يكون مرشحًا جيدًا - الترخيص جيد جدًا ، ويعمل بسرعة ويقول مؤلفوها أن لديها القليل جدًا من النفقات العامة والنفقات العامة هو الشيء الذي يستخدم لكميات صغيرة من البيانات مشكلة.

يجب أن تنظر إلى Opentnl وتكييف بعض التقنيات التي يستخدمونها هناك ، مثل مفهوم سلاسل الشبكة

سأكون أكثر ميلًا إلى استخدام أهم جزء من كل حرف ، والذي يضيع حاليًا ، عن طريق تحويل مجموعات من 9 بايت إلى اليسار ، سوف تتناسب مع 8 بايت.

يمكنك الذهاب إلى أبعد من ذلك ورسم خريطة الأحرف إلى مساحة صغيرة - هل يمكنك الحصول عليها إلى 6 بت (أي فقط وجود 64 حرفًا صالحًا) من خلال عدم السماح بالأحرف الرأسمالية وطرح 0x20 من كل حرف (بحيث تصبح هذه المساحة قيمة 0)

يمكنك الذهاب إلى أبعد من ذلك عن طريق تعيين تواتر كل حرف وجعل ضغط نوع Huffman لتقليل أجزاء أرقام الجشع لكل حرف.

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

ماذا عن إرسال تمثيل ثنائي لنصك؟

لذلك أنا أفكر في خطوط شجرة بناء الجملة المجردة مع كل إجراء له معرف.

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

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