编写ddraw的半透明效果是否只能来一堆汇编以提高速度呢?我是这样做的,但是很慢……

时间:2022-07-14 01:06:03
我知道可以lock一个表面,得到一个指针,然后向里面写东西,于是我直接用这个指针取得当前象素的颜色值做变换然后再赋值回去,结果非常的慢……

在d3d里面是否就简单了?还有就是在d3d里显示二维的图形比如文字、按钮、对话框,绘制他们的时候是否只能用纹理贴图?可不可以同时创建一个ddraw然后blt呢?

先谢过了!!!

8 个解决方案

#1


怎么看不到我的帖子?

#2


在DirectDraw的条件下,一般的情况是至少开一个BackSurface,在系统默认的条件下,这个BackSurface是优先开在显示内存里面的。这样当显示的时候,程序要把系统内存里面的大量数据组织起来,传送到显示内存里面的BackSurface去。然后显示。由于把数据从其他的地方放到显示内存里面的时候,数据并不总是有序的,所以,虽然BackSurface的大小是一个屏幕,但是我们实际上传送的数据却超过了一个屏幕。在我的拚图器里面就是如此。由于地图是多层的,所以每显示一次,根据地图的层次,至少要传送2-3屏的数据。这里其实没有问题。问题在于:BackSurface开在什么地方的问题。

  众所周知,从内存到显示内存的数据传送速度比从内存到内存的速度慢,也比从显示内存到显示内存的速度慢。我们如果把BackSurface开在系统内存里面,这样要显示的时候,我们只要把BackSurface的数据送到PrimarySurface里面,也就是说,我们只要从内存传送一屏的的数据到显示内存里面就可以了,而上面所说的组织数据的问题,则是在速度较快的内存到内存之间的操作。而假如我们把BackSurface开在显示内存里面,则每次显示的时候,组织数据是通过速度较慢的显示内存到内存之间的操作,则2-3屏的数据足以使整体速度下降很多。

  应该尽可能的把BakcSurface开在系统内存里面。

以上转载



DDRAW中的Gamma控制功能来做


#3


谢谢 Lucende(而已书生) !那么我做半透明的方法是否正确呢?就是取得然后运算然后再赋值回去?

#4


是正确的 你可以看一下我在这个帖子里面的回答 那些函数我写出来之后都反复用过的 除了对图像大小有一点限制之外 没有其他问题 而且确确实实提高了显示速度 希望能对你有所帮助 限于篇幅 我只给一个链接
http://community.csdn.net/Expert/topic/3211/3211230.xml?temp=.8214838

#5


看看先……

看来我得复习汇编去了……

那么这段优化只是针对Intel的CPU的吗?

#6


要做特性最好用D3D。然后Lock住BackBuffer一样可以像DDraw一样用,再加上硬件支持的加速特性。。。


关于DDraw,记住,读取显存里的表面是慢得无法想像的事情。请把BackBuffer建到系统内存里。

#7


d3d和ddraw不能混用
做alpha混合最好当然用d3d,用ddraw的话可以抄网上现成的汇编代码。

#8


收到!

太谢谢各位了!!!

#1


怎么看不到我的帖子?

#2


在DirectDraw的条件下,一般的情况是至少开一个BackSurface,在系统默认的条件下,这个BackSurface是优先开在显示内存里面的。这样当显示的时候,程序要把系统内存里面的大量数据组织起来,传送到显示内存里面的BackSurface去。然后显示。由于把数据从其他的地方放到显示内存里面的时候,数据并不总是有序的,所以,虽然BackSurface的大小是一个屏幕,但是我们实际上传送的数据却超过了一个屏幕。在我的拚图器里面就是如此。由于地图是多层的,所以每显示一次,根据地图的层次,至少要传送2-3屏的数据。这里其实没有问题。问题在于:BackSurface开在什么地方的问题。

  众所周知,从内存到显示内存的数据传送速度比从内存到内存的速度慢,也比从显示内存到显示内存的速度慢。我们如果把BackSurface开在系统内存里面,这样要显示的时候,我们只要把BackSurface的数据送到PrimarySurface里面,也就是说,我们只要从内存传送一屏的的数据到显示内存里面就可以了,而上面所说的组织数据的问题,则是在速度较快的内存到内存之间的操作。而假如我们把BackSurface开在显示内存里面,则每次显示的时候,组织数据是通过速度较慢的显示内存到内存之间的操作,则2-3屏的数据足以使整体速度下降很多。

  应该尽可能的把BakcSurface开在系统内存里面。

以上转载



DDRAW中的Gamma控制功能来做


#3


谢谢 Lucende(而已书生) !那么我做半透明的方法是否正确呢?就是取得然后运算然后再赋值回去?

#4


是正确的 你可以看一下我在这个帖子里面的回答 那些函数我写出来之后都反复用过的 除了对图像大小有一点限制之外 没有其他问题 而且确确实实提高了显示速度 希望能对你有所帮助 限于篇幅 我只给一个链接
http://community.csdn.net/Expert/topic/3211/3211230.xml?temp=.8214838

#5


看看先……

看来我得复习汇编去了……

那么这段优化只是针对Intel的CPU的吗?

#6


要做特性最好用D3D。然后Lock住BackBuffer一样可以像DDraw一样用,再加上硬件支持的加速特性。。。


关于DDraw,记住,读取显存里的表面是慢得无法想像的事情。请把BackBuffer建到系统内存里。

#7


d3d和ddraw不能混用
做alpha混合最好当然用d3d,用ddraw的话可以抄网上现成的汇编代码。

#8


收到!

太谢谢各位了!!!