出于某些奇怪的原因,调用WinAPI的ExtTextOutW函数在高分辨率位图(2560x1440/3840x2160)上绘制剪切文本会在使用Creators版本更新更新Windows 10后导致性能降低~x50.从我的用户的测试和调试日志中可以看出,位图或字体大小的细微差别可能会触发性能损失.
这是一个显示性能命中的调试日志:
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
Run Code Online (Sandbox Code Playgroud)
从日志中可以看出,对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 …Run Code Online (Sandbox Code Playgroud) 当触发UAC提示时(不是我的应用程序),它会破坏某些东西(我相信它是Direct3D设备句柄),这会导致屏幕显示最后一帧而不是运动图像.
我没有编写显示3D图像的代码(它是一个插件),但是在UAC提示之后,如果我调整窗口大小,图像就会返回.
有没有办法检测UAC提示关闭所以我可以调用代码来刷新显示以补偿?
当我的应用程序在"Windows Vista兼容模式"下运行时,我有一个非常奇怪的问题(右键单击EXE,启用兼容模式并选择Windows Vista).
问题是来自"RegEnumValue"函数的返回缓冲区长度值返回不同的值.
例如,注册表值为"Zoom Player MAX"(15个字符):
在兼容模式下,RegEnumValue的"lpcbData"字段返回值16(包括尾随空终止).
启用兼容模式后,RegEnumValue的"lpcbData"字段返回值15(不包括尾随空终止).
是否有一个解决方法/修补程序,不需要更改我的字符串转换代码?