لماذا تعد النماذج ثلاثية الأبعاد ثقيلة جداً؟
حجم ملف GLB لديك 10 ميغابايت فقط، لكنه يلتهم 200 ميغابايت من ذاكرة الرسوميات على الهاتف ويتسبب في انهيار المتصفح. دعنا نكشف حقيقة ما يحدث وراء الكواليس.
نموذجك يكتسب وزناً خفياً
تقوم بتصدير ملف GLB بحجم 10 ميغابايت، ويبدو الحجم مناسباً تماماً. لكن عند رفعه وتشغيله على الهاتف المحمول، تفاجأ بشاشة بيضاء أو بطء شديد أو انهيار مفاجئ للمتصفح.
يعمل النموذج بسلاسة على حواسيب سطح المكتب، لكنه ينفجر على الهواتف. المشكلة ليست في كودك البرمجي؛ فالنماذج ثلاثية الأبعاد تمتلك خاصية غير بديهية: حجم الملف على القرص يختلف تماماً عن حجمه داخل ذاكرة الرسوميات (VRAM).
صورة JPEG على القرص قد تشغل 200 كيلوبايت فقط. لكن معالج الرسوميات GPU لا يتعامل مع خوارزميات ضغط JPEG، بل يقرأ البكسلات الخام فقط. لذلك، قبل رفع الصورة إلى VRAM، يتم فك ضغطها بالكامل. خامة بدقة 2048×2048 بعد فك ضغطها تستهلك حوالي 22 ميغابايت من VRAM. وإذا كان لديك 6 خرائط لخامة PBR واحدة (الألوان والنواظم والخشونة والمعدنية والانسداد المحيطي والتوهج)، فإن خامة مجسم واحد تبتلع 132 ميغابايت.
إذا كانت ذاكرة الرسوميات المتاحة للهاتف تتراوح بين 2 إلى 4 غيغابايت، فإن خامات نموذج واحد فقط استهلكت 3% إلى 6% من إجمالي الذاكرة. فماذا لو كان المشهد يحتوي على 10 مجسمات؟
أين تذهب كل هذه المساحة داخل النموذج؟
يتكون ملف GLB القياسي من ثلاثة أجزاء رئيسية: بيانات الرؤوس الهندسية، و خرائط الخامات الملمسية، والبيانات الوصفية وحركات التحريك.
توزيع الأحجام في نموذج PBR نموذجي:
| المكون | المحتوى الداخلي | النسبة التقريبية من الحجم | الملاحظات |
|---|---|---|---|
| خرائط الخامات | خرائط الألوان والنواظم والخشونة والمعدنية وغيرها | 70% إلى 85% | الجزء الأكبر وزناً دائماً |
| بيانات الرؤوس | إحداثيات الموقع والنواظم وإحداثيات UV والمماسات | 10% إلى 20% | ترتبط بكثافة المضلعات |
| بيانات الحركة | العظام والأوزان الجلدية والإطارات المفتاحية | 0% إلى 15% | في النماذج المتحركة فقط |
| أخرى | تعريفات المواد وبنية المشهد والكاميرات | أقل من 2% | يمكن إهمال حجمها |
تمثل الخامات حوالي 80% من الحجم. يظن المطورون غالباً أن تحسين الرؤوس الهندسية كافٍ، لكن المستنزف الحقيقي للذاكرة هو الخامات.

"صغير على القرص" لا يعني إطلاقاً "صغير في ذاكرة الرسوميات"
هذه النقطة هي الركيزة الأساسية لفهم أداء الرسوميات ثلاثية الأبعاد على الويب.
صُممت صيغتا PNG و JPEG للنقل الشبكي السريع وصغر الحجم على القرص، لكن معالج GPU لا يستطيع استخدامهما مباشرة، بل يفك ضغطهما إلى مصفوفات بكسلات خام وفق المعادلة:
استهلاك ذاكرة VRAM = العرض × الارتفاع × 4 بايت (RGBA) × 1.333 (مع مستويات Mipmaps)
خامة RGBA بدقة 4096×4096:
| المقياس | القيمة |
|---|---|
| حجم ملف PNG على القرص | حوالي 8 ميغابايت |
| حجم ملف JPEG على القرص | حوالي 1.5 ميغابايت |
| استهلاك ذاكرة VRAM (مع Mipmaps) | حوالي 87 ميغابايت |
ملف JPEG بحجم 1.5 ميغابايت يتحول إلى 87 ميغابايت في ذاكرة GPU.
ما هي مستويات Mipmaps؟ يقوم معالج GPU بتوليد سلسلة من النسخ المصغرة تدريجياً للخامة من حجمها الكامل حتى 1×1 بكسل. يحسن هذا من سرعة ونقاء رندر المجسمات البعيدة، لكنه يضيف عبئاً قدره 33% في استهلاك الذاكرة. وتعتمد جميع محركات الويب ثلاثية الأبعاد على Mipmaps بشكل قياسي.
تشبه ملفات PNG و JPEG أكياس تفريغ الهواء للملابس: صغيرة جداً أثناء السفر، لكن يجب فتحها ونفخها بالكامل عند الوصول؛ التنزيل سريع لكن الذاكرة ممتلئة تماماً.

ماذا يحدث عند نفاد ذاكرة الرسوميات؟
لن تظهر لك رسالة خطأ مهذبة تخبرك بنفاد الذاكرة، بل تحدث مشكلات أكثر إحباطاً:
- في الهواتف المحمولة: شاشة بيضاء أو إغلاق قسري لعلامة التبويب من نظام التشغيل.
- في نظارات الواقع الافتراضي: هبوط حاد في معدل الإطارات يسبب دوار الحركة للمستخدم.
- في الحواسيب المكتبية: وميض وتشوه في الخامات وتباطؤ شديد في الرندر.
مسارا الضغط الأساسيان
ينقسم ضغط النماذج ثلاثية الأبعاد إلى مسارين رئيسيين:
ضغط الرؤوس الهندسية: تخزين إحداثيات الرؤوس والنواظم وإحداثيات UV بطريقة أكثر إيجازاً (مثل التكميم من 32 بت إلى 16 بت). وأبرز الحلول: Draco و MeshOpt و KHR_mesh_quantization.
ضغط الخامات الملمسية: إبقاء الخامات مضغوطة حتى داخل ذاكرة الرسوميات VRAM وفك تشفير البكسلات لحظياً عند أخذ العينات. والحل القياسي الأبرز هو: KTX2 + Basis Universal.
| وجه المقارنة | ضغط الرؤوس الهندسية | ضغط الخامات الملمسية |
|---|---|---|
| الهدف من التقليص | البيانات الهندسية للمجسم | صور الخامات الملمسية |
| التأثير المعتاد | تقليص حجم الملف 50% إلى 90% | تقليص الحجم على القرص 50-70% والذاكرة 75% |
| هل يؤدي لفقد البيانات؟ | نعم (انخفاض دقة الأرقام) | نعم (انخفاض طفيف في التفاصيل) |
| الاستخدام الأمثل | النماذج عالية الكثافة المضلعية | جميع نماذج PBR تقريباً |
الخطأ الشائع هو الاكتفاء بضغط الرؤوس عبر Draco وإهمال الخامات التي تشكل 80% من حجم النموذج؛ فالتحسين الحقيقي يتطلب معالجة المسارين معاً.
لا يوجد حل واحد يناسب جميع المنصات
تختلف استراتيجيات الضغط باختلاف المنصة والبيئة:
| السيناريو | عنق الزجاجة الأساسي | محور التركيز |
|---|---|---|
| مواقع الويب لسطح المكتب | سرعة التنزيل | حجم الملف على القرص |
| متصفحات الهواتف المحمولة | ذاكرة الرسوميات VRAM | ضغط الخامات الملمسية |
| نظارات الواقع الافتراضي | الذاكرة ومعدل الإطارات | ضغط الخامات وتبسيط المضلعات |
| البرامج المصغرة وتطبيقات الجوال | حجم الحزمة والتوافق | حلول خفيفة الوزن (MeshOpt) |
| المشاهد الكبيرة والمعقدة | الذاكرة واستدعاءات الرسم | الضغط الكامل مع مستويات التفاصيل LOD |
الخطوة التالية
بعد توضيح جذور المشكلة، يستعرض المقال التالي في السلسلة التطبيق العملي لتقنيات ضغط الرؤوس الثلاث: التكميم و MeshOpt و Draco.