游戏开发论坛

 找回密码
 立即注册
搜索
楼主: feicheng99

3000个粒子就跑不动了 这正常吗?

[复制链接]

29

主题

405

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2007-1-25 21:00:00 | 显示全部楼层

Re:3000个粒子就跑不动了 这正常吗?

另外DUP也不是那么低效的,在某种情况下效率会更高,比如画bsp tree,quadtree,用DUP会更快.
原理嘛,我觉得是CPU和GPU的合作不当造成的,在规模比较大的情况下,如果把数据全部一次性的处理好,再传到渲染管线的话,那么在CPU处理这些数据的时候GPU可能闲着.所以可以边处理,边渲染,当然DP也可以做到,不过效率要低点.

每样东西存在都有他存在的理由,对吧.

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-1-25 22:40:00 | 显示全部楼层

Re: Re:3000个粒子就跑不动了 这正常吗?

月下临风: Re:3000个粒子就跑不动了 这正常吗?

另外DUP也不是那么低效的,在某种情况下效率会更高,比如画bsp tree,quadtree,用DUP会更快.
原理嘛,我觉得是...

D3D DUP 内部的实现方式决定了 DUP 永远不会比 DP\DIP 快,我不知道你的这个结论是怎么得出来的。

9

主题

198

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2007-1-26 04:53:00 | 显示全部楼层

Re: Re:3000个粒子就跑不动了 这正常吗?

feicheng99: Re:3000个粒子就跑不动了 这正常吗?

_vertices.resize(32000);
for(int i=0;i<_vertices.size();i++)
{
     _vertices  ...............

vector的效率要比数组相差甚远,以下是在vector中重载[]的代码:
#define _SCL_SECURE_VALIDATE_RANGE(cond)                                        {                                                                                                                        if (!(cond))                                                                                        {                                                                                                                        _ASSERTE((#cond, 0));                                                                        _SCL_SECURE_OUT_OF_RANGE_NO_ASSERT;                                        }                                                                                                                __analysis_assume(cond);                                                        }

reference operator[](size_type _Pos)
{        // subscript mutable sequence
_SCL_SECURE_VALIDATE_RANGE(_Pos < size());
return (*(_Myfirst + _Pos));
}

可以看出这个比数组[]调用多了判断index是否溢出的操作。当你在察看汇编语言的时候,你会发现vector要比数组多了很多的操作。在数量小的情况下可能看不出来,但是数量很多的情况下,那么当然效率就会有很大差异。对于速度要求比较高的应用中,stl是没有办法胜任的。这就是在很多游戏中没有使用stl的原因。stl保证的是安全的访问内存,而不是保证最快的访问速度。

29

主题

405

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2007-1-26 13:31:00 | 显示全部楼层

Re:3000个粒子就跑不动了 这正常吗?

13楼说"永远",我到很感兴趣这个结论是怎么来的.
14楼的结论"stl保证的是安全的访问内存,而不是保证最快的访问速度。"我实在不敢苟同.
stl什么时候变成保证安全访问内存了?我用了3,4年了从来不觉得它很安全.我怀疑你可能被那些宏给迷惑了,估计你是在debug下做开发的,放到release下面,很多宏就不起作用了,这种判断安全的宏更是多此一举,更重要的是release下inline的效果才得到发挥.用的好,效率和自己写差不多快.
回楼上的,关于这个嘛,其实没什么大不了的,用过有点体会就好了.
1万个粒子你每帧都要做深度排序?O, My God!

我说错了一点,list+dynamic vb不是最好的,因我是从用固定管线的思维方式去考虑的,马肝兄说的方法更好点.

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2007-1-26 18:59:00 | 显示全部楼层

Re:3000个粒子就跑不动了 这正常吗?

顶啦

9

主题

198

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2007-1-26 19:23:00 | 显示全部楼层

Re: Re:3000个粒子就跑不动了 这正常吗?

月下临风: Re:3000个粒子就跑不动了 这正常吗?

13楼说"永远",我到很感兴趣这个结论是怎么来的.
14楼的结论"stl保证的是安全的访问内存,而...

当然在release和debug情况下,vector与array的性能差距是很大。这个大家没有异议。可能没有准确地说明我所要讲的意思,这里所说的安全访问内存指的是做临界检查,这个是debug必需的。作为release版本有很多这样的检查都会失效,因为没有必要作这样的检查,数组溢出这样的bug应该在debug阶段完成。vector的好处就在它的灵活性,和动态改变数组的大小。在游戏中如果你有很多的引用在这一片动态数组中,那么程序就会变得很不安全。
在游戏中,大部分的数据都已经知道大小,例如顶点数。。。所以使用array是首选。
如果是做粒子系统,那么使用内存池。商业游戏中,尤其是视频游戏中,很少使用stl,几乎没有。

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2007-1-26 22:24:00 | 显示全部楼层

Re:3000个粒子就跑不动了 这正常吗?

商业游戏很少用STL吗?我还以为很多游戏里用呢。能否举几个例子?

4

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2007-1-26 23:34:00 | 显示全部楼层

Re:3000个粒子就跑不动了 这正常吗?

马肝 所说的shader + const来做,是什么意思呢?
粒子系统我是每一帧update一下粒子的颜色,大小和轨迹,并且每帧把所有粒子都更新到static vb,再调用一次DIP把所有的粒子绘画出来。

9

主题

198

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2007-1-26 23:44:00 | 显示全部楼层

Re: Re:3000个粒子就跑不动了 这正常吗?

ricohcanon: Re:3000个粒子就跑不动了 这正常吗?

商业游戏很少用STL吗?我还以为很多游戏里用呢。能否举几个例子?

在游戏资源工具的编程中,可以使用stl。但是在实时游戏中,stl很少使用。几乎所有的视频游戏(xbox360,ps3,wii),还有大部分速度优先的pc游戏。当然ps3,wii的支持库中并不提供stl。

如果反汇编stl部分的程序,就会发现要比数组的访问要多一些指令。(无论是debug/release)。

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-1-26 23:52:00 | 显示全部楼层

Re:3000个粒子就跑不动了 这正常吗?

再整个粒子LOD应该还要快很多。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 09:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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