لماذا لا تستخدم Direct2D و DirectWrite كائنات COM التقليدية؟
-
26-09-2019 - |
سؤال
أنا أتعامل مع محرك لعبة ثنائية الأبعاد صغيرة في C# وقررت استخدام Direct2D و DirectWrite لتقديمها. أعلم أن هناك حزمة رمز Windows API و Slimdx ، لكنني أود حقًا أن أحفر وكتابة واجهة من نقطة الصفر. أحاول القيام بذلك دون إدارة C ++ ، ولكن لا يبدو أن Direct2D و DirectWrite يستخدمان كائنات COM التقليدية. يحددون واجهات مستمدة من IUnknown
, ، ولكن يبدو أنه لا توجد طريقة لاستخدامها فعليًا من C# مع com interop. هناك IIDs في d2d1.h
, ، ولكن لا clsid.
بالطبع ، أنا جديد حقًا على com interop ، لذلك ربما أفتقد شيئًا ما. هل يمكن لأحد أن يلقي بعض الضوء على هذا الموقف؟
المحلول
فهمتك. لا يمكنك إنشاء الكائنات مباشرة ، ولكن d2d1.dll
يحتوي على تصدير يسمى D2D1CreateFactory
هذا يعيد ID2DFactory
واجهه المستخدم. باستخدام هذا ، يمكنك تنفيذ WRAPPER DIRECT2D دون إدارة C ++.
public static class Direct2D1Util {
public const string IID_ID2D1Factory =
"06152247-6f50-465a-9245-118bfd3b6007";
[DllImport("d2d1.dll", PreserveSig = false)]
[return: MarshalAs(UnmanagedType.Interface)]
private static extern object D2D1CreateFactory(D2D1_FACTORY_TYPE factoryType,
[MarshalAs(UnmanagedType.LPStruct)] Guid riid,
D2D1_FACTORY_OPTIONS pFactoryOptions);
public static ID2D1Factory CreateFactory() {
D2D1_FACTORY_OPTIONS opts = new D2D1_FACTORY_OPTIONS();
object factory = D2D1CreateFactory(
D2D1_FACTORY_TYPE.D2D1_FACTORY_TYPE_SINGLE_THREADED,
new Guid(IID_ID2D1Factory), opts);
return (ID2D1Factory)factory;
}
}
لن أدرج جميع الأنواع ، لأنها محددة جميعًا d2d1.h
, ، ولكن إليك كيفية استخدام الكود للحصول على مصنع:
ID2DFactory factory = Direct2D1Util.CreateFactory();
تأكد الخاص بك ID2DFactory
الواجهة لديها مناسبة Guid
و InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
صفات.
نصائح أخرى
تمكنت "Windows® API Code Pack لـ Microsoft® .NET Framework" من المكتبات التي تتيح الوصول إلى Direct2D و DirectWrite.
http://code.msdn.microsoft.com/windowsapicodepack
تحديث
بينما تتم كتابة أغلفة DirectX في C ++ المدارة ، فإنها تنتج مكتبات مُدارة. بمظهر الأشياء يمكن استخدامها من C#. يبدو أن هناك الكثير من الأمثلة المدرجة في التنزيل الذي يقوم بذلك بالضبط ، أي استخدام مكتبات Wrapper Direct المدارة من C#.
سيكون استخدام ميزات Windows 7 في تطبيق C# الخاص بي أمرًا رائعًا للغاية ، لذلك أقوم حاليًا بتثبيت Window7 SDK (حتى أتمكن من إنشاء حل C ++ DirectX المدار) وسأعطي كل شيء باش.
أنا أتابع التعليمات في:
تحديث 2
باتباع الإرشادات الواردة في الرابط أعلاه ، حصلت على تجميع مكتبات C ++ المدارة ويمكنك بالفعل استخدامها من C# بسهولة بالغة.
الآن لست متأكدًا مما إذا كنت أفهم بشكل صحيح ، لكن هل تبحث فقط عن طريقة لاستخدام Direct2D و DirectWrite من C#، أو هل يجب أن تكون com أو p invoke.
أشك بشدة في أنه سيكون هناك غلاف كوم ، لأنها تقنية غير متطابقة. لم يتم تصميم COM جيدًا لنوع من أنماط استدعاء طريقة التردد العالي التي تحصل عليها في برمجة الرسومات - إنها طريقة بطيئة للغاية.
إذا كنت ترغب حقًا في القيام بـ p invoke ، يمكنك دائمًا النظر إلى ملفات رأس DirectX (في Windows 7 SDK) واستخدم أداة لإنشاء جميع كبار المكالمات ، على سبيل المثال ، على سبيل المثال
من المحتمل أن يكون هذا بيتا رئيسيًا لتطوير غلاف بهذه الطريقة.
يوجد مشروع على CodePlex يوفر مغلفة مُدارة لـ Direct2D. ليس لدي أي فكرة عما إذا كان ذلك جيدًا ، ولكن على الأرجح ، سيساعدك الرمز المصدري على البدء.