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

原创 2003年02月15日 13:31:00

 

一、在何种情况下应该选择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位或更高位像素格式的页面并不使用调色板

DirectDraw7

我在DirectDraw编程书的所带的光盘的 源文件拷到硬盘上   编译不成功老是说DirectDraw7  pDD7; 的LPDIRECTDRAW7 没定义 我安装了sdk7也设置了路经可是它老说没...
  • skyydq
  • skyydq
  • 2004年07月16日 17:25
  • 581

JSF教程(7)——生命周期之Restore View Phase

在JSF宏观的生命周期中分为Execute和Render,在Execute部分又将分为具体的步骤(可参考前面博客中的流程图)一共是六个步骤在后面的文章中笔者将带着大家慢慢的走进JSF(JavaEE仅仅...
  • beijiguangyong
  • beijiguangyong
  • 2014年04月30日 21:54
  • 2549

Windows 7 - Services - Restore D…

Services - Restore Default Services in
  • dieqms
  • dieqms
  • 2014年11月13日 19:44
  • 318

DirectX8.1的DirectDraw7研究手记(二) 下

//下面主要是消息循环,根普通程序不一样int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevIns...
  • Timesking
  • Timesking
  • 2003年02月17日 10:34
  • 1321

DirectX8.1的DirectDraw7研究手记(二) 上

上一次,我们创建DirectDraw7的接口指针时用的是DirectDrawCreateEx(NULL, (VOID**)&m_pDD, IID_IDirectDraw7, NULL);其中m_pDD...
  • Timesking
  • Timesking
  • 2003年02月17日 11:03
  • 2138

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

 一、在何种情况下应该选择IDirectDrawSurface::Blt方法,在何种情况下应该选择IDirectDrawSurface::BltFast方法。(这段解释是从别人那里copy过来的,但不...
  • Timesking
  • Timesking
  • 2003年02月15日 13:31
  • 1983

Checkpoint/Restore in Userspace(CRIU)的安装与使用(CentOS 7.2)

参考网址:Installation - CRIU CRIU安装: 获取CRIU的源代码 git clone https://github.com/xemul/criu 或者 wget ht...
  • yu_jinyu
  • yu_jinyu
  • 2016年11月08日 16:34
  • 836

DirectX8.1的DirectDraw7研究手记(二) 中

我们边看程序边讲解,程序的框架是用vc6的windows application生成的hello World改写的。这里没有解释程序在Alt+Tab切换一次后图片不见的问题,也没有说为什么用BltFa...
  • Timesking
  • Timesking
  • 2003年02月17日 10:56
  • 1376

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

这几日修改以前写的基于GDI的小游戏,由于机器较慢,所以游戏运行很慢,所以决定研究一下用DirectX8.1的DirectDraw来把游戏修改一下。以前看过网上朋友写的DirectDraw的资料,大多...
  • Timesking
  • Timesking
  • 2003年02月05日 19:44
  • 1444

升级iOS7遇到问题This device isn't eligible for the requested build的解决方法

今天用iTunes升级iOS7了,中间遇到点小问题:This device isn't eligible for the requested build. 说一下其解决方法。...
  • u010962810
  • u010962810
  • 2013年09月23日 16:25
  • 5755
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectX8.1的DirectDraw7研究手记(三)
举报原因:
原因补充:

(最多只允许输入30个字)