الدرس الأول في تقليص حجم النماذج: تقنيات ضغط الرؤوس الهندسية الثلاث

كم بايت تستهلك بيانات الرؤوس في الواقع؟ دليلك للمفاضلة بين التكميم (Quantization) و MeshOpt و Draco، ولماذا لا يوجد حل مثالي مطلق بل حل أكثر ملاءمة لكل سيناريو.

Kris
ضغط 3Dضغط الرؤوسMeshOptDracoglTF

في المقال السابق، عندما فحصنا بنية ملف GLB، رأينا أن الخامات الملمسية تشغل نحو 80% من الحجم، بينما لا تمثل الرؤوس الهندسية سوى 10% إلى 20%. فهل يعني ذلك أن ضغط الرؤوس غير مهم؟

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

يتناول هذا المقال ثلاثة محاور: الحجم الحقيقي لبيانات الرؤوس، ومقارنة تقنيات التكميم و MeshOpt و Draco، وخلاصة عملية تحميك من الأخطاء: لا يوجد حل مثالي مطلق، بل هناك حل أكثر ملاءمة لكل حالة.

ما هو الحجم الفعلي للرأس الهندسي (Vertex)؟

يتكون كل رأس هندسي في معيار glTF من عدة سمات أساسية:

السمة الهندسيةالوظيفةالدقة الافتراضيةالحجم لكل رأس (بايت)
position (الموقع)إحداثيات الرأس في الفضاء ثلاثي الأبعاد3 × float3212 بايت
normal (الناظم)تحديد اتجاه استجابة السطح للضوء3 × float3212 بايت
tangent (المماس)حسابات خرائط النواظم وتفاصيل الإضاءة4 × float3216 بايت
texcoord_0 (إحداثيات UV)إحداثيات إسقاط خريطة الخامة2 × float328 بايت
color (لون الرأس)تظليل لوني إضافي مباشر4 × float3216 بايت

يستهلك الرأس الهندسي الواحد المكتمل الخصائص ما بين 48 إلى 64 بايت. ونموذج يحتوي على 100 ألف رأس يستهلك نحو 5 إلى 6 ميغابايت لبيانات الرؤوس وحدها.

الملاحظة الجوهرية هنا هي أن كل سمة تستخدم الأعداد العشرية بدقة 32 بت (float32)، وهنا تحديداً تكمن فرصة الضغط؛ فمعظم هذه السمات لا تتطلب تلك الدقة الحسابية المفرطة في التطبيقات البصرية.

التقنية الأولى: التكميم (Quantization)

يمثل التكميم الأساس الرياضي لجميع خوارزميات ضغط الرؤوس؛ وتعتمد عليه خوارزميتا Draco و MeshOpt داخلياً.

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

القيمة الأصلية:  position.x = 1.234567 (float32، 4 بايت)
بعد التكميم:     position.x = 1234     (int16،   2 بايت) + معامل قياس وإزاحة للاسترجاع

مقارنة الحجم قبل التكميم وبعده:

السمةحجم float32 الأصليبعد التكميم (16-bit)نسبة التوفير
position12 بايت6 بايت50%
normal12 بايت6 بايت (أو 4 مع ترميز 8-bit)50% إلى 67%
tangent16 بايت4 إلى 8 بايت50% إلى 75%
texcoord8 بايت4 بايت50%

يخفض التكميم استهلاك الرأس الواحد من 48-64 بايت إلى 16-24 بايت، مما يقلص حجم بيانات الرؤوس إلى النصف فوراً.

متى تستخدم التكميم البسيط؟

  • عندما تريد خفض الحجم دون الحاجة لنسب ضغط قصوى.
  • عندما ترغب في الاستغناء الكامل عن مكتبات فك التشفير الخارجية؛ حيث يدعم امتداد KHR_mesh_quantization في معظم محركات الويب بشكل أصلي ومباشر.
  • في البيئات الحساسة لحجم حزم الأكواد (مثل البرامج المصغرة وتطبيقات الويب خفيفة الوزن).

متى تتجنب التكميم البسيط؟

  • في النماذج الدقيقة جداً (مثل قطع الغيار الصناعية بمقياس المليمتر)؛ حيث قد يؤدي انحراف بمقدار 0.1 مم إلى تشوهات ملحوظة في اللقطات القريبة.

التقنية الثانية: خوارزمية MeshOpt

تمثل MeshOpt الامتداد الرسمي EXT_meshopt_compression في معيار glTF، وتتميز بالجمع بين نسبة ضغط ممتازة وسرعة فك تشفير فائقة.

تعمل الخوارزمية عبر تطبيق التكميم أولاً، ثم استخدام ترميز إنتروبيا عديم الفقد (Lossless Entropy Coding) لضغط الأرقام الصحيحة الناتجة دون المساس بجودتها.

  • نسبة الضغط: أصغر بنسبة 30% إلى 50% مقارنة بالتكميم البسيط بمفرده.
  • سرعة فك التشفير: فائقة السرعة، حيث تعالج عشرات ملايين الرؤوس في الثانية على خيط معالجة واحد.
  • حجم مكتبة فك التشفير: فائق الصغر (حوالي 20 إلى 30 كيلوبايت بعد الضغط).
  • التوافق: مدعومة بشكل قياسي ومباشر في محركي Three.js و Babylon.js.

التقنية الثالثة: خوارزمية Draco

طورت شركة Google خوارزمية Draco لتقديم أعلى نسب ضغط ممكنة للبيانات الهندسية.

يكمن الاختلاف الجوهري في أن Draco تعيد تنظيم طبولوجيا الشبكة واتصال المثلثات بالكامل، لتمثيل كيفية اتصال الرؤوس بأكثر الطرق الرياضية اختصاراً.

  • نسبة الضغط: الأعلى بين جميع الحلول؛ وتحقق في النماذج الكثيفة توفيراً يتجاوز 90%.
  • سرعة فك التشفير: أبطأ نسبياً من الحلين السابقين.
  • حجم مكتبة فك التشفير: أكبر حجماً (حوالي 100 إلى 200 كيلوبايت كملف wasm منفصل).

متى تستخدم Draco؟

  • النماذج الضخمة جداً ذات ملايين الرؤوس وسحب النقاط التضاريسية.
  • المشاهد التي يتم تحميلها لمرة واحدة ويستمر استخدامها لفترة طويلة.

جدول المقارنة الشامل للمفاضلة

الخيارنسبة الضغط (مقارنة بـ float32)سرعة فك التشفيرحجم مفكك التشفيرهل تفقد البيانات؟امتداد glTF القياسي
التكميم البسيطحوالي 50%فورية بدون مكتبة خارجية0 بايتنعم (دقة الأرقام)KHR_mesh_quantization
خوارزمية MeshOptحوالي 25% إلى 35%فائقة السرعة~25 كيلوبايتنعم (دقة الأرقام)EXT_meshopt_compression
خوارزمية Dracoحوالي 10% إلى 20%متوسطة~100 إلى 200 كيلوبايتنعم (الدقة والطبولوجيا)KHR_draco_mesh_compression

التوافق عبر المنصات المختلفة:

المنصةالتكميم البسيطخوارزمية MeshOptخوارزمية Draco
متصفحات سطح المكتبمدعوم أصلياًمدعوم أصلياًمدعوم بمفكك تشفير
متصفحات الهواتفمدعوم أصلياًمدعوم أصلياًمفكك التشفير ثقيل نسبياً
تطبيقات الواقع الافتراضي WebXRمدعوم أصلياًموصى به بشدةيتطلب الحذر
البرامج المصغرة وتطبيقات الجوالموصى به بشدةموصى به بشدةيفضل تجنبه

التطبيق العملي باستخدام أداة gltfpack

تتيح أداة gltfpack تطبيق التكميم و MeshOpt بأوامر سريعة:

# تكميم النموذج إلى 16 بت مع تطبيق ضغط MeshOpt
gltfpack -i model.glb -o model-packed.glb -cc

أهم الأوامر:

# التكميم فقط بدون MeshOpt (بدون أي مكتبة خارجية مطلوبة)
gltfpack -i model.glb -o model-quant.glb

# التكميم مع تفعيل ضغط MeshOpt الكامل
gltfpack -i model.glb -o model-meshopt.glb -cc

# تبسيط عدد المثلثات إلى 50% مع الضغط في النماذج الضخمة
gltfpack -i model.glb -o model-simplify.glb -cc -si 0.5

نتائج اختبار عملية على نموذج PBR بحجم 5 ميغابايت و 120 ألف رأس:

نوع المعالجةحجم الملف الناتجالملاحظات
الملف الأصلي (float32)5.0 ميغابايتنقطة الأساس
التكميم فقط (افتراضي)2.6 ميغابايتانخفاض للنصف دون فرق بصري
ضغط MeshOpt الكامل (-cc)1.7 ميغابايتتوفير إضافي بنسبة 35% وسرعة تحميل أعلى

أخطاء شائعة وكيفية تجنبها

  • انعكاس اتجاه النواظم بعد التكميم: ينتج عادة عن قلة الدقة؛ استخدم دقة 16 بت للنواظم على الأقل.
  • اختفاء الخامات بعد فك تشفير Draco: تضغط Draco البيانات الهندسية فقط؛ تأكد من تكوين محمل الخامات المناسب بالتوازي.
  • انزياح النموذج عن موضعه الأصلي: يحدث عند ابتعاد النموذج عن نقطة الأصل (0,0,0)؛ انقل النموذج إلى نقطة الأصل قبل التكميم.

الخطوة التالية

تم ضغط الرؤوس بنجاح، ولكن الخامات ما تزال تمثل الحجم الأكبر. يستعرض المقال القادم سبب استنزاف صور PNG و JPG لذاكرة الرسوميات، وكيف تحل صيغ الخامات الأصلية هذه المعضلة جذرياً.

أدوات ذات صلة

6
عرض الكل

ضغط نماذج 3D

تحويل النموذج ثلاثي الأبعاد إلى صورة

عارض النماذج ثلاثية الأبعاد (3D Model Viewer)

ضغط رؤوس النماذج ثلاثية الأبعاد (Vertex Compression)

تحويل STL إلى صورة

عارض GLB