XNA教程(三)—— sprite绘制效率
来源:互联网 发布:win10软件如何卸载 编辑:程序博客网 时间:2024/05/06 21:34
作者:clayman
仅供个人学习使用,请勿转载,勿用于任何商业用途。
由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。
Blog:http://blog.csdn.net/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状态下性能异常的好,但不幸的是,这种方法通常不能创建正确的效果。
- XNA教程(三)—— sprite绘制效率
- (转)XNA教程(三)—— sprite绘制效率
- xna教程(四)——在xna中绘制字体
- XNA基础(02) —— 绘制基础
- XNA教程(一)
- XNA学习笔记——线、三角形的绘制
- XNA Kick Start (三)
- XNA教程(二)—— Into the 2D World
- 马宁的Windows Phone 7开发教程(4)——XNA显示中文字体
- XNA游戏开发之(三)——使用IsRunningSlowly
- WP7平衡球游戏开发教程(三)--DebugDraw(XNA渲染)
- WP 平衡球游戏开发教程(三) -DebugDraw(XNA渲染)
- XNA“效率”探索——一个简单的繁花曲线程序
- 游戏中的三角学——Sprite Kit 和 Swift 教程(1)
- 游戏中的三角学——Sprite Kit 和 Swift 教程(2)
- XNA学习笔记——2D屏幕中绘制线条
- XNA入门(三)灯光和材质
- 马宁的Windows Phone 7开发教程(3)——XNA下使用MessageBox和软键盘
- XMLHTTP在服务端和客户端的差别
- “国际软件自由日”介绍
- 精英问题,大家没事可以做一做
- 凤舞天骄新手卡领装备
- C#中使用SQLDMO.Database.ExecuteImmediate执行SQL脚本(可用于新建表、视图)
- XNA教程(三)—— sprite绘制效率
- Ruby 字符串 Frozen 和 unfreeze 的问题
- sql 基本语句
- 推荐一个ABAP的基本问题解答的网站(很全的)
- 为什么在后台添加了文章,前台只能看到标题?
- php 最重要的东西 代码
- 新网好象挂了,中国20%的域名将无法正常解析
- 两代人不同的求学之路
- 转发三层之客户端层