Контекст устройства кэширования - PullRequest
0 голосов
/ 03 мая 2019

Для рисования текста я использую

Size GetStringSize(LOGFONT logFont, string stringToMeasure)
{
     Font font = FontCache.Default.GetOrCreate(logFont);
     using(var graphics = System.Drawing.Graphics.FromHwnd(Display.HWND))
     {
        return TextRenderer.MeasureText(graphics, stringToMeasure, font, new Size(1000000, 1000000));
     }
}

Я могу кешировать объект шрифта без проблем.Но я не уверен, смогу ли я кэшировать объект Графика , или я могу просто использовать объект Графика текущего отображения, передав значение null в FromHWnd ?

Проблема производительности вполне реальна:

Line #, Process, Stack Tag, Stack - (Callees of System.Drawing.ni.dll!System.Drawing.Graphics.FromHwnd(IntPtr)), Weight (in view) (ms)
7, ,   |  , System.Drawing.ni.dll!System.Drawing.Graphics.FromHwnd(IntPtr), 21,334.418715
8, ,   |  ,   |- System.Drawing.ni.dll!System.Drawing.Graphics.FromHwndInternal(IntPtr), 21,304.413686
9, ,   |  ,   |    |- System.Drawing.ni.dll!DomainBoundILStubClass.IL_STUB_PInvoke(System.Runtime.InteropServices.HandleRef, System.Drawing.FontStyle, Int32 ByRef), 21,264.422130
10, ,   |  ,   |    |    |- GdiPlus.dll!GdipCreateFromHWND, 21,244.429337
11, ,   |  ,   |    |    |    |- GdiPlus.dll!GpGraphics::GetFromHwnd, 21,214.423913
12, ,   |  ,   |    |    |    |    |- GdiPlus.dll!GpGraphics::GpGraphics, 20,824.349264
13, ,   |  ,   |    |    |    |    |    |- win32u.dll!ZwUserGetDC, 20,042.878233
14, ,   |  ,   |    |    |    |    |    |    |- ntoskrnl.exe!KiSystemServiceCopyEnd, 19,952.862751
15, ,   |  ,   |    |    |    |    |    |    |    win32kbase.sys!NtUserGetDC, 19,952.862751
16, ,   |  ,   |    |    |    |    |    |    |    |- win32kbase.sys!_GetDCEx, 19,842.849739
17, ,   |  ,   |    |    |    |    |    |    |    |    |- win32kbase.sys!HmgShareLock, 7,384.475206
18, ,   |  ,   |    |    |    |    |    |    |    |    |    |- win32kbase.sys!HANDLELOCK::vLockHandle, 3,085.609601
19, ,   |  ,   |    |    |    |    |    |    |    |    |    |    |- ntoskrnl.exe!ExAcquirePushLockExclusiveEx, 2,154.100038
20, ,   |  ,   |    |    |    |    |    |    |    |    |    |    |    |- ntoskrnl.exe!ExAcquirePushLockExclusiveEx<itself>, 1,984.037148

Я провожу там 21 секунду, что довольно много.Это далеко от нс.Есть около 4 потоков, делающих это одновременно, чтобы ускорить рисование.

Что может сделать недействительным кэшированный Графика объект?В этом случае я не рисую ничего, только измеряю размер текста, поэтому его должно быть довольно легко кэшировать.Шрифт указан с отрицательной высотой, что означает, что он объявлен в пикселях.

...