performance im keller?
-
Hallo!
Ich bin grad dabei, an meiner Engine rumzufummeln. Dabei hab ich mir mal die
Irrlicht-Engine angeschaut, um die performance zu vergleichen. Dabei hab ich erschreckende dinge festgestellt...
Im Leerlauf kommt Irrlicht bei dem Programm wo sie ein Q3BSP darstellt, aber alles wegcullt auf in etwa 170fps. Meine Engine kommt bei gleichen Bedinungen (DX 9, 800x600, 16bpp, fenstermodus) nur auf 70-80 fps.
Woran kann das liegen?Hier mal der Renderpass, der bei mir pro Frame aufgerufen wird.
// Nachrichtenschleife PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE); while(!ReceivedQuit) { QueryPerformanceCounter(&perf1); while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); if(Msg.message == WM_QUIT) ReceivedQuit = true; } if(g_Active) { if(pMoveProc != NULL) if(pMoveProc(time) == ME_STOP) break; if(pRenderProc != NULL) if(pRenderProc(time) == ME_STOP) break; QueryPerformanceCounter(&perf2); time = double(perf2.QuadPart - perf1.QuadPart) / frequ.QuadPart; // globale Zeit um diesen Wert erhöhen, wenn Engine nicht pausiert ist if(g_IsPaused) time = 0; me_g_time += time; } } // Move: meResult Move(float PAssed) { g_FC->Update(); return ME_OK; } //g_FC::Update meResult meFrameCounter::Update() { m_NumFramesSinceLastShow++; if(m_LastFrameShown + 1.0f < me_g_time) { m_Frames = m_NumFramesSinceLastShow; m_NumFramesSinceLastShow = 0; m_LastFrameShown = me_g_time; } return ME_OK; }; // Render { g_d3d->BeginRender(); g_FC->Render(); g_d3d->EndRender(); return ME_OK; } // begin render DLLEXPORT meResult meD3D::BeginRender(D3DCOLOR bgColor) { m_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, bgColor, 1.0f, 0); m_D3DDevice->BeginScene(); return ME_OK; } // FC::Render meResult meFrameCounter::Render() { char c[64]; sprintf(c, m_PrintedText, m_Frames); m_Font->BeginRender(); // setzt ein paar render States m_Font->DrawTextFast(c, m_PosX, m_PosY, m_Color, m_ScaleX, m_ScaleY); m_Font->EndRender(); // setzt renderstates zurück return ME_OK; } // drawtextfast meResult meTTFont::DrawTextFast(const char* Text, int PosX, int PosY, DWORD Color, float ScaleX = 1.0f, float ScaleY = 1.0f, DWORD Flags) { RECT r; DWORD Format = 0; if(Flags & MEFF_HCENTER) { r.top = PosY; r.bottom = me_g_D3D->GetScreenHeight(); r.left = PosX - 400; r.right = PosX + 400; Format |= DT_CENTER; } else if(Flags & MEFF_HRIGHT) { r.top = PosY; r.bottom = me_g_D3D->GetScreenHeight(); r.left = 0; r.right = PosX; Format |= DT_RIGHT; } else { r.top = PosY; r.left = PosX; r.bottom = me_g_D3D->GetScreenHeight(); r.right = me_g_D3D->GetScreenWidth(); } // ID3DX-Font-objekt m_Font->DrawTextA(Text, -1, &r, Format, Color); return ME_OK; } // D3D::EndRender DLLEXPORT meResult meD3D::EndRender(HWND wnd) { m_D3DDevice->EndScene(); m_D3DDevice->Present(NULL, NULL, wnd, NULL); return ME_OK; }Die PResentparams und so sind eigentlich so wie bei irrlicht eingestellt.
Im Vollbild komm ich damit aber auch auf 160fps oder so, manchmal auch auf 600 (bei 320*200
)Meine Profilerklasse hat mir die Auskunft gegeben, dass meD3D::EndRender am längsten braucht:
FID_D3D_ENDRENDER Anzahl der Aufrufe: 468 Durchschnittliche Laufzeit: 0.0152832 Summe: 7.15251 FID_MESSAGELOOP Anzahl der Aufrufe: 1 Durchschnittliche Laufzeit: 7.63952 Summe: 7.63952EndRender, speziell Present macht 94% der gesamten Zeit aus das kann doch kaum sein...
Nu wunder ich mich natürlich schon, wie das bei irrlicht soooo viel schneller geht...
mich da im code durchwurschteln bekomm ich nicht hin, zumal ich ja gar nichts mache mit dem deviceGibt es möglichkeiten, Present zu verschnellern oder so?
Hab in der Doku dazu nichts gefunden
-
vielleicht VSYNC an? Ausserdem ist deine Performance noch lange nicht "im Keller", das kannst du evtl. bei unter 10 fps sagen

-
Maxi schrieb:
EndRender, speziell Present macht 94% der gesamten Zeit aus das kann doch kaum sein...
Nu wunder ich mich natürlich schon, wie das bei irrlicht soooo viel schneller geht...
mich da im code durchwurschteln bekomm ich nicht hin, zumal ich ja gar nichts mache mit dem deviceGibt es möglichkeiten, Present zu verschnellern oder so?
Hab in der Doku dazu nichts gefundenPresent wartet, bis die Grafikkarte alle noch anstehenden Rendering-Aufgaben erledigt hat. Das hat also nichts direkt mit der Present-Methode zu tun, sondern mit dem, was Du renderst. Denk dran, dass die Grafikkarte im Hintergrund arbeitet und die Befehle nicht sofort ausführt, sondern sie in einen FIFO-Buffer schreibt (First in, first out) und dann abarbeitet. Wenn Dein Programm schneller ist als die Grafikkarte mit dem Rendern hinterherkommt, muss Present halt warten.
-
naja, aber wenn irrlicht nichts rendert, ist sie doch bei 170fps im fenster...
VSYNC kA, hab presentation_interval_default
-
DEFAULT heißt V-Sync eingeschaltet.
Wenn Du es ausschalten willst (=> Tearing-Effekt tritt auf!), nimm IMMEDIATE.
Ein Blick in die Dokumentation hätte Dir das alles erspart.
-
ich dachte im fenster geht nur default? Hab ich jedenfalls so verstanden in der doku
-
Dokumentation schrieb:
D3DPRESENT_INTERVAL_IMMEDIATE:
The runtime updates the window client area immediately and might do so more than once during the adapter refresh period. This is equivalent to using D3DSWAPEFFECT_COPY in DirectX 8.0. IDirect3DDevice9::Present operations might be affected immediately. This option is always available for both windowed and full-screen swap chains. See remarks.
-
TomasRiker schrieb:
Dokumentation schrieb:
[...]
Den kenn' ich! Is'n prima Kumpel!

-
So ist's.
Bye, TGGC (Demo or Die)