Directx DX9 GetMessage FPS下降

Directx DX9 GetMessage FPS下降,directx,directx-9,Directx,Directx 9,我的程序是一个透明的覆盖在游戏上 将其设置为游戏窗口的代码 在单独的线程中调用setwindowtotarget 我很沮丧 而且,当我的fps计数器显示我的成绩也超过200分时,游戏感觉很滞后 void SetWindowToTarget(){ while(true){ tWnd = FindWindow(0, tWindowName); if (tWnd) { GetWindowRect(tWnd, &tSize); Width

我的程序是一个透明的覆盖在游戏上 将其设置为游戏窗口的代码 在单独的线程中调用setwindowtotarget 我很沮丧 而且,当我的fps计数器显示我的成绩也超过200分时,游戏感觉很滞后

void SetWindowToTarget(){
while(true){
    tWnd = FindWindow(0, tWindowName);
    if (tWnd)
    {
        GetWindowRect(tWnd, &tSize);
        Width = tSize.right - tSize.left;
        Height = tSize.bottom - tSize.top;
        DWORD dwStyle = GetWindowLong(tWnd, GWL_STYLE);
        if(dwStyle & WS_BORDER)
        {
            tSize.top += 23;
            Height -= 23;
        }
        MoveWindow(hWnd, tSize.left, tSize.top, Width, Height, true);
    }
    Sleep(5000);
}
}

这段代码使我的fps下降,然后每10秒左右备份一次

while (GetMessage(&Message, NULL, 0, 0)){
    TranslateMessage(&Message);
    DispatchMessage(&Message);
}

LRESULT CALLBACK WinProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam){
Sleep(17);
switch (Message)
{   
case WM_PAINT:
    Render();
    break;

case WM_CREATE:
    DwmExtendFrameIntoClientArea(hWnd, &Margin);
    break;

case WM_DESTROY:
    PostQuitMessage(1);
    return 0;

default:
    return DefWindowProc(hWnd, Message, wParam, lParam);
    break;
}
return 0;
}

渲染函数:

int Render(){
p_Device->Clear(0, 0, D3DCLEAR_TARGET, 0, 1.0f, 0);
p_Device->BeginScene();

if(tWnd == GetForegroundWindow()){
    g_vCenterScreen.x = Width / 2.f;
    g_vCenterScreen.y = Height / 2.f;
//draw stuff
    }
}

p_Device->EndScene();
p_Device->PresentEx(0, 0, 0, 0, 0);
return 0;

}

1。您应该使用Peek消息而不是GetMessage 2。我不确定在单独的线程中在循环中调用MoveWindow是否是一个好主意。也许你只能叫它一次,为什么?有人告诉我GetMessage的性能更好。当我在while循环中仅使用peekmessage时,低FPS的感觉更糟。将其更改为GetMessage后,fps变得更好了。。但它仍然不太好GetMessage是一个阻塞调用,而PeekMessage是一个非阻塞调用。您可以在循环中使用PeekMessage,每次迭代时使用一个Sleep(1)。