الدرس الأول في تقليص حجم النماذج: تقنيات ضغط الرؤوس الهندسية الثلاث
كم بايت تستهلك بيانات الرؤوس في الواقع؟ دليلك للمفاضلة بين التكميم (Quantization) و MeshOpt و Draco، ولماذا لا يوجد حل مثالي مطلق بل حل أكثر ملاءمة لكل سيناريو.
في المقال السابق، عندما فحصنا بنية ملف GLB، رأينا أن الخامات الملمسية تشغل نحو 80% من الحجم، بينما لا تمثل الرؤوس الهندسية سوى 10% إلى 20%. فهل يعني ذلك أن ضغط الرؤوس غير مهم؟
على العكس تماماً. عندما يتم ضغط الخامات بتنسيق KTX2 في النماذج كثيفة المضلعات، تصبح الرؤوس هي الكتلة المتبقية؛ ويمكن تقليص هذه النسبة بمقدار النصف أو بنسبة تصل إلى 90%. والأهم من ذلك أن ضغط الرؤوس يعد من أقل التحسينات تكلفة وأسرعها نتيجة: بضعة أوامر برمجية ومكتبة فك تشفير خفيفة تضمن تقليص حجم الملف فوراً.
يتناول هذا المقال ثلاثة محاور: الحجم الحقيقي لبيانات الرؤوس، ومقارنة تقنيات التكميم و MeshOpt و Draco، وخلاصة عملية تحميك من الأخطاء: لا يوجد حل مثالي مطلق، بل هناك حل أكثر ملاءمة لكل حالة.
ما هو الحجم الفعلي للرأس الهندسي (Vertex)؟
يتكون كل رأس هندسي في معيار glTF من عدة سمات أساسية:
| السمة الهندسية | الوظيفة | الدقة الافتراضية | الحجم لكل رأس (بايت) |
|---|---|---|---|
| position (الموقع) | إحداثيات الرأس في الفضاء ثلاثي الأبعاد | 3 × float32 | 12 بايت |
| normal (الناظم) | تحديد اتجاه استجابة السطح للضوء | 3 × float32 | 12 بايت |
| tangent (المماس) | حسابات خرائط النواظم وتفاصيل الإضاءة | 4 × float32 | 16 بايت |
| texcoord_0 (إحداثيات UV) | إحداثيات إسقاط خريطة الخامة | 2 × float32 | 8 بايت |
| color (لون الرأس) | تظليل لوني إضافي مباشر | 4 × float32 | 16 بايت |
يستهلك الرأس الهندسي الواحد المكتمل الخصائص ما بين 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) | نسبة التوفير |
|---|---|---|---|
| position | 12 بايت | 6 بايت | 50% |
| normal | 12 بايت | 6 بايت (أو 4 مع ترميز 8-bit) | 50% إلى 67% |
| tangent | 16 بايت | 4 إلى 8 بايت | 50% إلى 75% |
| texcoord | 8 بايت | 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 لذاكرة الرسوميات، وكيف تحل صيغ الخامات الأصلية هذه المعضلة جذرياً.