游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4908|回复: 10

为什么我的DrawPrimitive这么慢?

[复制链接]

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2007-2-28 01:29:00 | 显示全部楼层 |阅读模式
正在做一个粒子系统,每一桢更新所有粒子的四个顶点,然后一起加入一个vertex buffer,然后用一次DrawPrimitive(D3DPT_TRIANGLELIST, 0, num)全部画出来,结果发现竟然只能显示1000多个粒子,也就是2000多个三角形,再多桢数就不能忍受了。我想应该不是别的地方效率不够,我只要把DrawPrimitive注释掉就可以跑的飞快。
我的配置应该很不错了,p4 2.4G,1g内存,geforce6600GT的显卡。查了几天,不知道哪里有问题,真是郁闷。还望高手指点!另外祝大家新年快乐!


相关代码如下:

vertex buffer的创建:
pDev->CreateVertexBuffer(
        50000 * sizeof(ColorVertex), //50000是随编写的最大值
        D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
        FVF,
        D3DPOOL_DEFAULT,
        &particalQuad,
        0);
lock:
particalQuad->Lock(0, offset * sizeof(ColorVertex), (void**)&bww, D3DLOCK_DISCARD);
memcpy( bww, bw, offset * sizeof(ColorVertex) );
//bw是存放在内存里面的数据
particalQuad->Unlock();       
lpDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, num);

[em20] [em20] [em20]

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-2-28 09:00:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

其它的没时间看了,上班了,
首先的一点:D3DUSAGE_DYNAMIC,不要用这个标志,伤效率。只有你需要经常性读VB数据的时候才应该用,只写的话就别用了,一个WRITEONLY就可以的。
然后是:D3DLOCK_DISCARD,直接用0,DISCARD没必要。

97

主题

590

帖子

590

积分

高级会员

Rank: 4

积分
590
QQ
发表于 2007-2-28 09:02:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

SetStreamSource
SetFVF呢
你把VERTEX BUFFER弄小点看看,还有trainglelist是绘制的三角形个数,不是顶点数

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2007-2-28 11:37:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

to noslopforever:
这些我都试过了,刚才又试了一下,还是不行:(

to 怪盗基德:
#define FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE| D3DFVF_TEX1)
lpDevice->SetTexture(0,pt->tex);
lpDevice->SetStreamSource(0, particalQuad, 0, sizeof(ColorVertex));
lpDevice->SetFVF(FVF);

VERTEX BUFFER我也弄小过,但一个三角形用trainglelist的话就需要三个顶点,一个粒子就是6个,3000个粒子的话也要18000的buffer呢,试了一下还是不行。是三角形个数,这个我也注意了。

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-2-28 11:51:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

LZ,我说了没时间看的,只是这几个地方肯定会影响效率,应该注意。
转自CSDN的一篇回帖,希望有所帮助。
fannyfish() ( ) 信誉:100    Blog  2007-02-27 09:22:27  得分: 0  


   可能有几种原因:
1, 填充率。 在楼主DEMO里面每个粒子是否包含很多象素?  比如CS里的烟雾弹,粒子数目很少, 但摄像机离近了帧率也会下降。
2, CPU-GPU之间的带宽。 看楼主的描述, 粒子系统的物理运算是在CPU上完成的, 那么需要不断Lock、 Unlock VertexBuffer。

解决方法:
减少Lock、Unlock次数;精减VertexBuffer大小;使用多流; 将部分物理运算放到GPU上运算;  设计粒子时避免出现摄像机前大片粒子的情况。
  

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2007-2-28 12:25:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

谢谢,经你这么一说,我才注意到我的粒子纹理是128*128的 -_-b
改成16*16之后就好了。竟然一直都没有想到是这个问题。。真是太感谢了,终于可以睡个好觉了。。呵呵

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-2-28 12:40:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

呵呵,别谢我,谢fannyfish吧

3

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2007-2-28 13:08:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

提醒你几点
第一.用4个顶点表达粒子是老式的做法,用point只要一个顶点,
第二.前面老兄说的用WriteOnly是对的
第三,不要全部填写了数据后再RENDER,而应当边填写边Render,具体请仔细看DX的sampleointSprites
我的粒子数目是几万个数量级的那.

那么多的人不认真看DX的文档和sample就乱提问,别学他们

14

主题

245

帖子

256

积分

中级会员

Rank: 3Rank: 3

积分
256
QQ
发表于 2007-2-28 18:39:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

如果是粒子系统的话,建议使用PointSprite实现。现在的主流显卡都肯定支持PointSprite

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2007-2-28 20:33:00 | 显示全部楼层

Re:为什么我的DrawPrimitive这么慢?

谢谢楼上两位帮忙:)
to NudePaladin:
你的第三点是不是说应该将vertex buffer分段,每当写入的粒子到达一定量(如1000)后进行一次DrawPrimitive,然后再偏移base?

另外我也曾想过用PointSprite,但是PointSprite可以旋转粒子吗?我看了文档,但没见用过,所以暂时没敢用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 15:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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