游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7057|回复: 6

C++、DirectX,游戏FPS、读取内存里的纹理,交换链

[复制链接]

2

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2012-4-17 16:53:00 | 显示全部楼层 |阅读模式
本人是一名的小小实习生,最近在忙着做一个2D格斗游戏的毕业设计,一边上网找资料一边做,发现国内在这方面的资料不只是少,而且无用的信息也很多。偶然发现这个网站(这是个好网站,广告不多,虽然不华丽,但页面整洁、干净,很舒服),顿时觉得相见恨晚啊,马上注册了个号,想在这里扎根。


因为是第一次做游戏,用的是DirectX9.0,是菜鸟,有些问题要请教下(这些问题都很基础,别取笑我啊 [em6])

1、游戏的FPS:我用的方法是timeGetTime()%45==0,估计高手都知道问题所在了,可惜我不懂 [em6],话说我用这个方法有时候跑得很好,有时候却跑得非常非常慢(大概2、3秒一帧),百度了一下,说是timeGetTime获取的时间不准,可就算是不准,按理也不会这么慢。我想知道游戏里用什么方法去确定fps,还有timeGetTime方法的问题所在。

2、纹理加载:查阅过一些资料后,知道游戏里图片显示是从内存里读取图片纹理然后再“贴”到图元上的,可是,无论书上的还是网络上的,只讲了D3DCreateTextureFromFile从硬盘加载图片的方法,从内存加载的方法一点边都没沾上。我想知道具体怎么实现从内存加载纹理再贴到图元上的方法。

3、交换链:为了保证游戏运行流畅,一般做法是使用双缓冲绘图(甚至更多),这部分的资料虽然书上和网络上都有一些,但是限于资料太少了,只写了怎么获取后后背缓冲和Surface表面,但是怎么进行交换链交换却不健全,我想知道交换链该怎么去实现

问题暂时就是这些,目前游戏的进度虽然功能残缺,但至少能玩,对于第2、第3个问题,因为游戏程序本身少而小,格斗游戏中的人物g图片不停切换,就算不使用那两个技术玩起来也是没问题的,不过这是个毕业设计,怕太简单了不通过,所以还是想用稍微有技术的方法。

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2012-4-21 09:11:00 | 显示全部楼层

Re:C++、DirectX,游戏FPS、读取内存里的纹理,交换链

都是高技术,楼主请问怎么汉化游戏啊

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-4-21 12:35:00 | 显示全部楼层

Re: C++、DirectX,游戏FPS、读取内存里的纹理,交换链

CodingForGame: C++、DirectX,游戏FPS、读取内存里的纹理,交换链

本人是一名的小小实习生,最近在忙着做一个2D格斗游戏的毕业设计,一边上网找资料一边做,发现国内在这方面...


我是新手,以下回答仅供参考:
【问题1】
直接上代码:

  1. while (TRUE)
  2. {
  3.         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  4.         {
  5.                 if (msg.message == WM_QUIT)
  6.                         break;

  7.                 TranslateMessage(&msg);
  8.                 DispatchMessage(&msg);
  9.         }

  10.         // 帧开始
  11.         const int constFps = 60;
  12.         float timeInOneFps = 1000.0f/constFps;        // 每秒60帧,则1帧就是约16毫秒
  13.         DWORD timeBegin = GetTickCount();

  14.         MainLoop();

  15.         // 限帧
  16.         DWORD timeTotal = GetTickCount() - timeBegin;
  17.         if (timeTotal < timeInOneFps)
  18.         {
  19.                 Sleep(DWORD(timeInOneFps-timeTotal));
  20.         }
  21. }
复制代码



【问题2】
1:创建纹理
// IDirect3DDevice9* m_pD3DDevice;
// IDirect3DTexture9* m_pTexture = NULL;
D3DXCreateTexture(m_pD3DDevice, 400, 400, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pTexture);
2:填充像素到纹理

  1. bool CD3DTexture::SetPixel(const UINT* pSrcBmp32, int width, int height)
  2. {
  3.         D3DLOCKED_RECT lockedRect;
  4.         if (FAILED(m_pTexture->LockRect(0, &lockedRect, NULL, 0)))
  5.         {
  6.                 m_pTexture->UnlockRect(0);
  7.                 return false;
  8.         }

  9.         UINT* pSrc = (UINT*)pSrcBmp32;
  10.         BYTE* pDst = static_cast<BYTE*>(lockedRect.pBits) + (height-1) * lockedRect.Pitch;        // dx9是自上而下存储像素的,而pSrcBmp32是

  11.         for (int h=0; h<height; h++)
  12.         {
  13.                 memcpy(pDst, pSrc, sizeof(UINT)*width);
  14.                 pSrc+=width, pDst-=dstPitch;
  15.         }

  16.         m_pTexture->UnlockRect(0);
  17. }
复制代码


【问题3】
如果用的是DX9,就不用关心双缓冲了,只要知道,D3DPRESENT_INTERVAL_IMMEDIATE是不限帧,D3DPRESENT_INTERVAL_DEFAULT、D3DPRESENT_INTERVAL_ONE等是限帧(一般是固定的60PFS)。

2

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2012-4-22 00:30:00 | 显示全部楼层

Re:C++、DirectX,游戏FPS、读取内存里的纹理,交换链

找不到回复键.......
对于第二个问题,如果是这种方法,对于需要图片资源非常多的格斗游戏(例如我的那个毕业设计一个人物就要用到150多张),是不是就要在游戏一开始时就把所有图片都加载进去?

第三个,其实我想知道怎么在后背缓冲画图,然后把后背缓冲提交显示

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-4-22 16:52:00 | 显示全部楼层

Re: Re:C++、DirectX,游戏FPS、读取内存里的纹理,交换链

CodingForGame: Re:C++、DirectX,游戏FPS、读取内存里的纹理,交换链

找不到回复键.......
对于第二个问题,如果是这种方法,对于需要图片资源非常多的格斗游戏(例如我的那个毕...


有多少个精灵,就创建多少个纹理对象,
另外,DX9和ddraw以及GDI完全不一样,没有后台缓冲这个概念,因为他每一帧的渲染都要clear,直接画就行了。

2

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2012-4-22 20:13:00 | 显示全部楼层

Re: Re: Re:C++、DirectX,游戏FPS、读取内存里的纹理,交换链

微无渊: Re: Re:C++、DirectX,游戏FPS、读取内存里的纹理,交换链



有多少个精灵,就创建多少个纹理对象,
另外,DX9和ddraw以及GDI完全不一样,没有后台缓冲这个概念,因为他每一帧的渲染都要clear,直接画就行了。


啊?那我怎么看你另外一个帖子里有后台缓冲着东西

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-4-23 00:14:00 | 显示全部楼层

Re: Re: Re: Re:C++、DirectX,游戏FPS、读取内存里的纹理,交换

CodingForGame: Re: Re: Re:C++、DirectX,游戏FPS、读取内存里的纹理,交换链



啊?那我怎么看你另外一个帖子里有后台缓冲着东西


我是说在用DX来渲染的层面讲,是不用关心到后台缓冲的,DX9里的后台缓冲默认是不可读的,写更是不用想了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-28 12:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表