游戏开发论坛

 找回密码
 立即注册
搜索
查看: 24651|回复: 27

D3D下几种2D游戏制作方法的比较

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-10-27 10:29:00 | 显示全部楼层 |阅读模式
我原来一直以为ID3DXSprite效率是最低的,测试却出乎我的意料

大家看看吧,顺便帮我灌点水

http://bbs.chaosstars.com/dispbbs.asp?boardid=61&id=183

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2004-10-27 10:45:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

[转:http://bbs.chaosstars.com/dispbbs.asp?boardID=61&ID=183&page=1]


我使用了3种方法在D3D下制作2D的地图tile

1、VB模拟
2、ID3DXSprite
3、IDirect3DSurface9

我分别测试了3种方法下的地图尺寸100 * 100,tile大小10 * 10的帧速率

1:26fps
2:56fps
3:31fps

ID3DXSprite效率竟然是最高的

我简要说一下我的代码,大家看看有什么问题或者发现

第一种方法:
我生成的tile是由2个三角形组成的矩形,渲染的时候是每个tile单独渲染(我之所以这样做是想具有代表性,没有将所有的顶点放到一个流中,一起渲染),没有开灯光,顶点格式为(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1),渲染代码如下:
for (j=0; j<m_nHCount; j++)
{
  for (i=0; i<m_nWCount; i++)
  {
   m_pMapObj[j * m_nWCount + i].Render();
  }
}

第二种方式:
我生成了一个LPD3DXSPRITE对象,然后调用Draw渲染,没有使用坐标变换参数,代码如下:
m_pSprite->Begin(D3DXSPRITE_DONOTSAVESTATE);

for (j=0; j<m_nHCount; j++)
{
  for (i=0; i<m_nWCount; i++)
  {
   m_pMapObj[j * m_nWCount + i].Render();
  }
}

m_pSprite->End();

第三种方式:
我调用CreateOffscreenPlainSurface,然后D3DXLoadSurfaceFromFile装载图片,渲染的时候我先GetBackBuffer获得后备Surface,然后进行Surface循环拷贝
for (j=0; j<m_nHCount; j++)
{
  for (i=0; i<m_nWCount; i++)
  {
   m_pMapObj[j * m_nWCount + i].Render();
  }
}

我觉得里面有需要改进的地方,但不知道是不是真的能说明一些问题

还有一点就是我在Surface拷贝的时候,如果超出范围,D3D会提示错误,竟然需要手工做屏幕裁减

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2004-10-27 11:10:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

为什么要每个tile两个三角而不是整个屏幕用两个三角呢?

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2004-10-27 11:23:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

我画tile的地图也用的ID3DXSprite,开始是每帧都把每个块画一下,结果FPS很少超过60。
看来应该在载入时把地面画进一个缓冲区,然后整体的画,地图移动到一定距离再重画缓冲区。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2004-10-27 11:30:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

我这样做其实就是想比较
DrawPrimitive
Draw
UpdateSurface
三个接口函数的效率

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2004-10-27 13:53:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

怎么没有人发表看法呢,要是ID3DXSprite效率高,我就用这个了,嘿嘿

不过真受不了的是,为什么UpdateSurface函数如果超出屏幕范围就会显示错误呢?

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2004-10-27 13:57:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

//if (pt.x >= 0 && pt.x < GWIDTH && pt.y >= 0 && pt.y < GHEIGHT)
        hr = m_pD3DDev->UpdateSurface(m_pSF, &rc, m_pBSF, &pt);

如果我把 if 注释掉就会提示
Direct3D9: (ERROR) :Invalid dest rect specified. UpdateSurface failed
Direct3D9: (ERROR) :pRect doesn't fit inside the surface

难道我要手工进行屏幕裁减吗?

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2004-10-27 15:07:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

手工裁剪有什么不对

36

主题

382

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 2004-10-27 20:02:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

2d游戏么?
就用spirt吧。

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-10-28 00:16:00 | 显示全部楼层

Re:D3D下几种2D游戏制作方法的比较

我在C#、managed dx下,用ID3DXSprite(C#下叫Sprite)进行渲染,爆快,就算每屏有1000个图形,还是大于80FPS!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 20:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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