初学DirectX,网上N多资料和源码。
http://dx-engine.googlecode.com/svn/trunk
找了一篇源码作参考,只写了一个框架,可是FPS怎么也无法突破80,看有人的实例FPS动辄上万。于是开始查找原因,最终锁定CreateDevice的渲染结构体参数,借机全面深入了解了CreateDevice的渲染结构体参数。
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = 800; //分辨率
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //像素格式
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; //抗锯齿:无
d3dpp.MultiSampleQuality = 0; //抗锯齿等级
d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; //翻转方式:D3DSWAPEFFECT_DISCARD:一般用于全屏、每帧刷新;
//D3DSWAPEFFECT_FLIP:双缓冲
//D3DSWAPEFFECT_COPY:从后缓冲拷贝
//D3DSWAPEFFECT_COPY_VSYNC:从后缓冲拷贝并垂直同步,防止画面撕裂
d3dpp.hDeviceWindow = hWnd; //窗口句柄
d3dpp.Windowed = false; //是否全屏
d3dpp.EnableAutoDepthStencil = true; //是否有深度缓存和模板缓存
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; //深度缓存和模板缓存的格式
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; //刷新频率
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;//D3DPRESENT_INTERVAL_DEFAULT默认方式:不超过屏幕刷新率
//D3DPRESENT_INTERVAL_IMMEDIATE代表即时刷新 //D3DPRESENT_INTERVAL_ONE代表屏幕刷新率标准
1.PresentationInterval
FPS无法突破80原因就在PresentationInterval使用D3DPRESENT_INTERVAL_DEFAULT上,使用D3DPRESENT_INTERVAL_IMMEDIATE可以得到超高的FPS,但是超出屏幕刷新频率会造成各种画面显示问题,建议使用D3DPRESENT_INTERVAL_DEFAULT。
2. 像素格式
D3DFMT_R8G8B8 表示一个24位像素,从左开始,8位分配给红色,8位分配给绿色,8位分配给蓝色。
D3DFMT_X8R8G8B8 表示一个32位像素,从左开始,8位不用,8位分配给红色,8位分配给绿色,8位分配给蓝色。
D3DFMT_A8R8G8B8 表示一个32位像素,从左开始,8位为ALPHA通道,8位分配给红色,8位分配给绿色,8位分配给蓝色。
D3DFMT_A16B16G16R16F 表示一个64位浮点像素,从左开始,16位为ALPHA通道,16位分配给蓝色,16位分配给绿色,16位分配给红色。
D3DFMT_A32B32G32R32F 表示一个128位浮点像素,从左开始,32位为ALPHA通道,32位分配给蓝色,32位分配给绿色,32位分配给红色。
3. 深度缓冲格式
深度缓冲的格式决定着深度测试的精确性。一个24位的深度缓冲比16位的深度缓冲更精确。通常,应用程序在24位深度缓冲下就能工作的很好,但是Direct3D也同时支持32位的深度缓冲。
D3DFMT_D32 表示32位深度缓冲
D3DFMT_D24S8 表示24位深度缓冲并保留8位模版缓冲(stencil buffer)
D3DFMT_D24X8 表示24位深度缓冲
D3DFMT_D24X4S4 表示24位深度缓冲并保留4位模版缓冲
D3DFMT_D16 表示16位深度缓冲