私はいくつかのDirectXAPIを学習しようとしていますが、今のところ、WINAPIウィンドウと、画面全体にビットマップを表示する単純なレンダリング関数しかありません。私のWINMAIN機能:
LPDIRECT3D9 pD3D; // the Direct3D object
LPDIRECT3DDEVICE9 pd3dDevice; // the Direct3D device
// This is winmain, the main entry point for Windows applications
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nCmdShow) {
hInst = hInstance;
// Initialize the window
if (!initWindow(hInstance)) return false;
// called after creating the window
if (!initDirect3D()) return false;
// main message loop:
MSG msg;
ZeroMemory( &msg, sizeof( msg ) );
while( msg.message != WM_QUIT) {
if( PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
TranslateMessage ( &msg );
DispatchMessage ( &msg );
} else {
render();
}
}
// Release the device and the Direct3D object
if( pd3dDevice != NULL ) pd3dDevice->Release( );
if( pD3D != NULL ) pD3D->Release( );
return (int) msg.wParam;
}
これが私のレンダリング関数です:
void render(void) {
IDirect3DSurface9* surface;
pd3dDevice->CreateOffscreenPlainSurface(640, // the width of the surface to create
480, // the height of the surface to create
D3DFMT_X8R8G8B8, // the surface format
D3DPOOL_DEFAULT, // the memory pool to use
&surface, // holds the resulting surface
NULL); // reserved
D3DXLoadSurfaceFromFile(surface, NULL, NULL, L"test.bmp", NULL, D3DX_DEFAULT, 0, NULL);
// This will hold the back buffer
IDirect3DSurface9* backbuffer = NULL;
// Check to make sure you have a valid Direct3D device
if( NULL == pd3dDevice ) return;// Clear the back buffer to a blue color
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0,0,255 ), 1.0f, 0 );
// Get the back buffer
pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer );
// Copy the offscreen surface to the back buffer
// Note the use of NULL values for the source and destination RECTs
// This ensures a copy of the entire surface to the back buffer
pd3dDevice->StretchRect(surface, NULL, backbuffer, NULL, D3DTEXF_NONE );
// Present the back buffer contents to the display
pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
したがって、主な問題は、レンダリング機能が有効になっている(コメントされていない)場合、アプリケーションが使用するメモリが1秒間に400〜600Mbになることです。ここで、WinMainからの回線を無効(コメント)にすると、メモリは5 Mbのままになりますが、プロセッサがおかしくなり、アプリケーションはその約50%を使用します。WinMain()
したがって、多くのプロセッサとrender()
多くのメモリを使用しているように見えます。なんで?何を忘れているの?
ありがとう!