2017-05-10 10 views
8

के बाद QHD/4K स्क्रीन पर ExtTextOutW x50 प्रदर्शन ड्रॉप कुछ अजीब कारणों से, एक उच्च रिज़ॉल्यूशन बिटमैप (2560x1440/3840x2160) पर क्लिप किए गए टेक्स्ट को आकर्षित करने के लिए WinAPI के ExtTextOutW फ़ंक्शन को कॉल करने के परिणामस्वरूप विंडोज अपडेट करने के बाद ~ x50 प्रदर्शन हिट 10 रचनाकार संस्करण अद्यतन के साथ। मेरे उपयोगकर्ता के परीक्षण और डीबग लॉग से, ऐसा लगता है कि बिटमैप या संभवतः फ़ॉन्ट आकार में थोड़ा अंतर प्रदर्शन हिट को ट्रिगर कर सकता है।विंडोज क्रिएटर संस्करण अपडेट

यहाँ एक डिबग प्रदर्शन हिट दिखा लॉग है:

10/05/2017 15:51:50 [ 63227,186] : Calculate Rect 
10/05/2017 15:51:50 [ 63227,190] : Rect : Left=263, Top=504, Right=3561, Bottom=2155 
10/05/2017 15:51:50 [ 63227,193] : Set Shadow Color 
10/05/2017 15:51:50 [ 63227,198] : Render Text Shadow 
10/05/2017 15:51:50 [ 63236,650] : Set Text Color 
10/05/2017 15:51:50 [ 63236,661] : Render Text "Kingdom come Deliverance" 
10/05/2017 15:51:50 [ 63246,062] : Rendering complete 

आप लॉग से देख सकते हैं, ExtTextgOutW के लिए एक एकल कॉल लेता है ~ 9.5ms जबकि यह एक ही कॉल 1ms रचनाकारों से पहले अंतर्गत अच्छी तरह से संभाल लिया है अद्यतन करें।

{$IFDEF TEXTRENDERTRACE}DebugMsgFT('c:\log\.TextRender.txt','Calculate Rect');{$ENDIF} 
    cRect := Rect(X,Y,Width+X,MainForm.Monitor.Height-(1+(MainForm.Monitor.Height div 540))); 
    {$IFDEF TEXTRENDERTRACE}DebugMsgFT('c:\log\.TextRender.txt','Rect : Left='+IntToStr(cRect.Left)+', Top='+IntToStr(cRect.Top)+', Right='+IntToStr(cRect.Right)+', Bottom='+IntToStr(cRect.Bottom));{$ENDIF} 
    {$IFDEF TEXTRENDERTRACE}DebugMsgFT('c:\log\.TextRender.txt','Set Shadow Color');{$ENDIF} 
    srcColor := txtCanvas.Font.Color; 
    txtCanvas.Font.Color := OutLineColor; 
    {$IFDEF TEXTRENDERTRACE}DebugMsgFT('c:\log\.TextRender.txt','Render Text Shadow');{$ENDIF} 
    Windows.ExtTextOutW(txtCanvas.Handle,X ,Y+(MainForm.Monitor.Height div 540),ETO_CLIPPED,@cRect,@S[1],I,nil); 
    {$IFDEF TEXTRENDERTRACE}DebugMsgFT('c:\log\.TextRender.txt','Set Text Color');{$ENDIF} 
    txtCanvas.Font.Color := srcColor; 
    {$IFDEF TEXTRENDERTRACE}DebugMsgFT('c:\log\.TextRender.txt','Render Text "'+S+'"');{$ENDIF} 
    Windows.ExtTextOutW(txtCanvas.Handle,X ,Y ,ETO_CLIPPED,@cRect,@S[1],I,nil); 
    {$IFDEF TEXTRENDERTRACE}DebugMsgFT('c:\log\.TextRender.txt','Rendering complete'+CRLF);{$ENDIF} 

इस कोड Y- में मामूली अंतर के साथ दो बार एक ही पाठ प्रतिपादन द्वारा एक बहुत ही सरल ड्रॉप-छाया प्रभाव करता है:

यहाँ वास्तविक कोड है जो आप ऊपर डिबग आउटपुट के लिए तुलना कर सकते हैं है ऑफसेट और रंग। http://forum.inmatrix.com/index.php?showtopic=14995&page=2

हम डीपीआई के साथ परीक्षण किया 100 करने के लिए सेट:

यहाँ मेरी मंच उपयोगकर्ताओं जहाँ हम हार्डवेयर की एक विस्तृत विविधता पर इस मुद्दे को डिबग करने की कोशिश के साथ पूरा चर्चा (अतिरिक्त डीबग लॉग पोस्ट में शामिल किए गए हैं) है यह सुनिश्चित करने के लिए कि ट्रिगर क्रिएटर संस्करण में पेश किए गए डीपीआई परिवर्तन से संबंधित नहीं है।

क्या किसी को पता है कि यह किस प्रकार ट्रिगर करता है? और क्या कोई काम है?

***** अद्यतन 1 *****

कम से कम प्रारंभिक परीक्षण में, "DrawTextExW" भी प्रदर्शन नुकसान से प्रभावित हो रहा है। उपयोग में फ़ॉन्ट परीक्षण के दौरान है एरियल और प्रदर्शन समस्याएं फ़ॉन्ट के आकार से संबंधित प्रतीत होती हैं क्योंकि उपयोगकर्ता ने रिपोर्ट की है कि स्क्रीन पर अधिक निचले आकार की रेखाएं जोड़ना (निचले रिज़ॉल्यूशन पर अधिक टेक्स्ट प्रदान किया जाता है) प्रदर्शन में काफी सुधार करता है। https://github.com/bLightZP/WindowsTextRenderingProfiler

ऐसा लगता है इस मुद्दे पर निर्भर करता है:

***** अपडेट 2 *****

मैं एक छोटे से उपकरण इस मुद्दे जो आप इस GitHub भंडार में पा सकते हैं प्रोफ़ाइल को पत्र लिखा फ़ॉन्ट आकार, उदाहरण के लिए, 2560x1440 स्क्रीन पर, "34" के आकार के साथ "35" 21ms के आकार के साथ "एरियल" फ़ॉन्ट टेक्स्ट की एक पंक्ति प्रस्तुत करने में 2ms लग गए।

यह 32 बिट पिक्सेल प्रारूप के साथ डेल्फी टीबीटमैप के एचडीसी में प्रस्तुत किया जाता है और क्लिपिंग को अक्षम करने पर प्रदर्शन पर मामूली प्रभाव पड़ता है।

***** अद्यतन 3 *****

नीचे

सेबस्टियन जेड के जवाब प्रदर्शन के संस्करण के स्तर को बहाल करता है पूर्व रचनाकारों और मैं उसका जवाब प्रतिबिंबित करने के लिए GitHub पर नमूना कोड को अद्यतन किया है, लेकिन मेरे पास है चूंकि विंडोज 7 64 बिट और 1920x1080 स्क्रीन पर इस मुद्दे को पुन: पेश करने में सक्षम है, इसलिए यह विंडोज 10 निर्माता संस्करण या उच्च रिज़ॉल्यूशन डिस्प्ले तक ही सीमित नहीं है, जब फ़ॉन्ट गुणवत्ता एंटिलीएशिया पर सेट की जाती है तो ट्रिगर थ्रेसहोल्ड अधिक होता है। विंडोज 7 के तहत मेरे परीक्षण में, फ़ॉन्ट एरियल का उपयोग करके, ट्रिगर पॉइंट "110" (x10) धीमा या खराब प्रदर्शन का फ़ॉन्ट आकार बनाम "109" (तेज) का फ़ॉन्ट आकार था। और सेबस्टियन जेड के क्लीयरटाइप को अक्षम करने के जवाब के बाद विंडोज 10 में यह वही ट्रिगर थ्रेसहोल्ड मौजूद है।

+4

क्या आप ETO_CLIPPED ध्वज को हटाते समय समान प्रदर्शन ड्रॉप प्राप्त करते हैं? बिटमैप (i। E। 24bpp या 32bpp) क्या रंग गहराई है? क्या यह एक डीआईबी या डीडीबी है? यह सबसे अच्छा होगा यदि आप एक [mcve] जोड़ते हैं तो SO उपयोगकर्ता पुन: पेश करने का प्रयास कर सकते हैं। – zett42

+0

मैंने मूल पोस्ट को गिटहब प्रोजेक्ट के लिंक के साथ अपडेट किया जिसमें स्रोत कोड और एक निष्पादन योग्य शामिल है जिसे आप इसका परीक्षण करने के लिए उपयोग कर सकते हैं। अद्यतन में अन्य विवरण शामिल हैं। – bLight

उत्तर

4

डेल्फी lfQuality := DEFAULT_QUALITY; के साथ फ़ॉन्ट बनाता है। डिफ़ॉल्ट गुणवत्ता एंटीअलाइज्ड गुणवत्ता के लिए प्रयोग किया जाता है। लेकिन चूंकि विंडोज 10 निर्माता इसे अद्यतन करते हैं, अब यह क्लीयरटाइप के लिए डिफ़ॉल्ट है। और यह काफी धीमी है। तो समाधान मैन्युअल रूप से एंटीअलाइज्ड गुणवत्ता को मजबूर करना है।

आप एक मौजूदा डेल्फी संस्करण का उपयोग कर रहे हैं तो आप बस Font.Quality गुण सेट कर सकते हैं:

var 
    lf: TLogFont; 
begin 
    if GetObject(oBitmap.Canvas.Font.Handle, SizeOf(TLogFont), @lf) = sizeof(TLogFont) then 
    begin 
    lf.lfQuality := ANTIALIASED_QUALITY; 
    oBitmap.Canvas.Font.Handle := CreateFontIndirect(lf); 
    end; 

यह:

Procedure RenderText(oBitmap : TBitmap; X,Y : Integer; cRect : TRect; S : WideString; testFunction : Integer; TxtEffect : Integer; EffectColor : TColor; Clipping : Boolean); 
// [...] 
begin 
    obitmap.Canvas.Font.Quality := fqClearType; 

पुराने डेल्फी संस्करणों में यह थोड़ा अधिक जटिल है विंडोज 10 क्रिएटर अपडेट में काफी गॉचाचा है, क्योंकि क्लियरटाइप टेक्स्ट हमेशा उपयुक्त नहीं होता है, और इसके परिणामस्वरूप अप्रत्याशित परिणाम हो सकते हैं।

+0

आपका उत्तर प्रदर्शन के पूर्व-निर्माता संस्करण स्तरों को लौटाता है और गहरा परीक्षण करता है, ऐसा लगता है कि यह समस्या अभी भी विंडोज 7 के रूप में अभी तक मौजूद है लेकिन उच्च स्तर की सीमा के साथ, अद्यतन 3 देखें (लगभग 5 मिनट में) – bLight

संबंधित मुद्दे