gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:39:16 24 4
gpt4 key购买 nike

我在这里看了很多关于 PeekMessage 和 WM_MOUSEMOVE 的帖子,但到目前为止我还没有发现任何与性能相关的内容。

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

经过几个小时的挖掘和分析,我发现来源是 PeekMessage()。不是该消息的 DispatchMessage(),只是偷看。我测量了单独调用该函数的频率非常频繁(每帧多次),时钟频率为 1-2 毫秒。如果将其与快速鼠标移动相结合,则每渲染一帧,消息队列的传输可能会花费我 1000-2000 毫秒以上的时间。听起来很荒谬,但实际上我从 MS 下载了一个 super 基本的 DirectX 示例并在那里测试了同样的东西,得到了同样的结果。

整个示例太大而无法粘贴到此处,但如果您想尝试,请在以下位置下载示例: http://code.msdn.microsoft.com/Direct3D-Tutorial-Win32-829979ef

并进行以下更改;

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, 0, 0, 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;
}

最佳答案

试一试:

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, nullptr, 0, 0, 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;

它可能只是像上面提到的评论者那样像钩子(Hook)一样古怪。

关于windows - PeekMessage() 需要 1-2 毫秒来检索 WM_MOUSEMOVE 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com