c++ - जीडीआई बनाम डायरेक्ट 2 डी




winapi direct2d (2)

डायरेक्ट 2 डी के पहले प्रयासों के साथ एक आम गलती है डेवलपर्स डी 2 डी संसाधनों को ठीक से कैश नहीं करते हैं और बदले संसाधनों को बनाने और नष्ट करने के लिए अक्सर यदि आपके सभी एलीपर्स समान आकार के होते हैं, तो आपको एक बार एक बार यह अंडाकार वस्तु बनाना और कैश करना चाहिए। यदि आपके पास 30 अलग-अलग आकार / आकार हैं, तो सभी 30 आकारों / आकारों के लिए केवल एक बार अंडाकार संस्करण बनाएं यह Direct2D को काफी गति देता है वही आयतों और अन्य सभी प्राइमेटिवों के लिए जाता है। दोहराया निर्माण / विनाश बनाम एक कैश्ड वस्तु को स्केलिंग भी कुछ परिदृश्यों के लिए एक समाधान है यदि आदिम के लिए बहुत अधिक भिन्नताएं मौजूद हैं, हालांकि अपने मूल आकार में एक संसाधन का उपयोग करना आदर्श है और स्मृति कार्ड आपके संसाधनों को संग्रहीत करने के लिए काफी मेमोरी हैं।

जीडीआई एलीप्सस बिल्कुल भयानक लग रहा है और डायरेक्ट 3 डी का उपयोग सीधे सीधा काफी जटिल है, खासकर एल्िप्स, बड़े बहुभुज, और उच्च स्तरीय प्राथमिकताएं के लिए। Direct2D के उचित उपयोग के साथ आपको अच्छी गति और उच्च गुणवत्ता वाले रेंडरिंग प्राप्त करने में सक्षम होना चाहिए।

मैं इस समय एक सिमुलेशन प्रोग्रामिंग कर रहा हूं, और मैं Direct2D का उपयोग करने के लिए GDI का इस्तेमाल करने से अपने आवेदन को बंद करना चाहता हूं। लेकिन मेरे डायरेक्ट 2 डी कोड मेरे जीडीआई कोड से बहुत धीमी है।

मैं स्क्रीन पर कई अण्डाकार प्रस्तुत करता हूं। मेरे जीडीआई आवेदन में मैं एक मेमोरी डिवाइस के संदर्भ में आती हूं और फिर विंडोज़ डिवाइस संदर्भ को आकर्षित करने के लिए बिटब्लैट का उपयोग करता हूं। Direct2D के साथ, मैं एक ID2D1HwndRenderTarget पर आकर्षित करता हूं

मेरी समस्या यह है, जब GDI का उपयोग करते हुए, मैं आसानी से 400+ अंडाकार आकर्षित कर सकता हूं और अब भी 400 एफपीएस है I जब मैं डायरेक्ट 2 डी के साथ एक ही संख्या में एलिप्स करता हूं, तो मेरा एफपीएस 30 एफपीएस तक चला जाता है।

मैंने पहले से ही एंटीअलियाज़िंग बंद कर दिया है लेकिन यह वास्तव में मदद नहीं करता है दिलचस्प बात यह है कि जीडीआई की तुलना में डायरेक्ट 2 डी में सिर्फ कुछ अंडाकार ड्राइंग तेज है। क्या Direct2D में प्रदर्शन में सुधार करने के लिए मैं कुछ भी कर सकता हूं, या क्या मुझे अपना आवेदन GDI का उपयोग करना चाहिए?

GDI का उपयोग कर मेरा ड्राइंग कोड यहां है:

VOID Begin() {
    SelectObject(this->MemDeviceContext, this->MemoryBitmap);
    this->BackgroundBrush = CreateSolidBrush(this->BackgroundColor);
    HBRUSH OldBrush = (HBRUSH)SelectObject(this->MemDeviceContext, this->BackgroundBrush);
    Rectangle(this->MemDeviceContext, -1, -1, 801, 601);
    SelectObject(this->MemDeviceContext, OldBrush);
    DeleteObject(this->BackgroundBrush);
    SetViewportOrgEx(this->MemDeviceContext, 400, 300, &this->OldOrigin);
}
VOID End() {
    SetViewportOrgEx(this->MemDeviceContext, this->OldOrigin.x, this->OldOrigin.y, 0);
    BitBlt(this->DeviceContext, 0, 0, 800, 600, this->MemDeviceContext, 0, 0, SRCCOPY);
}

मेरी शुरुआत और समाप्ति समारोह के बीच, मैं अपने दीर्घवृत्तों को मानक जीडीआई मार्ग से आकर्षित करता हूं।

Direct2D का उपयोग करते हुए मेरा आरंभ और अंत कार्य यहाँ हैं:

VOID BeginDrawing() {
    this->RenderTarget->BeginDraw();
    RenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
    RenderTarget->SetTransform(this->ScalingMatrix * this->TranslateMatrix);
}
VOID EndDrawing() {
    this->RenderTarget->EndDraw();
}

और यहां बताया गया है कि मैं अपने डायरेक्ट 2 डी इंटरफेस कैसे स्थापित करता हूं। यह सब कक्षा में लिपटे है; यही कारण है कि मैं पूरा कोड पोस्ट नहीं कर सकता:

    if(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &Direct2DFactory) != S_OK)
        throw std::runtime_error("RENDERWINDOW::InitializeDirect2D: Failed to create a factory interface.");
    RECT WindowRect;
    memset(&WindowRect, 0, sizeof(RECT));
    GetClientRect(this->WndHandle, &WindowRect);
    D2D1_SIZE_U WindowSize = D2D1::SizeU(WindowRect.right, WindowRect.bottom);
    Direct2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_HARDWARE), 
    D2D1::HwndRenderTargetProperties(this->WndHandle, WindowSize, D2D1_PRESENT_OPTIONS_IMMEDIATELY), &RenderTarget);

पहले ही, आपका बहुत धन्यवाद।


कुछ समय पहले मैंने कम प्रदर्शन के कारण जीडीआई से डायरेक्ट 2 डी के लिए प्रक्षेपण कोड माइग्रेट करने से इनकार कर दिया है जैसा कि मैं Google से समझता हूं, Direct2D प्रदर्शन ड्राइवर और हार्डवेयर अनुकूलन पर निर्भर करता है और आपको अलग-अलग हार्डवेयर पर उसी गति की अपेक्षा नहीं करनी चाहिए। GDI बहुत पुराना है और लगभग हर जगह समान रूप से काम करता है।

यह कहना जरूरी है कि मैं इसे सरल ज्यामिति आर्किटेक्ट्स के लिए इस्तेमाल करने की कोशिश कर रहा हूं, जबकि डायरेक्ट 2 डी बहुत ज्यादा मजबूत पुस्तकालय लगता है और शायद जटिल परिदृश्यों पर प्रदर्शन को बढ़ावा मिले, लेकिन यह मेरा मामला नहीं है।

अगर आपको बेहतर गुणवत्ता के साथ जीडीआई प्रदर्शन की आवश्यकता है - ओपनजीएल या डायरेक्ट 3 डी का सीधा उपयोग करने का प्रयास करें।

यह एक संबंधित प्रश्न है: क्या TDirect2DCanvas धीमा है या क्या मैं कुछ गलत कर रहा हूं?