XNA教程(三)—— sprite绘制效率

本文详细介绍了XNA框架中SpriteBatch类的Alpha混合功能,包括AlphaBlend模式的工作原理、混合公式及其对性能的影响。此外,还探讨了两种控制绘制顺序的方法,以确保正确的视觉效果。

 作者:clayman
仅供个人学习使用,请勿转载,勿用于任何商业用途。
由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。
Blog:
http://blog.youkuaiyun.com/soilwork
clayman_joe@yahoo.com.cn  

虽然内容有所变动,但我的xna教程还会继续^_^
本文图片和部分文字来自
XNA Diaries
参考了其中两篇关于sprite alpha blend的文章

         SpriteBatch.begin 通过接受几个参数,来控制如何渲染 sprite 。参数 BlendMode 表示进行哪种模式的混合。 Xna 只提供了三种,也是最常见的混合模式:AlphaBlend Additive 以及 InverseColor 。这里,我们主要讨论 AlphaBlend
       AlphaBlend 根据当前 sprite alpha 通道中的值,对 sprite 颜色和帧缓冲中已存在的颜色进行混合。计算的公式为 finalColor = spriteColor * alpha + backgroundColor * alpha 。由于要查询缓冲中的当前颜色,因此, alpha 混合是一个相对较昂贵的操作。
       单有 SpriteBlendMode 并不能完全达到我们所希望的效果,当绘制多个图形时,还需按照一定的顺序绘制 sprite 才行。

         上面这张图片掩饰了 5 个半透明的环,按照不同顺序绘制时,所得到的结果,其中,后者是我们所期望的效果。左图中,我们最先绘制了中间的圆形,因此,它将和蓝色的背景混合,导致最终的效果有一条蓝边。而右图中,我们最后才绘制中央的圆形。
         有两种方法来控制 sprite 绘制顺序。第一种,使用 SpriteBatch.Draw depth 参数的重载,让计算机在绘制图形时根据 depth 值,为我们排序;第二种则是在我们自己编写代码来控制。
         当场景中有大量 sprite 时,第一种方法是不错的解决方案。为每个 sprite 都指定一个 depth ,当物体移动时,简单的改变它的深度,就能获得正确的效果,比如 2D 游戏中,让玩家从树后移动到树前。使用 SpriteBatch.begin sortMode 参数来指定从后到前,还是从前到后排序,通常情况下我们选择前者。
         另一种方法,侧需要我们自己安排绘图顺序,比如先绘制背景,然后游戏对象,接下来再绘制前方的遮挡物, UI 等等。当大量物体相互遮挡时,决定绘图顺序的逻辑可能会很复杂。但是,当场景不太复杂时,这是一种很高效的方法。
         到这里,就需要讨论一下几种混合模式下的效率:

Y 轴表示帧速率, X 轴表示 sprite 数量
         图中,红色是 SpriteBlendMode.None ,绿色是 SpriteBlendMode.AlphaBlend ,蓝色是 AlphaBlend 以及 SpriteSortOptions.BackToFront ,灰色是 SpriteSortOptions.FrontToBack
         可以看到,如果自己排序,那么在有大量( >500 )个 sprite 的时候,能获得相当不错的收益(当然,这里并未考虑我们手动排序的代价)。
         而如果使用 SpriteBatch 来进行排序,那么 sprite 数量最好不要超过 400 个。当然,如果不使用 alpha 混合,效率又会提高很多。
         当然,也许你还注意到了 SpriteSortOptions.FrontToBack 状态下性能异常的好,但不幸的是,这种方法通常不能创建正确的效果。
 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值