DX帧数的检测与设置

来源:互联网 发布:明星淘宝店铺链接 编辑:程序博客网 时间:2024/04/27 21:47

#define DIRECTINPUT_VERSION 0x0800

#include <d3dx9.h>
#include <dinput.h>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"dinput8.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"winmm.lib")

#include <string>
#include <tchar.h>
#include <sstream>
#include <cmath>
#include <ctime>
using namespace std;

#pragma warning(push)
#pragma warning( disable : 4996 )
#include <strsafe.h>
#pragma warning( default : 4996 )
#pragma warning(pop)

#ifdef _UNICODE
#define TSTRING wstring
#define TSSTREAM wstringstream
#else
#define TSTRING string
#define TSSTREAM stringstream
#endif

#ifndef SAFERELEASE
#define SAFERELEASE(s) if(s){s->Release();s=NULL;}
#endif

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define WINDOW_CLASSNAME TEXT("CLASS")
#define WINDOW_NAME TEXT("窗口")

HWND g_hWnd=NULL;
HINSTANCE g_hInstance=NULL;

LPDIRECT3D9             g_pD3D       = NULL;
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;


//游戏帧数
class CGameFPS
{
LPD3DXFONT m_pFont;
RECT m_rFontRect;
DWORD m_dwFrameCount;
float m_fTimeElapsed;
float m_fFps;
TCHAR m_szFpsStr[10];
public:
 explicit CGameFPS();
 virtual ~CGameFPS();
 BOOL InitializeFPS(void);
 void RenderFPS(float time);
};

CGameFPS::CGameFPS()
 :m_dwFrameCount(0)
 ,m_fTimeElapsed(0.0F)
 ,m_fFps(0.0F)
{
 m_pFont=NULL;
 memset(&m_rFontRect,0,sizeof(RECT));
 memset(m_szFpsStr,0,sizeof(m_szFpsStr));
}

CGameFPS::~CGameFPS(void)
{
 SAFERELEASE(m_pFont)
}

BOOL CGameFPS::InitializeFPS(void)
{
 if(FAILED(D3DXCreateFont(g_pd3dDevice,32,0,700,1,FALSE,
  DEFAULT_CHARSET,OUT_TT_ONLY_PRECIS,DEFAULT_QUALITY,
  DEFAULT_PITCH|FF_DONTCARE,TEXT("微软雅黑"),&m_pFont)))
  return FALSE;

 GetClientRect(g_hWnd,&m_rFontRect);

 return TRUE;
}

void CGameFPS::RenderFPS(float time)
{
 m_dwFrameCount++;
 m_fTimeElapsed+=time;
 if(m_fTimeElapsed>=1.0F)
 {
  m_fFps=m_dwFrameCount/m_fTimeElapsed;
  _stprintf(m_szFpsStr,TEXT("%f"),m_fFps);
  m_fTimeElapsed=0.0F;
  m_dwFrameCount=0;
 }
 m_pFont->DrawText(NULL,m_szFpsStr,-1,&m_rFontRect,DT_LEFT,D3DCOLOR_COLORVALUE(1.0F,0.0F,0.0F,1.0F));
}

//游戏帧数

CGameFPS* g_pFPS=NULL;

HRESULT InitD3D(void)
{
 if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
  return E_FAIL;

 D3DPRESENT_PARAMETERS d3dpp;
 ZeroMemory(&d3dpp,sizeof(d3dpp));
 d3dpp.Windowed=TRUE;
 d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
 d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
 d3dpp.EnableAutoDepthStencil=TRUE;
 d3dpp.AutoDepthStencilFormat=D3DFMT_D16;

 if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWnd,
  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  &d3dpp,&g_pd3dDevice)))
 {
  return E_FAIL;
 }

 g_pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
 g_pd3dDevice->SetRenderState(D3DRS_AMBIENT,0xFFFFFFFF);

 g_pFPS=new CGameFPS;
 g_pFPS->InitializeFPS();

 return S_OK;
}

VOID Cleanup()
{
 SAFERELEASE(g_pd3dDevice)
 SAFERELEASE(g_pD3D)
}

VOID Render(float time)
{
 if(NULL==g_pd3dDevice)
  return;

 g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0F,0);

 if( SUCCEEDED(g_pd3dDevice->BeginScene()))
 {
  // 开始渲染场景
  g_pFPS->RenderFPS(time);
  // 结束渲染场景
  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;
 case WM_KEYDOWN:
  switch(wParam)
  {
  case VK_ESCAPE:
   PostMessage(hWnd,WM_DESTROY,0,0);
   break;
  }
  break;
 }

 return DefWindowProc(hWnd,msg,wParam,lParam);
}

INT WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,INT)
{
 WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
  GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
  WINDOW_CLASSNAME,NULL};

 RegisterClassEx(&wc);

 HWND hWnd=CreateWindowEx(WS_EX_APPWINDOW,WINDOW_CLASSNAME,WINDOW_NAME,
  WS_OVERLAPPEDWINDOW,100,100,WINDOW_WIDTH,WINDOW_HEIGHT,
  NULL,NULL,wc.hInstance,NULL);

 g_hWnd=hWnd;
 g_hInstance=wc.hInstance;

 if(SUCCEEDED(InitD3D()))
 {
  ShowWindow(hWnd,SW_SHOWDEFAULT);
  UpdateWindow(hWnd);

  MSG msg;
  memset(&msg,0,sizeof(MSG));

  static float lastTime=(float)timeGetTime();

  while(msg.message!=WM_QUIT)
  {
   if(PeekMessage(&msg,0,0U,0U,PM_REMOVE))
   {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
   else
   {
    float currTime=(float)timeGetTime();
    float timeDelta=(currTime-lastTime)*0.001F;
    Render(timeDelta);
    lastTime=currTime;
    Sleep(30);
   }
  }
 }

 UnregisterClass(WINDOW_CLASSNAME,wc.hInstance);
 return 0;
}