Skia: الجوهر والهندسة والدور في محرك Flutter الرسومي

المؤلف: IT Sectr نُشر: 2026-06-04 وقت القراءة: 10 دق

Skia هي مكتبة رسومية ثنائية الأبعاد عالية الأداء مفتوحة المصدر، مكتوبة بلغة C++، وتعمل كمحرك العرض الأساسي لـ Flutter. وهي مسؤولة عن تحويل عناصر واجهات المستخدم عالية المستوى إلى بكسلات على الشاشة، مع دعم العرض البرمجي عبر CPU والتسريع العتادي عبر OpenGL وVulkan وMetal. وفقاً لوثائق Skia (2025)، فإن Skia تعالج أكثر من 2 مليار إطار معروض يومياً على أجهزة Android وChrome وFlutter.

الخلاصة

  • Skia — مكتبة رسومية ثنائية الأبعاد مفتوحة المصدر بلغة C++، العارض الرئيسي لـ Flutter
  • الهندسة تشمل العرض البرمجي CPU والتسريع العتادي GPU
  • الخلفيات تدعم OpenGL وVulkan وMetal وDirect3D لكل منصة
  • Flutter يستخدم Skia لرسم جميع الأدوات والنصوص والرسوم المتحركة
  • الأداء مضمون من خلال العرض المجمع وخط أنابيب محسّن

ما هي Skia؟

Skia هي مكتبة رسومية ثنائية الأبعاد متعددة المنصات طورتها Google ومتاحة تحت ترخيص BSD. توفر واجهة برمجة تطبيقات موحدة لرسم الأشكال الهندسية والنصوص والصور والظلال، مع تجريد الخلفية الرسومية الأساسية. Skia مكتوبة بلغة C++ ومحسّنة للعمل على مجموعة واسعة من الأجهزة — من الهواتف المحمولة إلى الخوادم.

بدأ تاريخ Skia في عام 2005 كمكتبة مملوكة لشركة Skia Inc. في عام 2007 استحوذت عليها Google وفتحت مصدرها وبدأت في استخدامها في منتجاتها. اليوم، Skia هي محرك الرسوم الرئيسي لـ Google Chrome (بما في ذلك Chrome OS) وAndroid (بدءاً من الإصدار 4.0) وبالطبع Flutter. تتم صيانة المكتبة من قبل فريق Google ويتم تحسينها باستمرار: إضافة خلفيات جديدة وتحسينات أداء ودعم لواجهات برمجة تطبيقات رسومية حديثة.

الميزة الرئيسية لـ Skia هي أنها ليست مجرد مجموعة وظائف لرسم البدائيات. إنها خط أنابيب رسومي كامل يتضمن تنقيط المنحنيات (المسارات) ومكافحة التعرج وتراكب الأقنعة ومعالجة الشفافية وتصحيح الألوان. تدعم Skia تنسيقات الصور PNG وJPEG وWebP وGIF، ويمكنها عرض النصوص عبر محرك HarfBuzz لتشكيل الحروف الرسومية.

Skia مقابل مكتبات الرسوم الأخرى

على عكس Cairo (المستخدمة في GTK) أو Quartz 2D (المستخدمة في macOS)، صُممت Skia أصلاً للعمل على منصات متعددة بواجهات برمجة رسومية مختلفة. يمنحها هذا ميزة في الأطر متعددة المنصات مثل Flutter. Cairo موجه نحو العرض البرمجي، بينما دعمت Skia تسريع GPU منذ البداية، وهو أمر بالغ الأهمية لرسوم متحركة للواجهة.

هندسة Skia

تم بناء هندسة Skia كخط أنابيب متعدد الطبقات، حيث تكون كل طبقة مسؤولة عن مرحلة محددة لتحويل أوامر الرسوم إلى بكسلات. يسمح هذا الهيكل بإعادة استخدام الطبقات العليا بغض النظر عن واجهة برمجة الرسوم الأساسية.

الطبقة العليا — Canvas API — توفر للمطور تجريداً للرسم. تستقبل الطرق drawRect وdrawCircle وdrawPath وdrawText معايير هندسية وأنماطاً (لون، شفافية، تحويلات). يقوم Canvas بتحويل هذه الأوامر إلى سلسلة من العمليات التي تُمرر إلى Skia Pipeline — رسم بياني داخلي للأوامر يُحسَّن قبل التنفيذ.

الطبقة الوسطى — Surface وDevice — تدير المخزن المؤقت الهدف الذي يحدث فيه العرض. يتم إنشاء Surface بالحجم وفضاء الألوان ونوع الخلفية المحددين. ينفذ Device خلفية عرض محددة: منقيط CPU (Raster) أو OpenGL (GL) أو Vulkan (Vk) أو Metal (Mt). يحتوي Device على تطبيقات محسّنة لكل عملية رسم لخلفية محددة.

الطبقة السفلية — Ganesha (خلفية GPU) — تنفذ العرض المسرّع عتادياً. تستخدم Ganesha GPU لتنقيط المسارات وتعبئة التدرجات وتراكب التأثيرات. تجمع الأوامر في دفعات وتقلل من تبديل حالة GPU. كل واجهة برمجة رسومية لها تطبيق Ganesha الخاص بها: Skia GL لـ OpenGL وSkia Vulkan لـ Vulkan وSkia Metal لـ Metal.

التمثيل الوسيط — SkSL

تستخدم Skia لغة التظليل الخاصة بها SkSL (Skia Shading Language) لوصف التأثيرات. يتم تجميع كود SkSL إلى SPIR-V (تمثيل وسيط)، ثم يُترجم إلى تنسيق تظليل خاص بالخلفية (GLSL, HLSL, MSL). يوفر هذا طريقة موحدة لوصف التأثيرات الرسومية بغض النظر عن المنصة.

كيف تعمل Skia في Flutter

يستخدم Flutter Skia كمحرك العرض الأساسي على جميع المنصات: Android وiOS والويب وWindows وmacOS وLinux. عندما يعرض تطبيق Flutter إطاراً، تُحول الأدوات إلى شجرة RenderObject، والتي تُمرر بعد ذلك إلى طبقة Engine (بلغة C++)، ويستخدم Engine Skia للعرض النهائي.

تتضمن عملية عرض الإطار عدة مراحل. أولاً، ينشئ Flutter Engine قائمة عمليات (Display List) — سلسلة من استدعاءات Canvas API تصف ما وكيفية الرسم. ثم تُمرر هذه القائمة إلى Skia، التي تقسم العمليات إلى أقسام (مناطق شاشة)، وتفرزها حسب العمق وتمررها إلى خلفية العرض المناسبة. يتم تفعيل تسريع GPU تلقائياً إذا اكتشفت Skia واجهة برمجة رسومية متاحة.

واحدة من المزايا الرئيسية لـ Skia في Flutter هي Flutter Impeller Preview — إمكانية معاينة التظليلات مسبقاً. تجمّع Skia التظليلات في لحظة الاستخدام الأول، مما قد يسبب تأخيرات (shader jank). لحل هذه المشكلة، ينتقل Flutter إلى Impeller — محرك عرض جديد، لكن Skia تظل الخيار الرئيسي للإصدارات المستقرة من Flutter.

Layer Tree وPaint

يستخدم Flutter مفهوم Layer Tree — شجرة من الطبقات، تمثل كل منها جزءاً من واجهة المستخدم. تتلقى Skia أوامر الرسم لكل طبقة وتحدد ما إذا كان يمكن دمج طبقات متعددة في مسار عرض واحد. يعد تجميع الطبقات مهمة معقدة، حيث يجب لكل بكسل مراعاة الشفافية وأوضاع المزج (blend modes)، التي تنفذها Skia عبر تظليلات GPU.

عرض النصوص عبر Skia

تعرض Skia النصوص من خلال التكامل مع مكتبتي HarfBuzz (التشكيل) وICU (يونيكود). في Flutter، ينشئ كل عنصر واجهة نصي كائن Paragraph الذي يحول النص إلى سلسلة من أوامر Skia لرسم الحروف الرسومية. تدعم Skia التنعيم دون البكسل (subpixel anti-aliasing) وتلميح الخطوط والعمل مع الرموز التعبيرية عبر مكتبة SkUnicode.

أداء Skia

أداء Skia هو نتيجة سنوات من التحسين والجمع بين عدة تقنيات: تجميع الأوامر، وتخزين القوام مؤقتاً، وتقليل تبديل سياق GPU. هذا أمر بالغ الأهمية لـ Flutter، حيث يجب عرض كل إطار في 16 مللي ثانية (60 إطاراً في الثانية) أو 8 مللي ثانية (120 إطاراً في الثانية).

التقنيةالوصفالتحسين
التجميعتجميع العمليات المتشابهة في استدعاء رسم واحدحتى 3x
ذاكرة تخزين القوامإعادة استخدام القوام المحملة بالفعل في GPUحتى 2x
Atlasدمج القوام الصغير في أطلس قوام كبيرحتى 1.5x
العرض المؤجلتنفيذ الأوامر مع إعادة الترتيبحتى 2x
التجميع المسبق للتظليلاتتجميع التظليلات مسبقاً لـ Spark/Dartحتى 4x

وفقاً لمعايير فريق Flutter، فإن استخدام Skia مع تسريع GPU على الأجهزة متوسطة الفئة (Qualcomm Snapdragon 700 series) يوفر 60 إطاراً في الثانية مستقرة عند عرض واجهات معقدة تحتوي على أكثر من 30 أداة على الشاشة. مع العرض البرمجي (CPU)، ينخفض الأداء بنسبة 40–60%، لكنه يظل مقبولاً للشاشات البسيطة.

Shader Jank — المشكلة الرئيسية لـ Skia

المشكلة الرئيسية في أداء Skia ضمن Flutter هي shader jank (تأخير التظليلات). عندما يظهر على الشاشة عنصر مرئي جديد بمزيج غير معروف سابقاً من التأثيرات، تقوم Skia بتجميع تظليل جديد أثناء التشغيل. قد يستغرق التجميع 50–200 مللي ثانية، يتخللها تخطي الإطارات. هذا ملحوظ بشكل خاص عند التمرير في قوائم طويلة ذات زخارف مخصصة. تحل Google هذه المشكلة في Impeller، محرك العرض الجديد الذي يجمّع التظليلات مسبقاً.

Skia عبر المنصات

تدعم Skia مجموعة واسعة من المنصات، تستخدم كل منها خلفية العرض الخاصة بها. يتم تحديد اختيار الخلفية أثناء بناء Flutter Engine بناءً على المنصة المستهدفة وواجهات برمجة الرسوم المتاحة.

Android

على Android، تعمل Skia عبر OpenGL ES (على جميع الأجهزة) وVulkan (على أجهزة Android 7.0+ التي تدعم Vulkan). يتم اختيار الخلفية تلقائياً: يُفضل Vulkan لأنه يوفر زمن انتقال أقل للسائق. يستخدم Android أيضاً Skia لعرض واجهة النظام عبر HWUI (Hardware Accelerated UI)، مما يجعل Skia جزءاً من نظام التشغيل، وليس فقط Flutter.

iOS

على iOS، تستخدم Skia Metal — واجهة برمجة الرسوم الخاصة بـ Apple. يوفر Metal وصولاً منخفض المستوى إلى GPU بأقل تكلفة إضافية. قبل ظهور Metal (2014)، استخدمت Skia على iOS OpenGL ES، لكن في الإصدارات الحالية من Flutter، Metal هي خلفية GPU الوحيدة لنظام iOS، مما يوفر تحسناً في الأداء يصل إلى 30% مقارنة بـ OpenGL.

سطح المكتب (Windows, macOS, Linux)

على سطح المكتب، تستخدم Skia OpenGL (macOS, Linux) وDirect3D 12 (Windows). تمت إضافة دعم Direct3D 12 في Flutter 3.13 لنظام Windows ويتيح تحسناً كبيراً في الأداء مقارنة بـ OpenGL على Windows. تدعم Skia أيضاً العرض البرمجي عبر ANGLE (OpenGL فوق Direct3D) على Windows للتوافق مع الإصدارات السابقة من برامج تشغيل الرسوم القديمة.

الويب

في Flutter for Web، تُجمّع Skia إلى WebAssembly (عبر Emscripten) وتَعرض عبر WebGL. في هذا الوضع، تعمل Skia بالكامل في المتصفح دون استخدام كود أصلي. أداء إصدار WebGL من Skia أقل من الخلفيات الأصلية، لكن لمعظم تطبيقات الويب، يتم تحقيق 60 إطاراً في الثانية على المتصفحات الحديثة مع تسريع WebGL العتادي.

الأسئلة الشائعة

ما هو shader jank في Skia؟

Shader jank هو تأخير في العرض بسبب تجميع التظليلات أثناء التشغيل. عندما تواجه Skia مزيجاً جديداً من التأثيرات البصرية، تقوم بتجميع تظليل، مما قد يستغرق 50–200 مللي ثانية، تتخللها إطارات مفقودة. يتم حل هذه المشكلة في Impeller من خلال التجميع المسبق للتظليلات.

هل يمكن استخدام Skia بدون Flutter؟

نعم، يمكن استخدام Skia كمكتبة رسومية مستقلة. تُستخدم في Google Chrome وAndroid وMozilla Firefox (عبر طبقة Skia) وفي المشاريع التي تتطلب رسوماً ثنائية الأبعاد عالية الأداء. تتوفر واجهة برمجة تطبيقات Skia بلغة C++ وPython وعبر روابط بلغات أخرى.

ما إصدار Skia المستخدم في Flutter؟

يستخدم Flutter شوكة من Skia (عادة أحدث commit مستقر من مستودع Google الرئيسي). يتم تحديث الإصدار مع كل إصدار من Flutter Engine. يمكن العثور على commit الحالي في ملف DEPS في مستودع flutter/engine على GitHub.

ما الفرق بين Skia وImpeller؟

Skia تجمّع التظليلات أثناء التشغيل، مما يسبب shader jank. Impeller يجمّع التظليلات مسبقاً (خارج الخط)، ويستخدم SPIR-V ويعمل مباشرة عبر Vulkan/Metal/Direct3D 12. Impeller لا يعاني من تأخير التظليلات ويوفر أداءً أكثر قابلية للتنبؤ.

هل تدعم Skia الرسوم المتحركة؟

Skia بحد ذاتها ليست محرك رسوم متحركة — إنها مسؤولة عن عرض الإطارات الفردية. يتم تنفيذ الرسوم المتحركة في Flutter على مستوى الإطار (AnimationController, Tween)، بينما تضمن Skia عرضاً سريعاً لكل إطار باستخدام Canvas API والتسريع العتادي.

الملخص

  • Skia — مكتبة رسومية ثنائية الأبعاد عالية الأداء من Google، العارض الرئيسي لـ Flutter
  • الهندسة تشمل Canvas API وSurface/Device وخلفيات GPU Ganesha
  • دعم الخلفيات: OpenGL وVulkan وMetal وDirect3D 12 لكل منصة
  • Flutter يستخدم Skia لتحويل الأدوات إلى بكسلات عبر طبقة Engine
  • الأداء من خلال التجميع والتخزين المؤقت للقوام والعرض المؤجل
  • Shader jank — العيب الرئيسي لـ Skia، يُحل في Impeller
  • استخدم Skia للرسوم ثنائية الأبعاد متعددة المنصات واختر Impeller للمشاريع الجديدة في Flutter

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا