Compose UI Canvas API Community Challenge

سكربل داش

تطبيق رسم تفاعلي متقدم عبر لوحة رقمية يستكشف الأداء الفائق للرسم الأصلي باستخدام Jetpack Compose.

ScribbleDash Mockup

نظرة عامة

يُظهر تطبيق ScribbleDash المهارات التقنية في التعامل مع واجهات برمجة تطبيقات الرسم (APIs) الخاصة بنظام أندرويد والمدمجة أصلياً داخل قيود Jetpack Compose. من خلال أطوار اللعب التفاعلية، يتحدى التطبيق المستخدمين بلوحات رسم متفاوتة الصعوبة، مطبقاً استخراج إيماءات الرسم في الوقت الفعلي، ومصفوفات الحالة للتراجع والإعادة (Undo/Redo)، وتقديم مسارات شعاعية (Vector) في قمة السلاسة.

التحدي

إنشاء تطبيق رسم تفاعلي عبر Compose يعني إعادة حساب مسارات (Bezier) باستمرار وسط أحداث التقاط مؤشرات عالية التردد. بدون استراتيجيات معالجة رسوميات متقدمة، ستتعثر حلقة الرسم (Draw Loop) بوضوح.

وتزداد التعقيدات عند الحاجة لتتبع مسارات الرسم في الذاكرة لتوفير ميزة التراجع والإعادة (Undo/Redo) لضربات الفرشاة المخصصة، دون التسبب في أخطاء استنزاف الذاكرة (Out-Of-Memory) خلال فترات الاستخدام الطويلة، كل ذلك أثناء دمج هذا الهيكل بأسلوب نظيف عبر حزم برمجية مدفوعة بالمجال (DDD).

القرارات المعمارية والتقنية

لتوفير أداء رسم فائق، استخدمت تخطيطات `Canvas` الأصلية المتوفرة في Jetpack Compose والمغلفة بالكامل داخل بنية محسّنة متعددة الحزم (Multi-package) ومقسمة لطبقات.

التنفيذ الأمثل للمسارات الرسومية

  • اجتياز المسارات (Path Traversal): بدلاً من إعادة بناء كامل اللوحة القماشية في كل إطار، يتم تخزين ضربات الفرشاة الفردية مؤقتاً كمصفوفات `Path`، مما يمنع محفزات إعادة التكوين (Recomposition) العميقة إلا عند الضرورة القصوى. مصفوفات الحالة تحتفظ بآخر 5 متجهات لتوفير دورات تراجع/إعادة دقيقة وموثوقة.
  • الهيكلة شبه المعيارية (Pseudo-Modular): على الرغم من كون التطبيق أحادي الوحدة هندسياً، إلا أن الحزم (`features/gamemodes/`، `features/draw/`) معزولة أفقياً بالكامل، مما يسمح بتبديل أنماط اللعب أو التوسع فيها دون تسريب منطق الأعمال (Business Logic) لنطاقات غير ذات صلة.
  • تتبع الاعتماديات (Dependency Tracking): يتولى إطار الـ DI (حقن التبعية) حقن حالات أطوار اللعب المتخصصة بشكل منفصل كلياً عن مكونات واجهة مستخدم Compose الأساسية.

الأثر والنتائج

  • تحقيق معدل رسم ثابت بـ 60 إطاراً في الثانية (60FPS) بسلاسة تحت حلقات الإدخال الحسابية المكثفة للمؤشر عن طريق الحد من إعادة تكوين الشجرة (Tree Recompositions) بشكل واسع.
  • بناء محرك قوي للتراجع والإعادة، يحافظ على استقراره دون التسبب بتخصيصات ذاكرة ضخمة (Heap Allocations) أو تجاوز سعة المكدس (Stack Overflows) في جلسات الاستخدام الطويلة.
  • تأمين ملاحة قابلة للتطوير عبر مسارات التطبيق مدعومة بأداة Koin لحقن تجارب واجهة مستخدم مستقلة ديناميكياً بناءً على الحزم المعزولة.

التقنيات المستخدمة

Language Kotlin
UI Framework Jetpack Compose
DI Framework Koin
Design System Material Design 3
Testing & Debug JUnit & Timber