Hi,
i am trying to make a little Engine by myself (my first steps in 3D)..D3D is amazing. But I have a little (big?) problem with the Framerates. I have a single textured Cube and the Framerates I get dont go above 25 on my GeForce2MX. The Direct3D Examples in the SDK are so much faster! I have tryed a lot...here is the Code of the D3D Init and the Renderloop. I hope you can see whats wrong. Thanks!!
The Direct3D Init-Part:
//3D Device init
HRESULT DX3D::InitialiseD3D(HWND hWnd)
{
g_Font = NULL;
//create D3D Object
g_pD3D = NULL;
g_pD3DDevice = NULL;
g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
if(g_pD3D == NULL)
{
error("DirectX 8.1 not found!");
}
//get Screenmode
D3DDISPLAYMODE d3ddm;
d3ddm.Format = CheckDisplayMode(resx,resy,32);
d3ddm.Width = resx;
d3ddm.Height = resy;
//Properties
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
if(ScreenMode == 1)
{
d3dpp.Windowed = TRUE;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
}
else
{
d3dpp.Windowed = FALSE;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.hDeviceWindow = hWnd;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
}
//pure HARDWARE
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, &d3dpp, &g_pD3DDevice)))
{
error("Your Card is not supported.");
}
//turn on Z-Buffer
g_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
//back face culling
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
//turn off Cursor
ShowCursor(false);
return S_OK;
}
//Mmethod for getting the displaymode
D3DFORMAT DX3D::CheckDisplayMode(UINT nWidth, UINT nHeight, UINT nDepth)
{
UINT x;
D3DDISPLAYMODE d3ddm;
for(x = 0; x < g_pD3D->GetAdapterModeCount(0); x++)
{
g_pD3D->EnumAdapterModes(0, x, &d3ddm);
if(d3ddm.Width == nWidth)
{
if(d3ddm.Height == nHeight)
{
if((d3ddm.Format == D3DFMT_R5G6B5) || (d3ddm.Format == D3DFMT_X1R5G5B5) || (d3ddm.Format == D3DFMT_X4R4G4B4))
{
if(nDepth == 16)
{
return d3ddm.Format;
}
}
else if((d3ddm.Format == D3DFMT_R8G8B8) || (d3ddm.Format == D3DFMT_X8R8G8B8))
{
if(nDepth == 32)
{
return d3ddm.Format;
}
}
}
}
}
return D3DFMT_UNKNOWN;
}
//Renderloop:
void Render()
{
char* fr = GetFrameRate();
if(ddo.g_pD3DDevice == NULL)
{
return;
}
//clear Backbuffer
ddo.g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x000000, 1.0f, 0);
//begin Frame
ddo.g_pD3DDevice->BeginScene();
/*Todo*/
//set camera & perpective
ddo.SetupCamera(playerpos_x,playerpos_y,playerpos_z);
ddo.SetupPerspective();
cube.rot_y+= 0.5f;
cube.posx = 81.7f;
cube.posy = 51.7f;
cube.posz = playerpos_z+5.5f;
cube.meshRender(0x3FFFFFFF);
//Textout
ddo.TextOut("FPS: ",10,10, 18);
ddo.TextOut(fr,50,10, 18);
//End the scene
ddo.g_pD3DDevice->EndScene();
//Hintergrundbuffer flippen
ddo.g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
[edited by - AxelFR on May 7, 2003 1:39:07 AM]