Win32 GDI TextOut与DrawText低效率深坑问题

Win32 GDI绘图需要优化的几个地方:

1、内存双缓冲:这个自行GG

2、仅可视区域:视图中不可见的区域是不要绘制

3、不要用DrawText:能用TextOut的地方就别用DrawText,这个函数效率极低,会导致CPU占用

 

CMFCToolBar::EnableTextLabels(TRUE)

这个函数是设置icon + text样式的,如果设置此样式,在低配电脑上最小化再最大化时,会出现CPU一瞬间极高,UI黑屏0.5秒左右(可以用512M XP虚拟机测试),暂时未找到合适的解决办法!

 

VS2010 MFC自带的TOOLBAR ICON+TEXT模式,碰到一个巨坑,在老电脑XP双核512M,最小化再最大化切换时,MFC库中调用了DrawText导致瞬间高CPU,暂时还比较头疼,看看能不能继承这个类重载一下换TextOut实现。。。

0:005> !runaway
 User Mode Time
  Thread       Time
   0:c04       0 days 0:00:00.187
   5:9f8       0 days 0:00:00.000
   4:d8c       0 days 0:00:00.000
   3:830       0 days 0:00:00.000
   2:388       0 days 0:00:00.000
   1:420       0 days 0:00:00.000
0:005> ~0 s
eax=00ebb0c4 ebx=00000003 ecx=00eb15d8 edx=000003b8 esi=73ff0560 edi=73ff05c8
eip=7c92e514 esp=0012eab0 ebp=0012ead8 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
7c92e514 c3              ret
0:000> .clrstack
               ^ Syntax error in '.clrstack'
0:000> ~*kb

.  0  Id: f40.c04 Suspend: 1 Teb: 7ffdd000 Unfrozen
ChildEBP RetAddr  Args to Child              
0012eaac 77f0c4a7 77f1e8b7 08010a92 73ff04e8 ntdll!KiFastSystemCallRet
0012ead8 73fd5300 08010a92 73ff04e8 00000003 GDI32!NtGdiGetTextExtentExW+0xc
0012eb10 73fb2fdf 08010a92 73ff0374 73ff04e8 USP10!GDIPlace+0x40
0012eb48 73fbad84 08010a92 73ff0374 73ff04e8 USP10!ScriptPlace+0xa7
0012eba0 73fbb911 00000014 00000000 00000000 USP10!RenderItemNoFallback+0x27d
0012ebcc 73fbb977 00000000 00000011 00000000 USP10!RenderItemWithFallback+0x22e
0012ebf8 73fbc728 73ff0250 00000000 00000000 USP10!RenderItem+0x22
0012ec28 73fb424e 00000000 08010a92 00000000 USP10!ScriptStringAnalyzeGlyphs+0x149
0012ec40 62c248f8 08010a92 00eccca0 00000003 USP10!ScriptStringAnalyse+0x237
0012ec8c 62c24651 08010a92 00eccca0 00000003 LPK!LpkStringAnalyse+0xfd
0012ed8c 62c21269 08010a92 00000000 00000000 LPK!LpkCharsetDraw+0x2f3
0012edc0 77d4e715 08010a92 00000000 00000000 LPK!LpkDrawTextEx+0x34
0012ee00 77d1e113 08010a92 00000028 00000000 USER32!DT_DrawStr+0x54
0012ee4c 77d1dbd1 08010a92 00eccca0 00eccca6 USER32!DT_GetLineBreak+0x77
0012eef8 77d1da63 08010a92 ffffffff 00000003 USER32!DrawTextExWorker+0x23c
0012ef1c 77d1fe40 08010a92 00eccca0 00000003 USER32!DrawTextExW+0x1e
0012ef50 787b23cf 08010a92 00eccca0 00000003 USER32!DrawTextW+0x46
0012ef6c 7874a2a8 00eccca0 00000003 0012efac mfc100u!CDC::DrawTextW+0x1a
0012efcc 77d1b6d8 0012f058 7874448b 0012f02c mfc100u!CMFCToolBarButton::OnCalculateSize+0x16a
0012f058 7874465c 00001ff4 00007fff 0012f0ac USER32!GetClientRect+0x1a

   1  Id: f40.420 Suspend: 1 Teb: 7ffdc000 Unfrozen
ChildEBP RetAddr  Args to Child              
00e7fea4 7c92df4a 7c8096b0 00000002 00e7fed0 ntdll!KiFastSystemCallRet
00e7fea8 7c8096b0 00000002 00e7fed0 00000001 ntdll!ZwWaitForMultipleObjects+0xc
00e7ff44 77dc8631 00000002 00e7ff6c 00000000 kernel32!WaitForMultipleObjectsEx+0x12c
00e7ffb4 7c80b849 00000000 00000000 77dc8ae4 ADVAPI32!WmipEventPump+0x230
00e7ffec 00000000 77dc848a 00000000 00000000 kernel32!BaseThreadStart+0x37

   2  Id: f40.388 Suspend: 1 Teb: 7ffdb000 Unfrozen
ChildEBP RetAddr  Args to Child              
01f7fe14 7c92daaa 77e565e3 000006f8 01f7ff74 ntdll!KiFastSystemCallRet
01f7fe18 77e565e3 000006f8 01f7ff74 00000000 ntdll!ZwReplyWaitReceivePortEx+0xc
01f7ff80 77e56caf 01f7ffa8 77e56ad1 001872a8 RPCRT4!LRPC_ADDRESS::ReceiveLotsaCalls+0x12a
01f7ff88 77e56ad1 001872a8 00166650 00000088 RPCRT4!RecvLotsaCallsWrapper+0xd
01f7ffa8 77e56c97 0017b918 01f7ffec 7c80b849 RPCRT4!BaseCachedThreadRoutine+0x79
01f7ffb4 7c80b849 00187528 00166650 00000088 RPCRT4!ThreadStartRoutine+0x1a
01f7ffec 00000000 77e56c7d 00187528 00000000 kernel32!BaseThreadStart+0x37

   3  Id: f40.830 Suspend: 1 Teb: 7ffda000 Unfrozen
ChildEBP RetAddr  Args to Child              
0207ff1c 7c92d21a 7c802512 00000000 0207ff50 ntdll!KiFastSystemCallRet
0207ff20 7c802512 00000000 0207ff50 7c802670 ntdll!ZwDelayExecution+0xc
0207ff78 7c802576 0000ea60 00000000 0207ffb4 kernel32!SleepEx+0x61
0207ff88 769ad72e 0000ea60 00166920 769ad8b7 kernel32!Sleep+0xf
0207ff94 769ad8b7 00000000 7c8865f8 00166920 ole32!CROIDTable::WorkerThreadLoop+0x14 [d:\nt\com\ole32\com\dcomrem\refcache.cxx @ 1358]
0207ffa8 769ad91f 7c933e01 0207ffec 7c80b849 ole32!CRpcThread::WorkerLoop+0x1e [d:\nt\com\ole32\com\dcomrem\threads.cxx @ 185]
0207ffb4 7c80b849 00166920 7c8865f8 7c933e01 ole32!CRpcThreadCache::RpcWorkerThreadEntry+0x1b [d:\nt\com\ole32\com\dcomrem\threads.cxx @ 54]
0207ffec 00000000 769ad904 00166920 00000000 kernel32!BaseThreadStart+0x37

   4  Id: f40.d8c Suspend: 1 Teb: 7ffd9000 Unfrozen
ChildEBP RetAddr  Args to Child              
021afe50 7c92df4a 7c8096b0 00000002 021afe7c ntdll!KiFastSystemCallRet
021afe54 7c8096b0 00000002 021afe7c 00000001 ntdll!ZwWaitForMultipleObjects+0xc
021afef0 77d19609 00000002 021aff18 00000000 kernel32!WaitForMultipleObjectsEx+0x12c
021aff4c 77d196b8 00000001 021affac ffffffff USER32!RealMsgWaitForMultipleObjectsEx+0x13e
021aff68 4aea736a 00000001 021affac 00000000 USER32!MsgWaitForMultipleObjects+0x1f
021affb4 7c80b849 00000000 00000000 00000011 gdiplus!BackgroundThreadProc+0x59
021affec 00000000 4aea730e 00000000 00000000 kernel32!BaseThreadStart+0x37

#  5  Id: f40.9f8 Suspend: 1 Teb: 7ffd8000 Unfrozen
ChildEBP RetAddr  Args to Child              
02afffc8 7c97236a 00000005 00000004 00000001 ntdll!DbgBreakPoint
02affff4 00000000 00000000 00000000 8e8e6542 ntdll!DbgUiRemoteBreakin+0x2d
0:000> k
ChildEBP RetAddr  
0012eaac 77f0c4a7 ntdll!KiFastSystemCallRet
0012ead8 73fd5300 GDI32!NtGdiGetTextExtentExW+0xc
0012eb10 73fb2fdf USP10!GDIPlace+0x40
0012eb48 73fbad84 USP10!ScriptPlace+0xa7
0012eba0 73fbb911 USP10!RenderItemNoFallback+0x27d
0012ebcc 73fbb977 USP10!RenderItemWithFallback+0x22e
0012ebf8 73fbc728 USP10!RenderItem+0x22
0012ec28 73fb424e USP10!ScriptStringAnalyzeGlyphs+0x149
0012ec40 62c248f8 USP10!ScriptStringAnalyse+0x237
0012ec8c 62c24651 LPK!LpkStringAnalyse+0xfd
0012ed8c 62c21269 LPK!LpkCharsetDraw+0x2f3
0012edc0 77d4e715 LPK!LpkDrawTextEx+0x34
0012ee00 77d1e113 USER32!DT_DrawStr+0x54
0012ee4c 77d1dbd1 USER32!DT_GetLineBreak+0x77
0012eef8 77d1da63 USER32!DrawTextExWorker+0x23c
0012ef1c 77d1fe40 USER32!DrawTextExW+0x1e
0012ef50 787b23cf USER32!DrawTextW+0x46
0012ef6c 7874a2a8 mfc100u!CDC::DrawTextW+0x1a
0012efcc 77d1b6d8 mfc100u!CMFCToolBarButton::OnCalculateSize+0x16a
0012f058 7874465c USER32!GetClientRect+0x1a
0:000> g

最后一句:珍爱生命,远离MFC!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪宁宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值