DirectX 9 100% CPU Auslastung



  • Hi, 🙂

    siehe nächster Beitrag 😃

    Thx



  • Warum ist die CPU voll ausgelastet? Was hab ich da falsch gemacht?

    Hier der gesamte Code:

    #include <d3d9.h>
    #include <d3dx9tex.h>
    
    LPDIRECT3D9				g_pD3D			= NULL;
    LPDIRECT3DDEVICE9		g_pd3dDevice	= NULL;
    LPDIRECT3DVERTEXBUFFER9 g_pVB			= NULL;
    LPDIRECT3DTEXTURE9		g_pTexture		= NULL;
    
    struct CUSTOMVERTEX {
        float x, y, z, rhw;
    	float tu, tv;
    //    DWORD color;
    };
    
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1)
    
    HRESULT InitD3D(HWND hWnd) {
    
    	if((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) return E_FAIL;
    
    	D3DDISPLAYMODE d3ddm;
    	g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
    
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp, sizeof(d3dpp));	
    	d3dpp.BackBufferWidth = 1024;
    	d3dpp.BackBufferHeight = 768;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = d3ddm.Format;
    	d3dpp.BackBufferCount = 1;
    	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    	d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
    	d3dpp.hDeviceWindow = hWnd;
    
        if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                       &d3dpp, &g_pd3dDevice))) return E_FAIL;
    
        return S_OK;
    }
    
    HRESULT InitVB() {
    	D3DXCreateTextureFromFile(g_pd3dDevice, "Texture.bmp", &g_pTexture);
    
        CUSTOMVERTEX vertices[] = { { 50,50,0, 1, 0.0,0.0 }, // x, y, z, rhw, color
    								{ 250,50,0, 1, 1.0,0.0 },
    								{ 50,250,0, 1, 0.0,1.0 },
    								{ 250,250,0, 1, 1.0,1.0 } };
    
        if(FAILED(g_pd3dDevice->CreateVertexBuffer(4*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,
                                                   D3DPOOL_DEFAULT, &g_pVB, NULL))) return E_FAIL;
    
    	g_pd3dDevice->SetTexture(0, g_pTexture);
    
        void* pVertices;
        if(FAILED(g_pVB->Lock(0, sizeof(vertices), (void**)&pVertices, 0))) return E_FAIL;
        memcpy(pVertices, vertices, sizeof(vertices));
        g_pVB->Unlock();
    
        return S_OK;
    }
    
    void Cleanup() {
        if(g_pVB != NULL) g_pVB->Release();
        if(g_pd3dDevice != NULL) g_pd3dDevice->Release();
        if(g_pD3D != NULL) g_pD3D->Release();
    }
    
    void Render() {
        if(g_pd3dDevice == NULL) return;
    
        g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
    
        if(SUCCEEDED(g_pd3dDevice->BeginScene())) {
    
            g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
            g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
            g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    
            g_pd3dDevice->EndScene();
        }
    
        g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
    }
    
    LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
        switch(msg) {
            case WM_DESTROY:
                Cleanup();
                PostQuitMessage(0);
                return 0;
        }
    
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
    {
        WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
                          GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                          "D3D Tutorial", NULL };
        RegisterClassEx(&wc);
    
        HWND hWnd = CreateWindow("D3D Tutorial", "D3D Tutorial 05: Textures", 
                                  WS_EX_TOPMOST, 100, 100, 300, 300,
                                  NULL, NULL, wc.hInstance, NULL);
    
        if(SUCCEEDED(InitD3D(hWnd))) { 
    
            if(SUCCEEDED(InitVB())) {
    
                ShowWindow(hWnd, SW_SHOWDEFAULT);
                UpdateWindow(hWnd);
    
                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();
                }
    		}
        }
    
        UnregisterClass("D3D Tutorial", wc.hInstance);
        return 0;
    }
    

    Thx



  • Füge in deiner while Schleife ein Sleep(1) oder auch eine höhere Millisekundenanzahl unter die Zeile Render() ein, um Prozessorzeit abzugeben.


  • Mod

    Angel of Darkness schrieb:

    Warum ist die CPU voll ausgelastet? Was hab ich da falsch gemacht?

    wieso sollte das falsch sein? viele 3d anwendungen haben 100% auslastung.



  • Echt?
    Ich dachte nur für ein einfaches Rechteck ist das ein bisschen übertrieben.

    Thx



  • @ Rapso
    Ich rendere mit meiner Engine im moment ~30k Tri's und habe eine Auslastung OHNE BACKFACE-CULLING von ~55%

    PS: Ist es schwerer für GBA zu deven? Gibt es da Cpp libs oder so? Wo kann ich was über GBA deven rausfinden ?

    @Angel of Darkness
    was für ein System hast du ? Vielleicht ist dein PC einfach zu lahm.


  • Mod

    Angel of Darkness schrieb:

    Echt?
    Ich dachte nur für ein einfaches Rechteck ist das ein bisschen übertrieben.

    Thx

    es hängt nicht davon ab was du machst, denn wenn ich eine whil(1){} einbaue, hat mein programm dass nichts macht auch 100% cpu auslastung.
    es hängt davon ab wie oft und auf welche weise du deine zeit ausnutzt. deine hauptschleife läuft die ganze zeit, da dürfte es doch klar sein dass du 100% rechenzeit bekommst. das betriebssytem kann ja nicht sagen "oh, das fenster zeigt nur ein rechteck, das mag ich nicht, dem geb ich 5% rechenzeit und das mit der schönen quakelevel bekommt 95% der zeit". was dein programm verwendet hängt von dir ab.
    eine möglichkeit ist halt dass du "sleep" einbaust. du kannst auch deine hauptschleife so umschreiben, dass sie nur bei windowsevents durchläuft. du kannst die priorität deines threads runtersetzen, dann hast du weiterhin 100% auslastung, aber nur wenn kein höcherpriorisiertes programm rechenzeit nutzen möchte.



  • Angel of Darkness schrieb:

    Echt?
    Ich dachte nur für ein einfaches Rechteck ist das ein bisschen übertrieben.

    Thx

    Wenn du es hundert Millionen mal in der Sekunde zeichnest, ist es nicht übertrieben. 😉 Versuch die Schleife, die du wahrscheinlich aus einem Tutorial hast, auch zu verstehen. Du renderst sofort immer wieder, wenn du mit dem Rendern davor fertig bist. Du machst keine Pause, gar nichts. Also verlangst du von deiner Hardware, so oft wie nur irgend möglich zu rendern.


  • Mod

    LJ_1102 schrieb:

    @ Rapso
    Ich rendere mit meiner Engine im moment ~30k Tri's und habe eine Auslastung OHNE BACKFACE-CULLING von ~55%

    wenn du das nicht beabsichtigst indem du eben z.b. sleep einbaust, dann ist das loadbalancing deiner engine hinüber. du solltest dem problem begegnen indem du rechenintensivere und dafür exaktere cullingmethoden nutzt, ansonsten verschwendest du viel potential eine gute framerate zu erhalten.

    bitte mach dafür dann aber einen extra thread auf;) ⚠


Anmelden zum Antworten