FPS GENAU messen



  • Ich mache einen neuen Thread auf...
    Weil ich muss die Sache anders angehen.

    Ich bekomm es einfach nicht hin, eine schnelle und vor allem richtige FPS-Anzeige zu basteln.

    Warum funktioniert das zB nicht?

    currentTime = GetTickCount();
    	fps = 1000 / (1 / (currentTime - lastTime));
    
    	RenderRect();
    	showFPS(fps);
    
             m_pDevice->EndScene();
    
             m_pDevice->Present(NULL, NULL, NULL, NULL);
    
             lastTime = currentTime;
    

    Gibt zahlen irgendwo bei 16000 aus...

    Ist doch die Zeit pro Frame durch 1000, also wieviel Frames pro Sekunde möglich wären.

    Und ganz wichtig:

    Wie zeige ich die FPS zB. nur jede Sekunde an, damit man das Ganze auch lesen kann?



  • Habs jetzt so ausprobiert, zeigt aber maximal 70 FPS an.
    Wie kann man die WIRKLICHE Zahl berechnen?

    Hier meine Renderfunktion

    HRESULT Hauptklasse::Tick() 
    {
    	m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
    
        m_pDevice->SetMaterial(&m_Material);
        m_pDevice->SetTexture(0, m_pTexture);
    
        m_pDevice->BeginScene();
    
    	currentTime = GetTickCount();
    	elapsed = (currentTime - lastTime);
    
    	RenderRect();
    	if(elapsed >= 1000)
    	{
    		showFPS(frame);
    		lastTime = currentTime;
    		oldFrame = frame;
    		frame = 0;
    	}
    	showFPS(oldFrame);
    
        m_pDevice->EndScene();
    
        m_pDevice->Present(NULL, NULL, NULL, NULL);
    
    	frame++;
    
        return S_OK;
    }
    


  • vermutlich hast du die vertikale synchronisation aktiviert, sodass m_pDevice->Present auf den naechsten bildaufbau wartet.
    kann man entweder im treiber oder den d3dpresent-parametern abschalten.



  • Renderer schrieb:

    Habs jetzt so ausprobiert, zeigt aber maximal 70 FPS an.

    Woher weisst du, das 70 unwirklich ist? f'`8k

    Bye, TGGC (Das Eine, welches ist.)



  • currentTime = GetTickCount();
    fps = 1000 / (1 / (currentTime - lastTime));
    

    Sieht mir auf den ersten Blick so aus, als würdest du versehentlich Integer-Divison statt Gleitkomma-Division machen.

    Probier es mal mit:

    currentTime = GetTickCount();
    float fps = 1000.0f / (1.0f / (currentTime - lastTime));
    


  • Renderer schrieb:

    Und ganz wichtig:

    Wie zeige ich die FPS zB. nur jede Sekunde an, damit man das Ganze auch lesen kann?

    Jeden Schleifendurchlauf berechnest du deine FPS. Jetzt hast du noch eine Überprüfung, wie lange das letzte FPS-"Update" her ist. Mit FPS-Update meine ich, die aktuellen exakten FPS in eine andere Variable zu schreiben, die auf dem Bildschirm ausgegeben wird.

    Wenn letztes Update länger als 1 Sekunde her ist, update()

    TGGC schrieb:

    Renderer schrieb:

    Habs jetzt so ausprobiert, zeigt aber maximal 70 FPS an.

    Woher weisst du, das 70 unwirklich ist? f'`8k

    Wenn es konstant 70FPS sind, würde ich schon stark darauf tippen, dass die Grafikkarte nicht volle Leistung bietet.



  • Wie funktioniert das, die VSYNC abzuschalten? Kenne mich da nicht aus.

    So, mit diesem Code werden nun etwa 16000.000 FPS ausgegeben:

    HRESULT Hautpklasse::Tick() 
    {
    	m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
    
        m_pDevice->SetMaterial(&m_Material);
        m_pDevice->SetTexture(0, m_pTexture);
    
        m_pDevice->BeginScene();
    
    	currentTime = GetTickCount();
    	float fps = 1000.0f / (1.0f / (currentTime - lastTime));
    
    	RenderRect();
    	showFPS(fps);
    
        m_pDevice->EndScene();
    
        m_pDevice->Present(NULL, NULL, NULL, NULL);
    
    	lastTime = currentTime;
    
        return S_OK;
    }
    

    Ich rendere nur ein kleines Rechteck mit einer billigen Textur. Ich schätze auf 2500 FPS mit einer X1900XTX.

    hmm...



  • So funktioniert es ja halbwegs, ABER: Es werden immer nur 70 FPS angezeigt...
    Es müssten doch viel mehr sein 😞

    Meine Init:

    HRESULT Hauptklasse::Init(const GLOBALS &g)
    {
    
    	D3DPRESENT_PARAMETERS pp;
    	pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    
    	D3DFORMAT d3dfmt;
    	if(g.fullScreen) 
    		d3dfmt = D3DFMT_X8R8G8B8;
        else 
    		d3dfmt = D3DFMT_UNKNOWN;
    
        m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    
        m_PP.Windowed = !g.fullScreen;
        m_PP.hDeviceWindow = hWnd;
        m_PP.SwapEffect = D3DSWAPEFFECT_DISCARD;
    
        m_PP.EnableAutoDepthStencil = true;
        m_PP.AutoDepthStencilFormat = D3DFMT_D16;
    
        m_PP.BackBufferFormat = d3dfmt;
        m_PP.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);
    	m_PP.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);
    
        m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_PP, &m_pDevice);
    
        D3DCOLORVALUE clr = { 1.0f, 1.0f, 1.0f, 1.0f };
        D3DXMATRIX xmat;
    
        m_Material.Diffuse = clr;
        m_Material.Ambient = clr;
    
        D3DXMatrixPerspectiveFovLH(&xmat, 0.8f, 1280/1024, 0.5f, 1000.0f);
    
        m_pDevice->SetTransform(D3DTS_PROJECTION, &xmat);
        m_pDevice->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_XRGB(255,255,255));
    
    	D3DXCreateTextureFromFile(m_pDevice, "texture.bmp", &m_pTexture);
    
    	D3DXCreateFont(m_pDevice, 50, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, g_strFont, &g_pFont);
    
    	CreateRect();
    
        return S_OK;
    }
    

    Und das Frame:

    HRESULT Hautpklasse::Tick() 
    {
    	m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
    
        m_pDevice->SetMaterial(&m_Material);
        m_pDevice->SetTexture(0, m_pTexture);
    
        m_pDevice->BeginScene();
    
    	if(GetTickCount() - tick >= 1000)
    	{
    		tick = GetTickCount();
    		fps = frame;
    		frame = 0;
    	}
    
    	RenderRect();
    
    	showFPS(fps);
    
        m_pDevice->EndScene();
    
        m_pDevice->Present(NULL, NULL, NULL, NULL);
    
    	frame++;
    
        return S_OK;
    }
    


  • Anzeigen tue ich den Text so:

    sprintf( szMsg, TEXT("FPS: %0.3f"), fps);
    
    	SetRect( &rc, 10, 10, 0, 0 );        
        g_pFont->DrawText( NULL, szMsg, -1, &rc, DT_NOCLIP, D3DCOLOR_ARGB(255,255,255,0));
    

    Gibt es eine SCHNELLERE Möglichkeit, eine Variable anzuzeigen?



  • Renderer schrieb:

    So funktioniert es ja halbwegs, ABER: Es werden immer nur 70 FPS angezeigt...
    Es müssten doch viel mehr sein 😞

    Weil? f'`8k

    Bye, TGGC (Das Eine, welches ist.)



  • Weil ich eine X1900XTX, nen AMD 64 X2 4400+ und 2GB Ram habe.

    Außerdem waren es ja auch 70 FPS, wo NICHTS gerendert wurde. Höchstens schwarzer buffer.

    Naja, nach deaktivieren von VSYNC sind es knapp 4000 FPS 😉



  • Renderer schrieb:

    Weil ich eine X1900XTX, nen AMD 64 X2 4400+ und 2GB Ram habe.

    Außerdem waren es ja auch 70 FPS, wo NICHTS gerendert wurde. Höchstens schwarzer buffer.

    Naja, nach deaktivieren von VSYNC sind es knapp 4000 FPS 😉

    Na dann waren es vorher doch 70, du Drops. Ausserdem ist meiner viel länger. f'`8k

    Bye, TGGC (Das Eine, welches ist.)



  • Ja mit aktiviertem VSYNC waren es 70 FPS, ist ja klar bei 70Hz.

    Moron...



  • //edit


Anmelden zum Antworten