دليل للمبتدئين
ماذا يحدث للنسيج داخل وحدة GPU
قد يشغل ملف PNG حجمه 300 KB ما يصل إلى 5 MB من ذاكرة الرسوميات دون أن تلاحظ. يشرح هذا الدليل السبب، وكيف تقلّص وحدات GPU الأنسجة بالضغط بالكتل، وكيف تختار الصيغة المناسبة. ومع كل فكرة عرض يمكنك تجربته بنفسك.
الفصل 1
حجم الملف ليس حجم الذاكرة
صُممت PNG وJPEG لتخزين الصور وإرسالها. وقبل أن ترسم وحدة GPU النسيج، تُفك الصورة إلى عناصر نسيج (texels) خام، يشغل كل منها عادةً 4 بايت.
تقرأ وحدة GPU هذه العناصر ملايين المرات في كل إطار، لذا يجب أن تكون جاهزة للقراءة دائمًا. ولهذا يعتمد استهلاك الذاكرة على الدقة وصيغة البكسل فقط، لا على مدى جودة ضغط الملف. وتضيف الـ mipmaps، وهي نسخ مصغّرة تُستخدم للأسطح البعيدة، نحو الثلث.
- RGBA832 بت لكل عنصر نسيج213 MiBالمرجع21.3 MiB لكل نسيج
- BC7 · ASTC 4×48 بت لكل عنصر نسيج53.3 MiBأصغر بـ 4×5.3 MiB لكل نسيج
- BC1 · ETC2 RGB4 بت لكل عنصر نسيج26.7 MiBأصغر بـ 8×2.7 MiB لكل نسيج
- ASTC 6×63.56 بت لكل عنصر نسيج23.8 MiBأصغر بـ 9×2.4 MiB لكل نسيج
- ASTC 8×82 بت لكل عنصر نسيج13.3 MiBأصغر بـ 16×1.3 MiB لكل نسيج
- ASTC 12×120.89 بت لكل عنصر نسيج6 MiBأصغر بـ 35.7×612 KiB لكل نسيج
تُقرَّب الصيغ القائمة على الكتل إلى كتل كاملة في كل مستوى mip، لذا تطابق الأرقام ما تحجزه وحدة GPU فعليًا.
الفصل 2
لماذا لا تستطيع وحدة GPU الاحتفاظ بملفات PNG
عندما يقرأ المظلِّل (shader) من نسيج، قد يطلب أي عنصر نسيج وبأي ترتيب، وعلى العتاد أن يجده فورًا.
تستخدم PNG وJPEG ترميزًا متغير الطول: للوصول إلى بكسل في المنتصف يجب فك ترميز كل ما قبله أولًا. أما صيغ GPU فثابتة المعدل: تشغل كل كتلة 4×4 العدد نفسه تمامًا من البايتات، لذا يُحسب عنوان أي عنصر نسيج بعملية ضرب بسيطة. ويبقى النسيج مضغوطًا في الذاكرة، وتفك وحدة النسيج ترميز الكتل أثناء قراءتها.
استخدم مفاتيح الأسهم لتحريك التحديد.
- عنصر النسيج المحدد
- x 13، y 18
- كتلته
- العمود 3، الصف 4
- العنوان في BC1
- (4 × 8 + 3) × 8 بايت = البايت 280
الكتل الـ 64 بترتيبها في الذاكرة
عنصر النسيج نفسه في PNG
يجب فك ضغط الصفوف من 0 إلى 18 أولًا (19 من 32)
الفصل 3
داخل كتلة 4×4
تُظهر صيغة BC1، أقدم صيغة واسعة الاستخدام، الفكرة بأوضح صورة؛ فهي تخزّن كتلة من 16 عنصر نسيج في 8 بايت فقط.
يختار المرمِّز لونين طرفيين. ويمزجهما فاكّ الترميز في أربعة ألوان على خط مستقيم، ويحفظ كل عنصر نسيج رقمًا من 2 بت يشير إلى أقرب لون إليه. تحافظ الكتل ذات التدرجات اللونية الناعمة على شكلها جيدًا، أما الكتل التي تخلط عدة ألوان لا علاقة بينها فلا.
الفصل 4
صيغ كثيرة ومقايضات مختلفة
تستغل الصيغ الأحدث بتاتها بذكاء أكبر من BC1: نقاط طرفية أكثر، وعدة خطوط لونية داخل الكتلة، وقناة ألفا أفضل، أو إمكانية اختيار حجم الكتلة.
تستخدم BC7 وASTC 4×4 ثماني بتات لكل عنصر نسيج وتبدوان قريبتين جدًا من الأصل. أما ASTC فتقايض الجودة بالحجم عبر حجم الكتلة: فالكتلة دائمًا 128 بت، لذا تكلّف كتلة 12×12 أقل من بت واحد لكل عنصر نسيج. وتسلك Basis Universal طريقًا آخر: توزّع ملفًا واحدًا مضغوطًا وتحوّله على الجهاز إلى صيغة تدعمها وحدة GPU تلك.
| الصيغة | بت لكل عنصر نسيج | ألفا | المنصات المعتادة | الأنسب لـ |
|---|---|---|---|---|
| BC1 | 4 | 1 بت | سطح المكتب، أجهزة الألعاب | لون معتم عندما تكون الذاكرة محدودة |
| BC3 | 8 | نعم | سطح المكتب، أجهزة الألعاب | لون بألفا ناعمة في المحتوى القديم |
| BC4 | 4 | قنوات بيانات | سطح المكتب، أجهزة الألعاب | قناة واحدة: أقنعة، خشونة، ارتفاع |
| BC5 | 8 | قنوات بيانات | سطح المكتب، أجهزة الألعاب | خرائط النواظم (X وY) |
| BC6H | 8 | لا | سطح المكتب، أجهزة الألعاب | ألوان HDR مثل صناديق السماء وخرائط الإضاءة |
| BC7 | 8 | نعم | سطح المكتب، أجهزة الألعاب | لون عالي الجودة، مع ألفا أو بدونها |
| ETC1 | 4 | لا | كل أجهزة Android تقريبًا | لون معتم على الأجهزة القديمة جدًا |
| ETC2 | 4–8 | نعم | Android وiOS | بديل واسع الدعم للهواتف |
| ASTC | 0.89–8 | نعم | أجهزة Android وiOS الحديثة، Apple Silicon | جودة قابلة للضبط على الهواتف |
| PVRTC | 2–4 | نعم | أجهزة iPhone وiPad القديمة | أجهزة Apple القديمة فقط |
| Basis ETC1S | يعتمد على الصيغة الهدف | نعم | أي وحدة GPU عبر KTX2 | تنزيلات صغيرة تعمل على أي GPU |
| Basis UASTC | يعتمد على الصيغة الهدف | نعم | أي وحدة GPU عبر KTX2 | جودة عالية تعمل على أي GPU |
اضغط «تشغيل المرمِّزات» لضغط العيّنة. في المرة الأولى يجري تنزيل المرمِّزات.
الفصل 5
اختيار الصيغة
سؤالان يضيّقان الخيارات بسرعة: ما وحدات GPU التي يجب أن تحمّل النسيج؟ وما نوع البيانات التي يحتويها؟
تتفاعل أنسجة الألوان وخرائط النواظم (normal maps) والأقنعة أحادية القناة مع الضغط بطرق مختلفة، كما تدعم منصات سطح المكتب والهاتف والويب عائلات صيغ مختلفة. اختر حالتك لتحصل على نقطة بداية معقولة، ثم تحقق من النتيجة على أنسجتك.
ابدأ بـ
ASTC 6×6
فكّر أيضًا في: ASTC 4×4 · ETC2 RGB
تعمل ASTC على وحدات GPU الحديثة في Android وiOS. يعدّ 6×6 توازنًا جيدًا؛ استخدم 4×4 للأصول المهمة وETC2 للأجهزة القديمة.
افتح مرمِّز ASTCالفصل 6
نصائح عملية
بضع عادات بسيطة تمنع معظم مشكلات ضغط الأنسجة.
- 01
علّم الألوان بـ sRGB والبيانات بالخطي
أنسجة الـ albedo والواجهة تكون بصيغة sRGB. أما خرائط النواظم والخشونة وغيرها من خرائط البيانات فيجب أن تبقى خطية، وإلا ستكون الإضاءة خاطئة.
- 02
خصّص لخرائط النواظم صيغتها الخاصة
استخدم صيغًا ثنائية القناة مثل BC5 أو EAC RG11 وأعد بناء Z في المظلِّل. فصيغ الألوان تهدر البتات وتضيف نتوءات ظاهرة.
- 03
أنشئ الـ mipmaps
تضيف نحو 33% من الذاكرة، لكنها تمنع وميض الأسطح البعيدة وتسرّع القراءة من النسيج.
- 04
اجعل الأبعاد متوافقة مع الكتل
تعمل معظم الصيغ بكتل 4×4، لذا فالأبعاد القابلة للقسمة على 4 لا تحتاج إلى حشو. كما تتطلب الصيغ القديمة مثل PVRTC أبعادًا مربعة من قوى العدد 2.
- 05
افحص محتوى حقيقيًا على أجهزة حقيقية
قارن النتيجة بعد فك الترميز بالأصل عند التكبير الكامل، وتأكد من أن وحدات GPU المستهدفة تدعم الصيغة.
الأسئلة الشائعة
هل ضغط أنسجة GPU بلا فقدان؟
لا. صيغ BC وETC وASTC وPVRTC صيغ ضغط مع فقدان بحجم ثابت لكل كتلة. ويعتمد مقدار فقدان الجودة على الصيغة وحجم الكتلة والصورة.
لماذا لا تُستخدم أنسجة PNG أو JPEG مباشرة؟
تنزيلها أسرع، لكن وحدة GPU لا تستطيع القراءة منها مباشرة، لذا يُفك ترميزها إلى عناصر نسيج خام فتشغل الذاكرة كاملة. أما صيغ GPU فتبقى صغيرة في الذاكرة أيضًا.
ما أفضل صيغة للأنسجة؟
BC7 خيار افتراضي قوي على سطح المكتب، وASTC على الهواتف الحديثة، وKTX2 مع Basis Universal عندما يجب أن يعمل ملف واحد على وحدات GPU كثيرة كما في الويب.
ماذا تعني «البتات لكل عنصر نسيج»؟
هي متوسط تكلفة تخزين عنصر نسيج واحد. تستخدم RGBA8 الخام 32 بت، وBC1 أربع بتات، وBC7 ثماني بتات، بينما تتراوح ASTC من 8 إلى نحو 0.89 بحسب حجم الكتلة.
جرّبه على أنسجتك
تعمل جميع المرمِّزات محليًا في متصفحك. ارفع صورة PNG أو JPEG، واختر صيغة، ثم قارن النتيجة.