Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 发现缺陷c++;代码_C++_Directx - Fatal编程技术网

C++ 发现缺陷c++;代码

C++ 发现缺陷c++;代码,c++,directx,C++,Directx,有人能找出这段代码中的漏洞吗?我花了好几个小时试图找出它的毛病。我基本上遇到了directx应用程序的严重滞后。有人能给我解释一下什么是错的以及为什么会出现这种情况 #include <Windows.h> #include <d3d9.h> // Function Prototypes LRESULT CALLBACK MsgProc(HWND Wnd,UINT message,WPARAM wParam,LPARAM lParam); INT CreateAn

有人能找出这段代码中的漏洞吗?我花了好几个小时试图找出它的毛病。我基本上遇到了directx应用程序的严重滞后。有人能给我解释一下什么是错的以及为什么会出现这种情况

#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 );

}
#包括
#包括
//功能原型
LRESULT回调MsgProc(HWND Wnd,UINT消息,WPARAM WPARAM,LPARAM LPARAM);
INT CreateAndRegisterWindow(HINSTANCE-hInst);
INT initilizeD3D(HWND-HWND);
VOID Render();
//全球的
HWND全局窗口句柄;
LPDIRECT3D9 lpD3D9;
LPDIRECT3DDEVICE9 lpD3DDevice9;
const wchar_t ClassName[]=L“教程”;
//入口点
INT-WINAPI-WinMain(HINSTANCE-hInst、HINSTANCE-hPrevInst、LPSTR-lpCmdLine、INT-CmdShow)
{
//注册窗口类
WNDCLASSEX wc=
{
sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,NULL,
L“D3D教程”,空
};
注册类别(&wc);
//创建应用程序的窗口
GlobalWindowHandle=CreateWindow(L“D3D教程”,L“D3D教程01:CreateDevice”,
WS_重叠窗口,100100300300,
NULL,NULL,wc.hInstance,NULL);
初始化D3D(全局窗口句柄);
ShowWindow(全局窗口句柄,SW_SHOW);
更新窗口(全局窗口句柄);
味精;
while(GetMessage(&msg,NULL,NULL,NULL))
{
翻译信息(&msg);
发送消息(&msg);
}
}
INT CreateAndRegisterWindow(HINSTANCE hInst)
{
WNDCLASSEX wcex;
零内存(&wcex,sizeof(wcex));
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.hbrBackground=(HBRUSH)彩色窗口;
wcex.hCursor=LoadCursor(0,IDC_箭头);
wcex.hInstance=hInst;
wcex.lpfnWndProc=(WNDPROC)MsgProc;
wcex.lpszClassName=ClassName;
如果(失败(注册表类(&wcex)))
{
MessageBoxA(GetForegroundWindow(),“注册类失败”,“错误”,MB_ICONERROR);
返回退出失败;
}
GlobalWindowHandle=CreateWindow(类名,L“教程”,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300350,NULL,NULL,0,NULL);
如果(!GlobalWindowHandle)
MessageBoxA(GetForegroundWindow(),“未能创建窗口”,“错误”,MB_ICONERROR);
返回退出成功;
}
LRESULT回调MsgProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
案例WM_油漆:
更新窗口(hWnd);
Render();
返回0;
案例WM_销毁:
退出消息(退出成功);
返回0;
}
返回DefWindowProc(hWnd、msg、wParam、lParam);
}
INT initilizeD3D(HWND-HWND)
{
如果(NULL==(lpD3D9=Direct3DCreate9(D3D\U SDK\U版本)))
MessageBoxA(GetForegroundWindow(),“无法创建direct3d设备”,“错误”,MB_ICONERROR);
D3D当前参数d3dpp;
零内存(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=d3dswapeeffect_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_未知;
如果(失败(lpD3D9->CreateDevice(D3DADAPTER\u默认、D3DDEVTYPE\u HAL、hWnd、D3DCREATE\u软件\u VERTEXPROCESSING、&d3dpp、&lpD3DDevice9)))
返回退出失败;
返回退出成功;
}
VOID Render()
{
如果(NULL==lpD3DDevice9)
返回;
//将backbuffer清除为蓝色
lpD3DDevice9->清除(0,空,D3DCLEAR_目标,D3DCOLOR_XRGB(0,0,255),1.0f,0);
//开演
if(成功(lpD3DDevice9->BeginScene())
{
//场景对象的渲染可以在此处进行
//结束现场
lpD3DDevice9->EndScene();
}
//向显示器显示backbuffer内容
lpD3DDevice9->Present(空,空,空,空);
}

更新窗口
导致
WM\u油漆
再次着火


还可以看一看:

也许是小点,但是有更好的方法来编写主游戏循环。您可以使用PeekMessage来避免睡眠,而不是使用while(GetMessage(…){…},如下所述:

哇,我刚刚看到了什么地方出了问题,原因很奇怪,是什么导致它加速的???嗯,我不知道。你能用这些信息编辑你的原始问题吗?也许其他人会看到它并回答。以下是有关函数的信息:-此人有相同的问题,但没有答案: