2- متابعة للموضوع

https://arabia.io/go/6339

إن أكثر ما يصادفك في عمليات المعالجة هو إجراء عمليات حسابية متكررة على مجموعة معطيات كثيرة

فمثلا لو أنك فقط ستقوم بعكس ألوان الصورة

فلديك التالي :

استقبال الصورة من الكاميرا وقراءة قيم المركبات اللونية (الأحمر ، الأخضر ، الأزرق ) RGB لكل عنصورة في الصورة Pixel

وعلى اعتبار أن قيمة كل مركبة تأخذ قيمة ضمن المجال 0-255 أي أن بايت واحد يكفيها وبالتالي فللعنصورة تحتاج إلى 3 بايتات

ولو فرضنا أن الكاميرا تعمل بدقة 640×480 بيكسل فهذا يعني أننا بحاجة لمصفوفة بايتات 640×480×3 = 921600 أي حوالي مليون بايت ولو كان فورمات الصورة هو 32 بت فسيصبح الحجم 1,228,800 أي زاد بمقدار الثلث

وتخيل الآن العمليات المطلوبة :

حجز مصفوفة بهذا الحجم

نقل الداتا من الصورة إليها

إجراء حلقة / حلقات تقوم بالمرور على كل بايت من تلك المصفوفة وإجراء عملية العكس أي طرح القيمة الحالية من 255 ومن ثم إعادة تشكيل الصورة من المصفوفة ذات القيم المحدثة لإظهارها على نافذة جديدة كنتيجة تعكس العملية

وهذه عملية واحدة فكيف لو كان لدينا عدة عمليات وخوارزميات يجب تطبيقها على نفس المصفوفة !!

الآن المبرمج لا شك أنه سيستخدم التعليمات والتصريحات المعتادة مستغلا سهولة اللغة فمثلا ربما يصرح عن مصفوفة ببعدين تمثل عرض وارتفاع الصورة ليشكل مصفوفة مقابلة لتوزيع بيكسلات الصورة الأصلية كصفوف وأعمدة

كذلك الأمر عملية النسخ قد تتم بإجراء عداد يقوم بنقل القيم من المصفوفة الأصلية للصورة إلى المصفوفة الجديدة حتى لا تؤثر على الصورة الأصلية

عملية المرور قد تتم بحلقتين متداخلتين واحدة للأسطر والداخلية للأعمدة بحيث يتم مسح سطر سطر من البداية إلى نهاية السطر وننتقل للسطر التالي حتى ننتهي من كامل الأسطر على طول ارتفاع الصورة

الآن كل هذا جميل من الناحية النظرية ولكن من الناحية العملية سيء للغاية

في البرامج التي تعمل في الزمن الحقيقة أنت بحاجة لتوفير كل واحد ميكرو ثانية وليس ملي ثانية فحسب أي 0.000001 ثانية

لهذا فاختصار عملية جمع هي لصالحك ويتوجب عليك تجربة أي التعليمات أوفر فقد يكون استخدام تعليمة سويتش switch اسرع من تعليمة if

من هذا المنطلق سنحاول وضع كل معلومة أو نتيجة في هذا الإطار

يتبع ... 3