دليل للمبتدئين

ماذا يحدث للنسيج داخل وحدة GPU

قد يشغل ملف PNG حجمه 300 KB ما يصل إلى 5 MB من ذاكرة الرسوميات دون أن تلاحظ. يشرح هذا الدليل السبب، وكيف تقلّص وحدات GPU الأنسجة بالضغط بالكتل، وكيف تختار الصيغة المناسبة. ومع كل فكرة عرض يمكنك تجربته بنفسك.

نحو 10 دقائق5 عروض تفاعلية
ابدأ القراءة

الفصل 1

حجم الملف ليس حجم الذاكرة

صُممت PNG وJPEG لتخزين الصور وإرسالها. وقبل أن ترسم وحدة GPU النسيج، تُفك الصورة إلى عناصر نسيج (texels) خام، يشغل كل منها عادةً 4 بايت.

تقرأ وحدة GPU هذه العناصر ملايين المرات في كل إطار، لذا يجب أن تكون جاهزة للقراءة دائمًا. ولهذا يعتمد استهلاك الذاكرة على الدقة وصيغة البكسل فقط، لا على مدى جودة ضغط الملف. وتضيف الـ mipmaps، وهي نسخ مصغّرة تُستخدم للأسطح البعيدة، نحو الثلث.

جرّبهحاسبة ذاكرة الرسومياتغيّر الدقة وعدد الأنسجة لترى كم تحتاج الأنسجة نفسها من ذاكرة GPU في كل صيغة.
الدقة
  • RGBA8
    32 بت لكل عنصر نسيج
    213 MiB
    المرجع
    21.3 MiB لكل نسيج
  • BC7 · ASTC 4×4
    8 بت لكل عنصر نسيج
    53.3 MiB
    أصغر بـ 4×
    5.3 MiB لكل نسيج
  • BC1 · ETC2 RGB
    4 بت لكل عنصر نسيج
    26.7 MiB
    أصغر بـ 8×
    2.7 MiB لكل نسيج
  • ASTC 6×6
    3.56 بت لكل عنصر نسيج
    23.8 MiB
    أصغر بـ 9×
    2.4 MiB لكل نسيج
  • ASTC 8×8
    2 بت لكل عنصر نسيج
    13.3 MiB
    أصغر بـ 16×
    1.3 MiB لكل نسيج
  • ASTC 12×12
    0.89 بت لكل عنصر نسيج
    6 MiB
    أصغر بـ 35.7×
    612 KiB لكل نسيج

تُقرَّب الصيغ القائمة على الكتل إلى كتل كاملة في كل مستوى mip، لذا تطابق الأرقام ما تحجزه وحدة GPU فعليًا.

الفصل 2

لماذا لا تستطيع وحدة GPU الاحتفاظ بملفات PNG

عندما يقرأ المظلِّل (shader) من نسيج، قد يطلب أي عنصر نسيج وبأي ترتيب، وعلى العتاد أن يجده فورًا.

تستخدم PNG وJPEG ترميزًا متغير الطول: للوصول إلى بكسل في المنتصف يجب فك ترميز كل ما قبله أولًا. أما صيغ GPU فثابتة المعدل: تشغل كل كتلة 4×4 العدد نفسه تمامًا من البايتات، لذا يُحسب عنوان أي عنصر نسيج بعملية ضرب بسيطة. ويبقى النسيج مضغوطًا في الذاكرة، وتفك وحدة النسيج ترميز الكتل أثناء قراءتها.

جرّبهاعثر على عنصر نسيجانقر أي عنصر نسيج في هذا النسيج بحجم 32×32. تستطيع الصيغة القائمة على الكتل حساب مكان تخزينه، أما PNG فلا.

استخدم مفاتيح الأسهم لتحريك التحديد.

عنصر النسيج المحدد
x 13، y 18
كتلته
العمود 3، الصف 4
العنوان في BC1
(4 × 8 + 3) × 8 بايت = البايت 280

الكتل الـ 64 بترتيبها في الذاكرة

0511

عنصر النسيج نفسه في PNG

يجب فك ضغط الصفوف من 0 إلى 18 أولًا (19 من 32)

الفصل 3

داخل كتلة 4×4

تُظهر صيغة BC1، أقدم صيغة واسعة الاستخدام، الفكرة بأوضح صورة؛ فهي تخزّن كتلة من 16 عنصر نسيج في 8 بايت فقط.

يختار المرمِّز لونين طرفيين. ويمزجهما فاكّ الترميز في أربعة ألوان على خط مستقيم، ويحفظ كل عنصر نسيج رقمًا من 2 بت يشير إلى أقرب لون إليه. تحافظ الكتل ذات التدرجات اللونية الناعمة على شكلها جيدًا، أما الكتل التي تخلط عدة ألوان لا علاقة بينها فلا.

جرّبهمستكشف كتل BC1اختر كتلة 4×4 في نسيج المثال وشاهد بالضبط كيف تخزّنها BC1.
الكتلة 12، 4

الفصل 4

صيغ كثيرة ومقايضات مختلفة

تستغل الصيغ الأحدث بتاتها بذكاء أكبر من BC1: نقاط طرفية أكثر، وعدة خطوط لونية داخل الكتلة، وقناة ألفا أفضل، أو إمكانية اختيار حجم الكتلة.

تستخدم BC7 وASTC 4×4 ثماني بتات لكل عنصر نسيج وتبدوان قريبتين جدًا من الأصل. أما ASTC فتقايض الجودة بالحجم عبر حجم الكتلة: فالكتلة دائمًا 128 بت، لذا تكلّف كتلة 12×12 أقل من بت واحد لكل عنصر نسيج. وتسلك Basis Universal طريقًا آخر: توزّع ملفًا واحدًا مضغوطًا وتحوّله على الجهاز إلى صيغة تدعمها وحدة GPU تلك.

صيغ أنسجة GPU الشائعة
الصيغةبت لكل عنصر نسيجألفاالمنصات المعتادةالأنسب لـ
BC141 بتسطح المكتب، أجهزة الألعابلون معتم عندما تكون الذاكرة محدودة
BC38نعمسطح المكتب، أجهزة الألعابلون بألفا ناعمة في المحتوى القديم
BC44قنوات بياناتسطح المكتب، أجهزة الألعابقناة واحدة: أقنعة، خشونة، ارتفاع
BC58قنوات بياناتسطح المكتب، أجهزة الألعابخرائط النواظم (X وY)
BC6H8لاسطح المكتب، أجهزة الألعابألوان HDR مثل صناديق السماء وخرائط الإضاءة
BC78نعمسطح المكتب، أجهزة الألعابلون عالي الجودة، مع ألفا أو بدونها
ETC14لاكل أجهزة Android تقريبًالون معتم على الأجهزة القديمة جدًا
ETC24–8نعمAndroid وiOSبديل واسع الدعم للهواتف
ASTC0.89–8نعمأجهزة Android وiOS الحديثة، Apple Siliconجودة قابلة للضبط على الهواتف
PVRTC2–4نعمأجهزة iPhone وiPad القديمةأجهزة Apple القديمة فقط
Basis ETC1Sيعتمد على الصيغة الهدفنعمأي وحدة GPU عبر KTX2تنزيلات صغيرة تعمل على أي GPU
Basis UASTCيعتمد على الصيغة الهدفنعمأي وحدة GPU عبر KTX2جودة عالية تعمل على أي GPU
جرّبهشغّل المرمِّزات الحقيقيةاضغط عيّنة 512×512 بمرمِّزات WebAssembly نفسها التي تستخدمها أدواتنا، ثم قارن منطقة مكبّرة.
يعمل في متصفحك، ولا يُرفع أي شيء.
المنطقة المكبّرة
الأصل
RGBA8
1 MiB في ذاكرة GPU
BC1
BC1
4 بت لكل عنصر نسيج
128 KiB في ذاكرة GPU
BC7
BC7
8 بت لكل عنصر نسيج
256 KiB في ذاكرة GPU
ASTC 6×6
ASTC 6×6
3.56 بت لكل عنصر نسيج
116 KiB في ذاكرة GPU
ASTC 12×12
ASTC 12×12
0.89 بت لكل عنصر نسيج
29 KiB في ذاكرة GPU

اضغط «تشغيل المرمِّزات» لضغط العيّنة. في المرة الأولى يجري تنزيل المرمِّزات.

الفصل 5

اختيار الصيغة

سؤالان يضيّقان الخيارات بسرعة: ما وحدات GPU التي يجب أن تحمّل النسيج؟ وما نوع البيانات التي يحتويها؟

تتفاعل أنسجة الألوان وخرائط النواظم (normal maps) والأقنعة أحادية القناة مع الضغط بطرق مختلفة، كما تدعم منصات سطح المكتب والهاتف والويب عائلات صيغ مختلفة. اختر حالتك لتحصل على نقطة بداية معقولة، ثم تحقق من النتيجة على أنسجتك.

جرّبهمُختار الصيغةاختر أين سيعمل النسيج وماذا يحتوي.
أين سيعمل؟
ماذا يحتوي النسيج؟

ابدأ بـ

ASTC 6×6

فكّر أيضًا في: ASTC 4×4 · ETC2 RGB

تعمل ASTC على وحدات GPU الحديثة في Android وiOS. يعدّ 6×6 توازنًا جيدًا؛ استخدم 4×4 للأصول المهمة وETC2 للأجهزة القديمة.

افتح مرمِّز ASTC

الفصل 6

نصائح عملية

بضع عادات بسيطة تمنع معظم مشكلات ضغط الأنسجة.

  1. 01

    علّم الألوان بـ sRGB والبيانات بالخطي

    أنسجة الـ albedo والواجهة تكون بصيغة sRGB. أما خرائط النواظم والخشونة وغيرها من خرائط البيانات فيجب أن تبقى خطية، وإلا ستكون الإضاءة خاطئة.

  2. 02

    خصّص لخرائط النواظم صيغتها الخاصة

    استخدم صيغًا ثنائية القناة مثل BC5 أو EAC RG11 وأعد بناء Z في المظلِّل. فصيغ الألوان تهدر البتات وتضيف نتوءات ظاهرة.

  3. 03

    أنشئ الـ mipmaps

    تضيف نحو 33% من الذاكرة، لكنها تمنع وميض الأسطح البعيدة وتسرّع القراءة من النسيج.

  4. 04

    اجعل الأبعاد متوافقة مع الكتل

    تعمل معظم الصيغ بكتل 4×4، لذا فالأبعاد القابلة للقسمة على 4 لا تحتاج إلى حشو. كما تتطلب الصيغ القديمة مثل PVRTC أبعادًا مربعة من قوى العدد 2.

  5. 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، واختر صيغة، ثم قارن النتيجة.