|
发表于 2012-4-21 12:35:00
|
显示全部楼层
Re: C++、DirectX,游戏FPS、读取内存里的纹理,交换链
CodingForGame: C++、DirectX,游戏FPS、读取内存里的纹理,交换链
本人是一名的小小实习生,最近在忙着做一个2D格斗游戏的毕业设计,一边上网找资料一边做,发现国内在这方面...
我是新手,以下回答仅供参考:
【问题1】
直接上代码:
- while (TRUE)
- {
- if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
- if (msg.message == WM_QUIT)
- break;
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- // 帧开始
- const int constFps = 60;
- float timeInOneFps = 1000.0f/constFps; // 每秒60帧,则1帧就是约16毫秒
- DWORD timeBegin = GetTickCount();
- MainLoop();
- // 限帧
- DWORD timeTotal = GetTickCount() - timeBegin;
- if (timeTotal < timeInOneFps)
- {
- Sleep(DWORD(timeInOneFps-timeTotal));
- }
- }
复制代码
【问题2】
1:创建纹理
// IDirect3DDevice9* m_pD3DDevice;
// IDirect3DTexture9* m_pTexture = NULL;
D3DXCreateTexture(m_pD3DDevice, 400, 400, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pTexture);
2:填充像素到纹理
- bool CD3DTexture::SetPixel(const UINT* pSrcBmp32, int width, int height)
- {
- D3DLOCKED_RECT lockedRect;
- if (FAILED(m_pTexture->LockRect(0, &lockedRect, NULL, 0)))
- {
- m_pTexture->UnlockRect(0);
- return false;
- }
- UINT* pSrc = (UINT*)pSrcBmp32;
- BYTE* pDst = static_cast<BYTE*>(lockedRect.pBits) + (height-1) * lockedRect.Pitch; // dx9是自上而下存储像素的,而pSrcBmp32是
- for (int h=0; h<height; h++)
- {
- memcpy(pDst, pSrc, sizeof(UINT)*width);
- pSrc+=width, pDst-=dstPitch;
- }
- m_pTexture->UnlockRect(0);
- }
复制代码
【问题3】
如果用的是DX9,就不用关心双缓冲了,只要知道,D3DPRESENT_INTERVAL_IMMEDIATE是不限帧,D3DPRESENT_INTERVAL_DEFAULT、D3DPRESENT_INTERVAL_ONE等是限帧(一般是固定的60PFS)。 |
|