DirectX8.1的DirectDraw7研究手记(三)

来源:互联网 发布:英国 知乎 编辑:程序博客网 时间:2024/06/09 13:46

 

一、在何种情况下应该选择IDirectDrawSurface::Blt方法,在何种情况下应该选择IDirectDrawSurface::BltFast方法。(这段解释是从别人那里copy过来的,但不知正确与否,但我觉得讲的有理)

1.      如果你正在从一个隐屏缓冲区中进行一次按位隔行拷贝,你应当使用IDirectDrawSurface::BltFast

2.      如果你的系统显存中是使用硬件进行按位隔行拷贝,你虽然不会真正提高拷贝的速度,但是,它会节省系统模拟硬件时间,从而使整个按位隔行拷贝时间缩短约10%。因此,我推荐读者使用IDirectDrawSurface::BltFast进行所有的显示操作(从显存按位隔行拷贝到显存中)

3.      如果你正在从系统内存中按位隔行拷贝,或者要求专门的硬件标志位,这样的话,你就必须使用IDirectDrawSurface::Blt

 

二、AddRef()函数是干什么的?

IDirectDrawSurface7::AddRef()

DirectX8 SDK HELP 中相关的原文是这样的

Increases the reference count of the object by 1.

When the object is created, its reference count is set to 1. Every time an application obtains an interface to the object or calls the AddRef method, the object's reference count is increased by 1. Use the Release method to decrease the object's reference count by 1.

大意是说:AddRef()函数用来给object中表示object有多少个“关联”的总数值加1。而当Release被调用时,这个值减1

而我观察DirectX所附带的例子里有用AddRef()函数的地方,有两种:

1.    g_lpFrontSurface->GetAttachedSurface(&ddscaps,&g_lpBackSurface)之后,即“前台缓存页面GetAttachedSurface后台缓存页面”之后,用过g_lpBackSurface->AddRef();。

2.    另一种情况是:假设有两个DirectDraw实体,我们申请了两个指针,LPDIRECTDRAW7 lpDD1,lpDD2;,而一个页面是由lpDD2->CreateSurface创建的,传递到lpDD1中做它的一个页面后,用了一次AddRef();

所以大概那段英文是说这个函数应该用在取得一个不是由自身DirectDraw指针的CreateSurface创建的Surface后,用IDirectDraw7::AddRef。大致我只能这样理解了,如果那位兄台有高见,希望还请好不保留的赐教。

三、Alt+Tab一次后,页面丢失的问题。

我们用一个函数IDirectDrawSurface7::Restore();这个函数只能恢复页面原来所站有的内存位置大小,但不能恢复原来的内容,所以还要我们手工把内容重新装入。在DirectDraw程序中只要页面丢失,所有的DirectDraw函数都会不作任何事情,只返回DDERR_SURFACELOST表示页面丢失。同时IDirectDrawSurface7::IsLost()也有函数来判断页面是否丢失。如果调用成功,返回值是DD_OK,表明页面内存没有被释放。如果调用失败,返回值可能是下列值之一:DDERR_INVALIDOBJECT ;DDERR_INVALIDPARAMS ;DDERR_SURFACELOST

原来是有多少Surface就要逐个调用,现在IDirectDraw7::RestoreAllSurface()解决了这个问题,只要调用一次DirectDraw的实体指针的RestoreAllSurface()一次就可以恢复所有相关页面的内存大小和位置。内容还是要重新调入的。(我想那个AddRef()函数可能就和这RestoreAllSurface()有一些关联吧!)

三、不需要调色板的时候??

displaymode设置为640×480×8位(256色)时要用调色板管理页面色彩,否则,像上一讲中的例子有时就会产生失真。而640×480×16位色时就算不CreatePalette也不会产生颜色失真。

在“老王”的directx手册中有这样一句话:“那些使用16位或更高位像素格式的页面并不使用调色板