D3D中实现2D绘制的2种方法的学习

1.Textured Quads:http://www.gamedev.net/reference/articles/article1972.asp
2.ID3DXSPRITE:http://www.gamedev.net/reference/articles/article1434.asp
http://www.gamasutra.com/features/20010629/geczy_01.htm


似乎很多中文资料都是参考了上面的2种方法的。
其实也看到过很多关于2D方面的讨论了,其中GameDev上就有很多。有的人说DD快,有的数D3D下的2D也不慢。
不过本着“喜新厌旧”的原则,我还是选择了试一下D3D下的2D。
google了很多,总结起来也就上面那2种方法,具体实现就不罗嗦了,记一下实际遇到的问题。
前一阵试过Textured Quads感觉还不错,虽然不如Sprite来的直接、已于接受一些,不过最后在Alpha方面遇到了问题,用1方法的效果是虽然纹理图片的alpha是正确设置了(透明度什么的都有了),但是图片的Quad所在位置却被黑色覆盖,直到完全不透明(Opague),才把背后的黑色覆盖住了(以前没有涉及到alpha的时候没看出来),但是用Sprite就不会,所以大部分涉及到alpha的都换用了Sprite的Draw,本来以为不会有什么问题了,可是昨天程序已经写到了绘制棋子的部分,定位什么的都很好解决,棋盘大小的问题也解决了(原来设定的屏幕大小是所有的区域,而不只是D3D的绘图区,也就是说如果+上菜单什么的,绘图区就小多了),可是到测试绘制棋子的时候(15*15=225)个棋子都绘上的时候FPS会骤降到20左右,明显感觉到画面延迟,百思不得其解,就算我的显卡比较差,但也不至于这样吧。
于是开始google,希望能找到答案。
先是这个:d3dPresent.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;和d3dPresent.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
这2中间隔设置,本来是没设定这个初始化时的参数的(默认是ONE),所以一直以来显示的FPS都是60左右稳定着,其实开始时就注意到这个FPS了,不过虽然不高但也流畅,所以就没在意,直到搜到有人提到的这个问题才注意到,原来人家开发的时候大部分都用IMMEDIATE,也就是说能刷多快就刷多快,当然很占CPU资源(自己试了一下32位真彩下可到400多FPS,这还差不多)。
不过本来以为这样可以解决问题,可是转到绘制满棋子的时候还是会跌到20几FPS,看来不是这个问题。
后来想到可能确实是Sprite的Draw本身效率就比较低,所以又回头看Textured Quads方法(因为记得当初读这篇文章的时候后面作者又提到batching的问题,似乎可以提高效能,而画棋子这个步骤正好符合他提到的批量绘制同一个材质,所以寄提高效能希望于此),但是搜了半天也没找到相关内容,今天再次琢磨这个问题的时候突然发现文章自带的演示程序代码似乎没有我遇到的问题,调整了几次alpha值都能和sprite一样的绘制,于是我确认问题出在我的代码上,肯定是有哪里写错了,于是对着人家的代码一点一点检查,最后种终于发现原来是这里://lpDirect3DDevice9->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVDESTALPHA);
lpDirect3DDevice9->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
注释掉的是我写错的参数,结果quads的透明问题解决了,奇怪的是Sprite的效率似乎也提高了,绘制棋子的时候还是用sprite但是满屏棋子的时候fps已经可以达到180多了(^_^看来一定数量的贴图确实回造成性能下降,只是现在才对这个数量有了个认识!),很是奇怪,难道这个参数还会影响什么别的?

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。