Clayman的专栏

It's all about XNA & GPU Programming

用户操作
[即时聊天] [发私信] [加为好友]
claymanID:soilwork
192561次访问,排名381好友0人,关注者13
soilwork的文章
原创 85 篇
翻译 15 篇
转载 0 篇
评论 330 篇
clayman的公告
嘿嘿 ^o^....
最近评论
kwlong2008:我是做网站建设的,来看看你的空间,不错,欢迎踩我的网站制作空间!
jym5596337:我也不知道我怎么就走到了你的路上来了呵呵...
太晕了,我们专业就学的C#... 那我就凑合着用它学习MDX喽,但到了2008你的这个时期,感觉形式有点尴尬,以前的人说 在中国搞软件是 前有微软,后有盗版。
现在是 前有XNA后有C++ ... MDX 学习资料太太太难找了。。太太太少了。 师兄给介绍下你学历路途中的资料目录咯。。。我好找来学习咯。。 感谢哦感谢。。
jym5596337:好象没有继续哇 ...
shapin:ATI的网站有个支持HLSL语法高亮的vs插件,可以支持其他版本,只要修改相应的那个注册表就行
flip:To linxv :
貼圖座標有用投影嗎?
文章分类
收藏
    相册
    blogs
    David Weller
    nVidia Developer blog
    Rico Mariani
    Shawn Hargreaves
    XNA Team blog
    XNA资源
    XNA Creators Club
    ZBuffer
    Ziggyware XNA Resources
    中国XNA开发网
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 XNA教程(三)—— sprite绘制效率收藏

    新一篇: xna教程(四)——在xna中绘制字体 | 旧一篇: be patient~~~

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

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

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

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

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

     

    发表于 @ 2006年09月21日 17:30:00|评论(loading...)|编辑

    新一篇: xna教程(四)——在xna中绘制字体 | 旧一篇: be patient~~~

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © clayman