C# غير آمنة ومؤشرات للعرض ثنائي الأبعاد، جيدة أم سيئة؟

StackOverflow https://stackoverflow.com/questions/55963

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أكتب عنصر تحكم C# يلتف حول DirectX 9 ويوفر واجهة مبسطة لإجراء رسم على مستوى البكسل ثنائي الأبعاد.يتطلب .NET أن أقوم بتغليف هذا الرمز في كتلة تعليمات برمجية غير آمنة وتجميعها باستخدام خيار السماح بالكود غير الآمن.

أقوم بقفل السطح بالكامل والذي يقوم بعد ذلك بإرجاع المؤشر إلى المنطقة المقفلة من الذاكرة.يمكنني بعد ذلك كتابة بيانات البكسل مباشرة باستخدام حساب المؤشر "البسيط".لقد قمت باختبار الأداء ووجدت تحسنًا كبيرًا في السرعة مقارنةً بالطرق "الآمنة" الأخرى التي أعرفها.

هل هذه هي أسرع طريقة لمعالجة وحدات البكسل الفردية في تطبيق C# .NET؟هل هناك طريقة أفضل وأكثر أمانا؟إذا كان هناك نهج سريع بنفس القدر ولا يتطلب التلاعب بالمؤشر، فسيكون من الأفضل استخدام ذلك.

(أعلم أن هذا هو عام 2008 ويجب علينا جميعًا استخدام DirectX 3D، برنامج OpenGL, وما إلى ذلك، ومع ذلك، سيتم استخدام عنصر التحكم هذا حصريًا لعرض ثنائي الأبعاد للبكسل ولا يتطلب ببساطة عرضًا ثلاثي الأبعاد.)

هل كانت مفيدة؟

المحلول

يعد استخدام المؤشرات غير الآمنة أسرع طريقة للتعامل المباشر مع الذاكرة في لغة C# (بالتأكيد أسرع من استخدام وظائف غلاف Marshal).

فقط من باب الفضول، ما نوع عمليات الرسم ثنائية الأبعاد التي تحاول تنفيذها؟

أتساءل لأن قفل سطح DirectX لإجراء عمليات معالجة على مستوى البكسل سيبطل معظم فوائد تسريع الأجهزة التي تأمل في الحصول عليها من استخدام DirectX.وأيضًا، سيفشل جهاز DirectX في التهيئة عند استخدامه عبر الخدمات الطرفية (سطح المكتب البعيد)، وبالتالي لن يكون عنصر التحكم قابلاً للاستخدام في هذا السيناريو (قد لا يهمك هذا).

سيكون برنامج DirectX بمثابة فوز كبير عند رسم مثلثات كبيرة وتحويل الصور (نسيج معين على رباعي)، لكنه لن يؤدي هذا الأداء الرائع مع معالجة البكسل الواحد.

البقاء في أرض .NET، أحد البدائل هو الاحتفاظ بكائن Bitmap ليكون بمثابة سطحك، باستخدام LockBits والوصول مباشرة إلى وحدات البكسل من خلال المؤشر غير الآمن في كائن BitmapData الذي تم إرجاعه.

نصائح أخرى

نعم، ربما تكون هذه هي الطريقة الأسرع.

قبل بضع سنوات، كان علي مقارنة صورتين بحجم 1024 × 1024 على مستوى البكسل؛استغرقت طرق get-pixel دقيقتين، واستغرق الفحص غير الآمن 0.01 ثانية.

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

أيضا، تحقق من تعادل المباشر.إنه مكون الرسومات ثنائي الأبعاد في DirectX.إنه سريع حقًا.

لقد تم تكليفي مؤخرًا بإنشاء عنصر تحكم بسيط في الرسم البياني لأحد تطبيقات العميل الرقيق لدينا (C#).كانت الصور التي كنت أقوم بتحليلها حوالي 1200 × 1200 وكان علي أن أتبع نفس المسار.يمكنني أن أجعل الشيء يرسم نفسه مرة واحدة دون أي مشكلة، لكن التحكم كان بحاجة إلى تغيير حجمه.حاولت تجنب ذلك، لكن كان علي أن أصل إلى الذاكرة الخام نفسها.

أنا لا أقول أنه من المستحيل استخدام فئات .NET القياسية، لكنني لم أتمكن من تشغيلها أيضًا في النهاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top