暴米花 发表于 2006-12-21 12:34:00

[Clayman的专栏]中文XNA教程(三)——sprite绘制效率

<p>作者:clayman<br/>仅供个人学习使用,请勿转载,勿用于任何商业用途。<br/>由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。<br/>Blog:http://blog.csdn.net/soilwork<br/>clayman_joe@yahoo.com.cn&nbsp; </p><p>虽然内容有所变动,但我的xna教程还会继续^_^<br/>本文图片和部分文字来自XNA Diaries,参考了其中两篇关于sprite alpha blend的文章</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpriteBatch.begin通过接受几个参数,来控制如何渲染sprite。参数BlendMode表示进行哪种模式的混合。Xna只提供了三种,也是最常见的混合模式:AlphaBlend、Additive以及InverseColor。这里,我们主要讨论AlphaBlend。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AlphaBlend根据当前sprite alpha通道中的值,对sprite颜色和帧缓冲中已存在的颜色进行混合。计算的公式为finalColor = spriteColor * alpha + backgroundColor * alpha。由于要查询缓冲中的当前颜色,因此,alpha混合是一个相对较昂贵的操作。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单有SpriteBlendMode并不能完全达到我们所希望的效果,当绘制多个图形时,还需按照一定的顺序绘制sprite才行。<br/></p><p><img src="http://www.xnacn.net/UpFile/UpAttachment/2006-9/2006923231325.png" border="0" alt=""/></p><p>作者:clayman<br/>仅供个人学习使用,请勿转载,勿用于任何商业用途。<br/>由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。<br/>Blog:http://blog.csdn.net/soilwork<br/>clayman_joe@yahoo.com.cn&nbsp; </p><p>虽然内容有所变动,但我的xna教程还会继续^_^<br/>本文图片和部分文字来自XNA Diaries,参考了其中两篇关于sprite alpha blend的文章</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpriteBatch.begin通过接受几个参数,来控制如何渲染sprite。参数BlendMode表示进行哪种模式的混合。Xna只提供了三种,也是最常见的混合模式:AlphaBlend、Additive以及InverseColor。这里,我们主要讨论AlphaBlend。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AlphaBlend根据当前sprite alpha通道中的值,对sprite颜色和帧缓冲中已存在的颜色进行混合。计算的公式为finalColor = spriteColor * alpha + backgroundColor * alpha。由于要查询缓冲中的当前颜色,因此,alpha混合是一个相对较昂贵的操作。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单有SpriteBlendMode并不能完全达到我们所希望的效果,当绘制多个图形时,还需按照一定的顺序绘制sprite才行。<br/></p><p><img src="http://www.xnacn.net/UpFile/UpAttachment/2006-9/200692323143.png" border="0" alt=""/></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图中,红色是SpriteBlendMode.None,绿色是SpriteBlendMode.AlphaBlend,蓝色是AlphaBlend以及SpriteSortOptions.BackToFront,灰色是SpriteSortOptions.FrontToBack。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以看到,如果自己排序,那么在有大量(&gt;500)个sprite的时候,能获得相当不错的收益(当然,这里并未考虑我们手动排序的代价)。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而如果使用SpriteBatch来进行排序,那么sprite数量最好不要超过400个。当然,如果不使用alpha混合,效率又会提高很多。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然,也许你还注意到了SpriteSortOptions.FrontToBack状态下性能异常的好,但不幸的是,这种方法通常不能创建正确的效果。</p>
页: [1]
查看完整版本: [Clayman的专栏]中文XNA教程(三)——sprite绘制效率