2012-02-14 35 views
1

可能有人请发现该漏洞在此代码段我花了几个小时试图找出什么地方错了它。我很bassicaly一个基本的DirectX应用程序reciving大规模的滞后可能有人向我解释什么是错的,为什么这是造成它。现货缺陷C++代码

#include <Windows.h> 
#include <d3d9.h> 

// Function Prototypes 
LRESULT CALLBACK MsgProc(HWND Wnd,UINT message,WPARAM wParam,LPARAM lParam); 
INT CreateAndRegisterWindow(HINSTANCE hInst); 
INT initilizeD3D(HWND hWnd); 
VOID Render(); 
//Globals 
HWND GlobalWindowHandle; 
LPDIRECT3D9 lpD3D9; 
LPDIRECT3DDEVICE9 lpD3DDevice9; 
const wchar_t ClassName[] = L"Tutorial"; 

//Entry Point 
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,INT CmdShow) 
{ 
// Register the window class 
WNDCLASSEX wc = 
{ 
    sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
    GetModuleHandle(NULL), NULL, NULL, NULL, NULL, 
    L"D3D Tutorial", NULL 
}; 
RegisterClassEx(&wc); 

// Create the application's window 
GlobalWindowHandle = CreateWindow(L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice", 
          WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, 
          NULL, NULL, wc.hInstance, NULL); 


initilizeD3D(GlobalWindowHandle); 
ShowWindow(GlobalWindowHandle,SW_SHOW); 
    UpdateWindow(GlobalWindowHandle); 
MSG msg; 
while(GetMessage(&msg,NULL,NULL,NULL)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 



} 
INT CreateAndRegisterWindow(HINSTANCE hInst) 
{ 
    WNDCLASSEX wcex; 
    ZeroMemory(&wcex, sizeof(wcex)); 
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.hbrBackground = (HBRUSH)COLOR_WINDOW; 
    wcex.hCursor = LoadCursor(0,IDC_ARROW); 
    wcex.hInstance = hInst; 
    wcex.lpfnWndProc = (WNDPROC)MsgProc; 
    wcex.lpszClassName = ClassName; 
    if(FAILED(RegisterClassEx(&wcex))) 
    { 
     MessageBoxA(GetForegroundWindow(),"Failed to register class.","Error",MB_ICONERROR); 
     return EXIT_FAILURE; 
    } 
    GlobalWindowHandle = CreateWindow(ClassName,L"Tutorial",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,350,NULL,NULL,0,NULL); 
    if(!GlobalWindowHandle) 
     MessageBoxA(GetForegroundWindow(),"Failed to create window.","Error",MB_ICONERROR); 
    return EXIT_SUCCESS; 
} 

LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 
{ 
    switch(msg) 
    { 
    case WM_PAINT: 
     UpdateWindow(hWnd); 
     Render(); 
     return 0; 
    case WM_DESTROY: 
     PostQuitMessage(EXIT_SUCCESS); 
     return 0; 

    } 
    return DefWindowProc(hWnd,msg,wParam,lParam); 
} 

INT initilizeD3D(HWND hWnd) 
{ 
    if(NULL==(lpD3D9 = Direct3DCreate9(D3D_SDK_VERSION))) 
     MessageBoxA(GetForegroundWindow(),"Failed to create direct3d device","Error",MB_ICONERROR); 
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory(&d3dpp, sizeof(d3dpp)); 
    d3dpp.Windowed = TRUE; 
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; 
    if(FAILED(lpD3D9->CreateDevice  (D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&lpD3DDevice9))) 
     return EXIT_FAILURE; 

    return EXIT_SUCCESS; 

} 

VOID Render() 
{ 
    if(NULL == lpD3DDevice9) 
    return; 

// Clear the backbuffer to a blue color 
    lpD3DDevice9->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0); 

// Begin the scene 
if(SUCCEEDED(lpD3DDevice9->BeginScene())) 
{ 
    // Rendering of scene objects can happen here 

    // End the scene 
    lpD3DDevice9->EndScene(); 
} 

// Present the backbuffer contents to the display 
lpD3DDevice9->Present(NULL, NULL, NULL, NULL); 

} 

回答

1

小了点,也许,但有一个更好的方式来写主游戏循环。而不是使用while(GetMessage(...)){...},你可以使用PeekMessage来避免睡眠,如下所述: http://www.mvps.org/directx/articles/writing_the_game_loop.htm

+0

哇我刚刚看到了什么是错误的一些奇怪的原因ValidateRect导致它加快如何? – 2012-02-14 17:12:21

+0

嗯,我不知道。你能用这些信息编辑你的原始问题吗?也许别人会看到它并回复。下面是关于函数的信息:http://msdn.microsoft.com/en-us/library/dd145194(v=vs.85).aspx - 此人有同样的问题,但没有答案的答案是:HTTP://计算器.COM /问题/ 9281479 /为什么 - 不 - 不具有-validaterect原因-A-DirectX的应用对速度变慢,tremen – David 2012-02-14 19:36:10