DDraw在不渲染任何东西的情况下,极限速度能够达到多少FPS?(未测试过的不要回答)
这里的“不渲染任何东西”指的是:
仅通过FillRect清空一次后台缓冲,然后再绘制一个FPS文本,然后便将后台缓冲blt到前台,
并且不做任何优化,同时假设窗口大小为1024×768
在此前提下,极限速度能够达到多少FPS??
我的测试结果是100~130帧,而且在3台机器上测试过,均是如此(这3台机器的显卡水平依次为:GeForce 8500GT、GeForce 9400GT、GeForce 220)
另外再透露一下,如果把"后台缓冲blt到前台"这个步骤去掉,那么FPS可以达600多,瓶颈正在于此处。
再声明一下:未测试过的朋友希望不要回答。
[解决办法]
跟分辨率和位深都有关系,32位比16位要慢不少,单核跟双核也不一样,双核有时候强制降低fps。
1024*768差不多在我的机器上是1000左右吧,单核2.66G。你提供的三台机器数据毫无用处,这根本
用不到显卡。
[解决办法]
修改下你的代码。
初始化最好用com方式,ddraw.lib现在很难找了。
ddrawcreateEX改为
HRESULT g_DDVal=CoCreateInstance(CLSID_DirectDraw7,NULL, CLSCTX_ALL, IID_IDirectDraw7, (void**)&g_DDrawInfo.m_pDirectDraw7); if(S_OK!= g_DDVal) { return FALSE; } g_DDVal=g_DDrawInfo.m_pDirectDraw7->Initialize(NULL); if(g_DDVal!=S_OK){ return false; }
[解决办法]
你的这段代码我在32位下是260,16位是500左右。
[解决办法]
//用这段代码替换掉那段(你知道的)就会快很多
// 渲染FPS
{
DDBLTFX ddbx;
ddbx.dwFillColor = 0;//ConvertGDIColor(dwColor);
RECT dstRect = { 0, 0, g_DDrawInfo.m_ScreenWidth, g_DDrawInfo.m_ScreenHeight };
g_DDrawInfo.m_pDDBackSurface->Blt(&dstRect,NULL,NULL,DDBLT_COLORFILL,&ddbx);
HDC hDC;
g_DDrawInfo.m_pDDBackSurface->GetDC(&hDC);
SetTextColor(hDC, 0xffffff);
SetBkColor(hDC, 0x000000);
static char szFPS[64] = { 0 };
TextOutA(hDC, 5, 5, szFPS, strlen(szFPS));
// 计算FPS
{
static UINT fpsNum = 0;
static DWORD dwLastFPSTime = 0;
DWORD curTime = GetTickCount();
if (curTime-dwLastFPSTime > 1000)
{
wsprintfA(szFPS, "FPS: %d", fpsNum);
dwLastFPSTime = curTime;
fpsNum = 0;
}
else
{
fpsNum++;
}
}
g_DDrawInfo.m_pDDBackSurface->ReleaseDC(hDC);
}
EndRender();
[解决办法]
POINT posBase = { 0, 0 };
::ClientToScreen(g_DDrawInfo.m_hWnd, &posBase);
RECT srcRect = { 0, 0, g_DDrawInfo.m_ScreenWidth, g_DDrawInfo.m_ScreenHeight };
RECT dstRect = { posBase.x, posBase.y, posBase.x+g_DDrawInfo.m_ScreenWidth, posBase.y+g_DDrawInfo.m_ScreenHeight };
在 WM_MOVE 触发时运行
[解决办法]
如果不需要手写页面DDSCAPS_SYSTEMMEMORY替换成 DDSCAPS_VIDEOMEMORY会更快,在我的机器上16位是1400
32位是700
[解决办法]
用颜色填充替代你的画刷gdi填充会快很多这个是肯定不会错的,用directdraw唯一必须要用gdi的就是textout
11楼的意思是页面默认使用显存,你在仔细检查一下代码吧!BeginRender(0xC9C9C9);这行有没有去掉,我使用directdraw好多年了。你仔仔细细看一下ddutil.h的源码。ConvertGDIColor(dwColor);这步我省略了。
如果你也觉得directdraw不错,我现在正在写一个小游戏,有兴趣大家一起做。我保证你会觉得写游戏其实很简单,qq653811224,我不是经常上网。
[解决办法]
有的代码在窗口移动时运行就可以了,不需要每帧都做。
[解决办法]
FPS 不是越小越好吗?
60为标准
30为最佳?
莫非真的是我弄错了?
[解决办法]