作者:天堂寨旅游2013_668 | 来源:互联网 | 2023-06-23 19:35
一般在DirectDraw中,平常只要用BltFast就能搞定大部分情况,但是有时要做一些特殊效果的时候就不能用BltFast了,比如物体变白,淡入淡出等,这时就要用Lock来直接访问内存。我写了
一般在DirectDraw中,平常只要用BltFast就能搞定大部分情况,但是有时要做一些特殊效果的时候就不能用BltFast了,比如物体变白,淡入淡出等,这时就要用Lock来直接访问内存。
我写了一个物体变白的函数,用到了LOCK,可是不够快,之后我参考了某外国人的文章,把算法改进为按DWORD填充,可还是太慢。
我的问题是:怎样才能使直接访问内存的速度能比较接近BltFast的速度。最好能具体点,给出算法。
请高手指教。
11 个解决方案
按我的经验,表面处理最大的瓶颈正是在Lock Surface的时候。
最有效的办法就是把特效放到最后一起作,只Lock一次表面。
1,将所有的特效尽量的放到一起(尽量的放到最后)
2。尽量用汇编语言写你的函数,因为其调度非常的频繁
3。如果你的计算机支持MMX (通常都支持哦),使用这些多媒体指令
4,优化算法,注意流水线指令对寄存器的读写要求,尽量减少他由于指令的顺序引起的延时
5,所有的特效尽可能在后台surface上完成
有道理,多谢。
不过我发现特效也很费时间,我曾试过只lock,并不慢。
我想问的就是lock后怎样才能更快?
那么只能通过好的算法或硬件加速了.
ddraw特效可参考CDX的代码.
你可以做一个比较硬件Blt和Lock surface后直接位块传输速度的测试看看,锁表面的那个速度会远远慢于Blt的那个。所以说关键不在于如何优化Lock和Unlock之间的代码,而在于减少Lock的次数。
那完全要看你想实现的效果难度和你的算法如何了,比如说你想实现像 Pixel Shader 一样的像素级的光影效果,那么你一定要有一个简单的、近似的算法,否则 fps 受不了
我曾试过用lock()得到显存地址,再直接在显存进行直接读取,我感觉不慢!
我发现即使是简单的特效如反白,淡入淡出等用到我编的游戏中也会使游戏明显变慢。
那么请问,如果要少用lock(),那么怎么做才能实现这些特效?(事先画好似乎不太现实),如果用lock(),那末又需要什么技巧?
我的方法是打开D3D的硬件加速功能,用D3DXDrawSpriteSimple()就可以了.速度爽及!反正现在的显示卡全都这么厉害.
to
finalvictory:
请问D3DXDrawSpriteSimple()是什么函数?我在MSDN中没有找到(最新的,有dx8.1)。
根据我的经验,Lock()Unlock()的开销看为常数,不要过多计较。
但要注意读显存的速度比写的速度慢一个数量级(在我的GF256上约为30:1),所以结论是不要读大块显存,只进行写操作,否则就不会有你所要的那种快了。