【转】WM(WinCE)模拟器如何调试ddraw程序?

摘要:
“);20returnFALSE;21}22//全屏独占模式23hRet=g_pDD-˃SetCooperativeLevel;24if(hRet!”);27返回FALSE;28}29//取DDraw可用容量30g_pDD-˃GetCaps;31//如果不支持翻转和后退缓冲区之一,请启用单缓冲区模式32if(!)33{34//单缓冲区模式35g_bSingle buffer=TRUE;36}37//显示模式设置为38memset;39日。dwSize=sizeof;4041hRet=g_pDD-˃获取显示模式;4243if(hRet!“);46returnFALSE;47}4849g_dwScreenX=DDSD.dwWidth;50g_dwScrenY=DDSD.dwHeight;51g_dwScrEEBpp=DDSD.ddpfPixelFormat.dwRGBBitCount;5253//colorkey硬件功能54g_dwTransType=DDBLT_KEYSRC;55ddCaps.dwSize=sizeof;56if57{58ddsd.dwFlags=DDSD_CAPS;59ddsd.DDSCAPS.dwCaps=DDSCAPS_PRIMARYSURFACE;60}61else62{63ddsd.dwFlags=DDSD_CAPS | DDSD_BACKBUFFERCOUNT;64ddsd.ddsCaps.dwCaps=ddsCaps_PRIMARYSURFACE|ddsCaps_FLIP;65ddsd.dwBackBufferCount=1;66}67//主缓冲区创建68hRet=g_pDD-˃CreateSurface;6970if(小时)!

上次在参考研究mobile sdk 6.0中自带的DDraw例子时发现在模拟器上跑到创建后备缓冲时由于不支持DDSCAPS_BACKBUFFER而导致程序不能运行,google了一通发现m$网站和其他一些论坛上也有人问过类似问题,得到的答案貌似是说emlator上不能跑DDraw和D3D的程序,要测只能用device,其实只要自己实现一个创建后备缓冲以及用blit模拟flip的方式就可以在模拟器上跑了,并不是模拟器根本就没有实现DDraw,只是没有实现硬件后备缓冲、翻转等操作(其实在现在的PC模拟器上的这2种方式应该也没有什么效率上的差异吧)。
具体代码:

1 //************************************
2  // Method: InitDDraw 初始化DDraw
3  // FullName: InitDDraw
4  // Access: public
5  // Returns: BOOL
6  // Qualifier:
7  // Parameter: void
8  //************************************
9  BOOL InitDDraw( void )
10 {
11 DDSURFACEDESC ddsd;
12 HRESULT hRet;
13 DDCAPS ddCaps;
14 DDCAPS ddHelCaps;
15 // DDraw对象
16   hRet = DirectDrawCreate(NULL, &g_pDD, NULL);
17 if (hRet != DD_OK)
18 {
19 InitFail(g_hGameWnd,hRet,_T("DDraw failed to create!"));
20 return FALSE;
21 }
22 // 全屏排他模式
23   hRet = g_pDD->SetCooperativeLevel(g_hGameWnd, DDSCL_FULLSCREEN);
24 if (hRet != DD_OK)
25 {
26 InitFail(g_hGameWnd,hRet,_T("Failed to set cooperative level!"));
27 return FALSE;
28 }
29 // 取DDraw可用能力
30   g_pDD->GetCaps(&ddCaps, &ddHelCaps);
31 // flip和backbuffer有1个不支持就启用单缓冲模式
32   if (!(ddCaps.ddsCaps.dwCaps & DDSCAPS_BACKBUFFER) || !(ddCaps.ddsCaps.dwCaps & DDSCAPS_FLIP))
33 {
34 // 单缓冲模式
35   g_bSingleBuffer = TRUE;
36 }
37 // 显示模式设置
38   memset(&ddsd, 0, sizeof(ddsd));
39 ddsd.dwSize = sizeof(ddsd);
40
41 hRet = g_pDD->GetDisplayMode(&ddsd);
42
43 if(hRet != DD_OK)
44 {
45 InitFail(g_hGameWnd,hRet,_T("GetDisplayMode Failed!"));
46 return FALSE;
47 }
48
49 g_dwScreenX = ddsd.dwWidth;
50 g_dwScreenY = ddsd.dwHeight;
51 g_dwScreenBpp = ddsd.ddpfPixelFormat.dwRGBBitCount;
52
53 // color key 硬件能力
54 g_dwTransType = DDBLT_KEYSRC;
55 ddCaps.dwSize = sizeof(ddCaps);
56 if(g_bSingleBuffer)
57 {
58 ddsd.dwFlags = DDSD_CAPS;
59 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
60 }
61 else
62 {
63 ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
64 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP;
65 ddsd.dwBackBufferCount = 1;
66 }
67 // 主缓冲创建
68 hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
69
70 if (hRet != DD_OK)
71 {
72 if (hRet = DDERR_NOFLIPHW)
73 {
74 InitFail(g_hGameWnd,hRet,_T("******** Display driver doesn't support flipping surfaces. ********"));
75 return FALSE;
76 }
77 InitFail(g_hGameWnd,hRet,_T("CreateSurface FrontBuffer Failed!"));
78 return FALSE;
79 }
80
81 if (g_bSingleBuffer)
82 {
83 ddsd.dwFlags = DDSD_WIDTH|DDSD_HEIGHT;
84 ddsd.dwWidth = g_dwScreenX;
85 ddsd.dwHeight = g_dwScreenY;
86 hRet = g_pDD->CreateSurface(&ddsd,&g_pDDSBack,NULL);
87 if(hRet != DD_OK)
88 {
89 InitFail(g_hGameWnd,hRet,_T("BackBuffer failed to create!"));
90 return FALSE;
91 }
92 }
93 else
94 {
95 // Get a pointer to the back buffer
96 hRet = g_pDDSPrimary->EnumAttachedSurfaces(&g_pDDSBack, EnumFunction);
97 if (hRet != DD_OK)
98 {
99 InitFail(g_hGameWnd,hRet,_T("EnumAttachedSurfaces Failed!"));
100 return FALSE;
101 }
102 }
103 return TRUE;
104 }

在绘图循环的时候这样处理flip:

1 HRESULT ddrval;
2 RECT src, dest;
3
4 src.left = 0;
5 src.top = 0;
6 src.right = g_dwScreenX;
7 src.bottom = g_dwScreenY;
8
9 dest.left = 0;
10 dest.top = 0;
11 dest.right = g_dwScreenX;
12 dest.bottom = g_dwScreenY;
13
14 // Flip the surfaces
15 while( 1 )
16 {
17 if (g_bSingleBuffer)
18 {
19 //copy back buffer to front.
20 ddrval = g_pDDSPrimary->Blt(&dest, g_pDDSBack, &src, DDBLT_WAITNOTBUSY, NULL );
21 }
22 else
23 {
24 ddrval = g_pDDSPrimary->Flip(NULL, 0);
25 }
26
27 if( ddrval == DD_OK )
28 {
29 break;
30 }
31 if( ddrval == DDERR_SURFACELOST )
32 {
33 if( !RestoreSurfaces() )
34 {
35 return 0;
36 }
37 }
38 if( ddrval != DDERR_WASSTILLDRAWING )
39 {
40 break;
41 }
42 }

from:http://blog.k-res.net/?p=472

免责声明:文章转载自《【转】WM(WinCE)模拟器如何调试ddraw程序?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇json字符串大括号里的必须全部双引号My97DatePicker控件调用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Kafka 权限管理实战(最全整理)

JAAS文件定义了链接KafkaBroker所需的用户名和密码,以及用于在代理的各个节点之间进行通信的用户名和口令:用户名/口令:用于代理之间通信的用户名与口令。...

浪潮各机型管理芯片BMC IP(智能平台管理接口)设置

NF5240m3/NF5140m3/NF5280m3/SA5212H2/NP5540M3NF5270M3/NF5170M3/NF8420m3IPMI主板集成管理芯片BMCIP设置开机按DEL键进入BIOS设置选择"ServerMgmt"---"BMCNetworkConfiguration"---"lanchannel1/2"---"staticipaddr...

Windows 7集成IE11(离线安装包、补丁)

当Win7系统需要集成IE11时,我们需要提前输入六个补丁KB2731771、KB2786081、KB2834140、KB2670838、KB2729094、KB2533623332位★ 百度网盘64位★ 百度网盘。我们需要输入这六个补丁才能更改IE11。此外,我们还需要32位的IE11离线安装包★ 百度网盘64位★ 百度网盘。这六个补丁是安装IE11所必需...

IntelliJ IDEA(2017)安装和破解

IDEA全称IntelliJIDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具、JUnit、CVS整合、代码分析、创新的GUI设计等方面的功能可以说是超常的。用记事本打开分别在最下面一行增加一行:-javaagent:D:IDEAinJetbra...

Jenkins安装

1、 Jenkins简介1.开源自动化持续集成和部署平台CI、持续集成CD和持续部署2.Jenkins Free风格任务管道Maven项目多配置项目多分支管道任务支持的任务类型,不会执行任何更新;触发器(由Gitlab...

flutter vscode+第三方安卓模拟器

1.首先打开夜曲模拟器2.Win+R,选择cmd,在第三方模拟器安装目录的bin目录下输入夜曲模拟器,然后运行命令:nox_Adb.execonnect127.0.0.1:620013。打开项目终端的vscode并建立连接:adbconnect127.00.1:62001(夜神模拟器的默认端口)4。查看连接:adbdevices或不使用第三方模拟器:1.打开...