游戏开发论坛

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

D3DXSPRITE多次begin-end对效率是不是影响很大?

[复制链接]

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2007-1-7 12:17:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

sprite会把begin和end之间绘制的图形做一个缓冲,
每次end的时候提交一次以提高速度,
所以一次begin/end对中设置的RanderState属性只有最后一次设置的有效,
因为它是作用于整个bedin/end之间缓存的图形的,
如果多次调用begin/end会使这个缓存机制失效,
而且每次begin的时候方法就像FlyMagic说的要改动一系列的参数,
设置驱动为不同的绘制环境,
因此不要多次调用begin/end,
而要把属性相同的图形放到一起渲染,
一般来说,
游戏中只要三个begin/end就可以了,
这三个bedin/end分别用来渲染关闭alpha,alpha乘,alpha加时的图形~~

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2007-1-7 13:55:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

Sprite的确会为在Begin-End之间所Draw的图形提供一个缓存,但是这个缓存仅是用来保存数据的(并且还提供一些排序操作等),但他并不能提高绘制的速度。多次Begin-End唯一所消耗CPU的就是Begin时设置环境。但这在数目少的时候可以忽略的。

根据要绘制的东西不同,可以适当地进行分类,对Begin-End进行简化,根据游戏不同,做法也不同。但是“一般来说,游戏中只要三个begin/end就可以了”这句话简直是胡说八道。Alpha混合只是Begin中设置环境的一种,还有N种其它的环境设置,怎么可能只要三个就足够了呢?再加上Sprite还有设置坐标变换、缩放、转换的功能用以绘制不同距离、状态的精灵,根据要绘制事物状态的不同,根本不可能将其缩略成几个Begin-End的大系。

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2007-1-7 15:44:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

我是说一般来说,
如果你想只靠d3dsprite来完成一个游戏,
好吧,
当我什么也没说好了,
另外,
对于缓存是否怎样提高绘制的速度的和怎样妥善使用这三对begin/end,
建议你去看看那些开源游戏引擎中sprite的实现(2D方面HGE是个很好的参考)

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2007-1-7 20:19:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

用来解决2D的游戏应用,Sprite显然已经很好了,它有什么理由不能完成一个游戏?
我现在没有时间去看游戏的引擎,对于Sprite的缓存是否能够提高速度我暂时相信你的观点,因为我的观点来自于SDK上面没有介绍关于缓存对于速度的影响。既然你看到了更多的东西,那么你应该是对的。

8

主题

553

帖子

560

积分

高级会员

Rank: 4

积分
560
发表于 2007-1-8 10:16:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

封建迷信。

20

主题

94

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2007-1-9 10:35:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

反复begin&end这样做显然会影响速度!
这就好比你给客户送货,begin就好比你敲门,等客户打开门你把货物送给他(绘制图像),客户关门就是end;你觉得给客户送一个东西先敲门给货物关门再敲开再给货物再关门再敲开这样好还是敲门一次把货物送给他关门好呢?计算机运算速度很快,开门交货关门的速度可以忽略不记,但是这不是一个程序员应该有的思路,养成良好的编程习惯很重要的吧。

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2007-1-9 17:18:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

在这种情况下,性能的提升是以程序的复杂度为代价的。一味地追求性能,也并不是编程的王道。在性能不能提升多少的情况下,优先选择降低程序的复杂度,使程序的规划更为合理,这才是正确的做法。对于每个应用,Begin-End都有不同的做法。因为这世界上很多时候都没有一劳永逸的解决方案!

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-1-9 17:37:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

FlyMagic有点过分,胡说都和真的一样。
我来告诉你什么叫做:他会尽可能把可以连接的顶点连起来绘制。
因为这个说到底都是DrawPrimitive。
d3d本身就是一个状态机。
begin是不是设置状态这个结论很明显不是。准确的说是通知sprtie要使用的渲染状态。
因为begin过之后d3d的renderstate没有任何变化,而是在具体的draw后才变化。
这说明每一次draw才去改变renderstate。
end是drawprimitive,这个也没任何问题。

尽可能把可以连接的顶点连起来绘制。你只看到了现象,画多少图有关,对,本质呢。
是受drawPrimitive限制的,因为一次只能用一副图片。在收到end之前,不更换图片绝对不会绘制多次,反之一更换图片就会立即绘制,缓存清空。


140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-1-9 17:41:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

楼上的图片泛指材质及渲染状态。
实际使用中,有时必须重新实现一个类似d3dxsprite的机制。
因为你自己写的可以配合其他引擎,d3dxsprite不行吧。

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-1-9 17:47:00 | 显示全部楼层

Re:D3DXSPRITE多次begin-end对效率是不是影响很大?

其实实际上只有三个接口。
DrawRect   将一个rect加入buffer,如果和buffer材质不同,先绘制并清除缓存。
DrawText   将一个text加入buffer,如果和buffer材质不同,先绘制并清除缓存。
ClearBuffer  绘制并清除缓存。
text和rect其实可以用一组缓存。text就是生成贴图再绘制rect。只需要比较材质就可以区分。


begin只是记录默认状态,实际上Rect和Text用的状态肯定不同,交错绘制的话你就明白为什么不能用begin来改变状态。

end是强制clearbuffer。

看不出来这东西用作2D游戏有什么复杂度。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 06:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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