मैं विंडोज स्टोर के लिए एक ईबुक रीडर ऐप लिख रहा हूं। मैं स्क्रीन पर पुस्तक पृष्ठों को प्रस्तुत करने के लिए Direct2D + DXGI स्वैप श्रृंखला का उपयोग कर रहा हूं।कुशल डायरेक्ट 2 डी मल्टीथ्रेडिंग
मेरी पुस्तक सामग्री कभी-कभी काफी जटिल (ज्यामिति, बिटमैप्स, मास्क इत्यादि) होती है, इसलिए इसे प्रस्तुत करने में 100 एमएस तक लग सकते हैं। इसलिए मैं एक अलग थ्रेड में बिटमैप को ऑफ़-स्क्रीन प्रतिपादन करने की कोशिश कर रहा हूं, और फिर मुख्य थ्रेड में बस इस बिटमैप को दिखाएं।
हालांकि, मैं समझ नहीं पा रहा हूं कि इसे कुशलता से कैसे किया जाए।
अब तक मैं कोशिश की है दो दृष्टिकोण:
D2D1_FACTORY_TYPE_MULTI_THREADED ध्वज के साथ उपयोग के लिए एक एकल
ID2D1Factory
,ID2D1BitmapRenderTarget
बना सकते हैं और ऑफ स्क्रीन प्रतिपादन के लिए पृष्ठभूमि सूत्र में इसका इस्तेमाल करते हैं। (इसके अतिरिक्तID2D1Multithread::Enter/Leave
IDXGISwapChain::Present
संचालन के लिए आवश्यक है)। समस्या यह है किID2D1RenderTarget::EndDraw
पृष्ठभूमि थ्रेड में ऑपरेशन कभी-कभी 100ms तक ले जाता है, और आंतरिक डायरेक्ट 2 डी लॉकिंग के कारण इस अवधि के लिए मुख्य थ्रेड प्रतिपादन अवरुद्ध है।पृष्ठभूमि थ्रेड में एक अलग
ID2D1Factory
का उपयोग करें (जैसा कि http://www.sdknews.com/ios/using-direct2d-for-server-side-rendering में वर्णित है) और आंतरिक डायरेक्ट 2 डी सिंक्रनाइज़ेशन को बंद करें। इस मामले में दो धागे betwen कोई क्रॉस लॉकिंग नहीं है। दुर्भाग्यवश, इस मामले में मैं परिणामस्वरूप बिटमैप का उपयोग मुख्यID2D1Factory
में सीधे नहीं कर सकता, क्योंकि यह एक अलग कारखाने से संबंधित है। मुझे बिटमैप डेटा को सीपीयू मेमोरी में ले जाना है, फिर इसे मुख्यID2D1Factory
की जीपीयू मेमोरी में कॉपी करें। यह ऑपरेशन भी महत्वपूर्ण झंडे पेश करता है (मुझे विश्वास है कि यह बड़ी मेमोरी एक्सेस के कारण होगा, लेकिन मुझे यकीन नहीं है)।
क्या यह कुशलतापूर्वक करने का कोई तरीका है?
पीएस यहां सभी समय एसर स्विच 10 टैबलेट के लिए दिए गए हैं। नियमित कोर i7 पीसी पर दोनों दृष्टिकोण किसी भी दृश्य अंतराल के बिना काम करते हैं।