微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PeekMessage需要1-2毫秒来检索WM_MOUSEMOVE消息?

在这里看过很多关于PeekMessage和WM_MOUSEMOVE的post,但到目前为止我还没有发现任何与性能有关的东西。

长话短说; 我正在做PC游戏开发,昨天我注意到,只要快速移动鼠标,我就可以将我们的应用程序从稳定的500+ FPS(在菜单中)带到一位数的FPS(低至6)。

经过几个小时的挖掘和分析,我发现源是PeekMessage()。 不是dispatchMessage()的消息,只是偷看。 我非常频繁地(每帧多次)测量调用这个函数,时钟频率在1-2 ms。 如果将鼠标移动速度与快速移动相结合,抽取消息队列可能会使我的渲染帧数高达1000-2000毫秒。 听起来很可笑,但我实际上从MS下载了一个超级基本的DirectX示例,并在那里testing了相同的结果。

整个示例太大,无法粘贴,但是如果您想尝试,请下载示例: http : //code.msdn.microsoft.com/Direct3D-Tutorial-Win32-829979ef

Windows 8 sdk中的d3dx11.h

读取键盘inputasynchronous和使用DirectInput有什么区别?

为什么没有Linux的DirectX API?

如何在跨平台(Windows,iOS,Android)C ++应用程序中表示string?

DirectDraw比GDI更快地截图吗?

并做出如下修改;

typedef unsigned __int64 QWORD; // 64-bit unsigned. DOUBLE GSecondsPerCycle; void appInitTiming(void) { LARGE_INTEGER Frequency; QueryPerformanceFrequency(&Frequency); GSecondsPerCycle = 1.0 / Frequency.QuadPart; } QWORD appCycles() { LARGE_INTEGER Cycles; QueryPerformanceCounter(&Cycles); return Cycles.QuadPart; } int WINAPI wWinMain( _In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine,_In_ int nCmdshow ) { UNREFERENCED_ParaMETER( hPrevInstance ); UNREFERENCED_ParaMETER( lpCmdLine ); if( Failed( Initwindow( hInstance,nCmdshow ) ) ) return 0; if( Failed( InitDevice() ) ) { CleanupDevice(); return 0; } appInitTiming(); // Main message loop MSG msg = {0}; while( WM_QUIT != msg.message ) { QWORD StartCycles = appCycles(); BOOL hasMsg = PeekMessage( &msg,nullptr,PM_REMOVE ); const QWORD DeltaCycles = appCycles() - StartCycles; double deltaMS = DeltaCycles * GSecondsPerCycle * 1000.0; if (deltaMS > 1/* || msg.message == 512*/) { std::ostringstream os; os << "SlowPeekMsg ID: " << msg.message << ",time: " << deltaMS << "ms" << std::endl; std::string buffer(os.str()); OutputDebugStringA(buffer.c_str()); } if(hasMsg) { TranslateMessage( &msg ); dispatchMessage( &msg ); } else { Render(); } } CleanupDevice(); return ( int )msg.wParam; }

如何使用包装在ComPtr中的Direct3D 11指针获取11.1接口?

在现有的graphics应用程序上绘制DirectX / OpenGLgraphics

WPF主应用程序停止响应,如果一个子窗口正在移动

是否有可能在Linux中开发DirectX应用程序?

d3dx库如何将纹理保存到文件

给这个去吧:

UNREFERENCED_ParaMETER( hPrevInstance ); UNREFERENCED_ParaMETER( lpCmdLine ); if( Failed( Initwindow( hInstance,nCmdshow ) ) ) return 0; if( Failed( InitDevice() ) ) { CleanupDevice(); return 0; } appInitTiming(); // Main message loop MSG msg = {0}; while( WM_QUIT != msg.message ) { QWORD StartCycles = appCycles(); while(PeekMessage( &msg,PM_REMOVE )) { TranslateMessage(&msg); dispatchMessage(&msg); } const QWORD DeltaCycles = appCycles() - StartCycles; double deltaMS = DeltaCycles * GSecondsPerCycle * 1000.0; if (deltaMS > 1/* || msg.message == 512*/) { std::ostringstream os; os << "SlowPeekMsg ID: " << msg.message << ",time: " << deltaMS << "ms" << std::endl; std::string buffer(os.str()); OutputDebugStringA(buffer.c_str()); } Render(); } CleanupDevice(); return ( int )msg.wParam;

这可能只是像上面提到的一个评论者那样的怪异的东西。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐