游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2418|回复: 4

关于Effect的效率问题,每个人都会遇到的问题。

[复制链接]

1

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2010-7-23 20:11:00 | 显示全部楼层 |阅读模式
Effect->BeginPass( 0 );
for( int i = 0; i<object.Size( ); i++ )
{
       Effect->SetMatrix(hMatrix, &object->GetWorldMatrix( ) ); // 这里改变每个模型的世界矩阵
       Effect->CommitChanges( );
       object->render( );
}
Effect->EndPass( );

=========================

for( int i = 0; i<object.Size( ); i++ )
{
     Effect->SetMatrix(hMatrix, &object->GetWorldMatrix( ) ); // 这里改变每个模型的世界矩阵
     Effect->BeginPass( 0 );
     object->render( );
     Effect->EndPass( );
}

============================

上面这两种方式,哪种效率更高呢?

对于BeginPass和CommitChanges我在网络上查找到了一些信息,这是SDK里没有提到的。下面是几种说法。

一种说法是:
BeginPass()会更新所有的state,CommitChange()只提交BeginPass()后修改过的。

另一种说法是:
BeginPass()会更新所有的state,CommitChange()没修改过的参数也会重新提交。

44

主题

248

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2010-7-24 00:26:00 | 显示全部楼层

Re:关于Effect的效率问题,每个人都会遇到的问题。

从c++角度出发,不考虑优化的情况下 函数调用是有开销的,所以,应该不用我说了
从dx9角度出发,dx9的api调用都伴随有很多状态监测,冗余检测,所以这也很明了

第二种说法不对,CommitChange从字面理解你应该知道是什么意思。如果2个函数都是重新提交,干嘛还要还要有CommitChange这个函数呢?

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2010-7-24 00:34:00 | 显示全部楼层

Re:关于Effect的效率问题,每个人都会遇到的问题。

看上面的例子,第一个是先在后台修改所有的特效以后,再重新渲染,第二个是一边修改,一边渲染,感觉第二个会降低fps

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2010-7-24 11:48:00 | 显示全部楼层

Re:关于Effect的效率问题,每个人都会遇到的问题。

1. 第一种快,而且快很多
2. 关于commitChange,你可以自己写个程序,用pix测试
3. 如果你非常,非常,非常关心性能,应该直接解析constant table,用SetxxxxxShaderConstant更新参数

1

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2010-7-24 21:42:00 | 显示全部楼层

Re:关于Effect的效率问题,每个人都会遇到的问题。

很感谢几位大大的回答,我也做了一些测试,发现第一种更快。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 11:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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