GAPI简介
一 概述
同所有的Windows平台一样,WinCE平台通过GDI实现图形和文字的绘制工作,但是由于其中存在大量的转换和判断,导致其速度相对比较慢。为了提高渲染速度,微软提出了DirectDraw和Direct3D,然而对于嵌入式系统的WinCE,在WinCE5.0版本前是不能使用的。为此,微软在WinCE3.0后提供了GAPI来直接提供了对于帧缓存和按键输入的管理功能。
GAPI提供的函数相对较少,功能也有限,但是却足以支持各种主要的应用。基于GAPI的开发工作主要是实现对于帧缓存的数据管理。由于GAPI不提供基本的图形绘制功能,需要自己开发相关算法。
二 函数介绍
GAPI提供的函数有限,下面是主要函数列表
函数
|
PPC
|
SP
|
描述
|
|
X
|
X
|
准备进行绘制。
|
|
X
|
X
|
释放所有GAPI使用的资源。
|
|
X
|
X
|
释放GAPI使用的输入相关的资源, 并重新启用按键消息。
|
|
X
|
X
|
当绘制完成后调用。
|
|
X
|
X
|
返回一系列定义游戏控制方式的虚键码。
|
|
X
|
X
|
返回保存显示硬件详细信息的结构体。
|
|
X
|
X
|
返回设备是否是标准设备。
|
|
X
|
X
|
打开显示,并确保帧缓存可用。
|
|
X
|
X
|
打开非过滤按键消息模式。
|
|
X
|
X
|
继续GAPI操作。
|
|
X
|
X
|
定义一个GAPI视口。
|
|
X
|
X
|
暂停GAPI操作。
|
对于各个函数,下面作比较详细的说明:
(一)按键输入相关
(1)GXDLL_API int GXOpenDisplay ( HWND hWnd, DWORD dwFlags );
如果成功返回1,否则返回0。可以使用GetLastError得到详细错误信息。
(2)GXDLL_API int GXCloseInput ();
如果成功返回1,否则返回0。可以使用GetLastError得到详细错误信息。
(3)GXDLL_API GXKeyList GXGetDefaultKeys ( int iOptions );
获得一系列虚键,以定义对于游戏最适合的按键布局。参数iOptions为定位模式,只能取GX_NORMALKEYS(绘图定位模式)或者GX_LANDSCAPEKEYS(场景定位模式)。
struct GXKeyList
{
short vkUp; //向上键
POINT ptUp; //按键位置坐标(相对于屏幕设备坐标)
Short vkDown; //向下键
POINT ptDown; //按键位置坐标(相对于屏幕设备坐标)
Short vkLeft; //向左键
POINT ptLeft; //按键位置坐标(相对于屏幕设备坐标)
Short vkRight; //向右键
POINT ptRight; //按键位置坐标(相对于屏幕设备坐标)
Short vkA; //A键
POINT ptA; //按键位置坐标(相对于屏幕设备坐标)
Short vkB; //B键
POINT ptB; //按键位置坐标(相对于屏幕设备坐标)
Short vkC; //C键
POINT ptC; //按键位置坐标(相对于屏幕设备坐标)
Short vkStart; //开始键
POINT ptStart; //按键位置坐标(相对于屏幕设备坐标)
};
其它说明可以参考MSDN。
(二)显示相关
(1)GXDLL_API int GXOpenDisplay ( HWND hWnd, DWORD dwFlags );
其中:
hWnd 全屏时指向全屏窗口的句柄
dwFlags 指定屏幕模式选项 ,可以为:
值
|
说明
|
KfFullScreen
|
使用全屏模式 (Pocket PC).
|
GX_FULLSCREEN
|
使用全屏模式 (Smartphone).
|
如果成功返回1,否则返回0。可以使用GetLastError得到详细错误信息。
(2) GXDLL_API int GXCloseDisplay ();
如果成功返回1,否则返回0。可以使用GetLastError得到详细错误信息。
(3) GXDLL_API GXDisplayProperties GXGetDisplayProperties ();
返回结构体,得到所有的显示属性。结构体定义如下
struct GXDisplayProperties
{
DWORD cxWidth; //屏幕的像素宽度
DWORD cyHeight; //屏幕的像素高度
long cbxPitch; //为获得向右方向下个像素位置所需要移动的字节数
long cbyPitch; //为获得向下方向下个像素位置所需要移动的字节数
long cBPP; //每个像素的位数,必须是2的次方
DWORD ffFormat; //像素格式,具体见下表
};
像素格式:
标识
|
说明
|
kfLandscape
|
Display is oriented on its side; 0,0 is in the lower-left corner; increasing addresses move up the screen. Generally, it is not an issue if you use cbxPitch and cbyPitch.
|
kfPalette
|
Display is palette based.
|
kfDirect
|
Display is direct mapped, no palette. This is a "helper" bit, so you do not have to check all the direct flags manually.
|
kfDirectInverted
|
Indicates the display colors are inverted. For example, with black and white colors, white is black.
|
kfDirect555
kfDirect565
kfDirect888
|
Format of a direct mapped pixel. Numbers specify bits per color in red-green-blue order. The Intel byte order is assumed: for kfDirect565, a left shift of 11 puts the low-order bits of a short or long into the red position.
|
特别说明:
对于每个像素的位数小于8(一个字节)的情况,为得到下一像素位置仅使用cbxPitch和cbyPitch是不够的,需要使用cBPP。下面是两个常见的情况:
unsigned char * pb;
if (cBPP < 8) // 每个像素4位
address = pb + ((x * cBPP) >> 3) + (y * cbyPitch);
else //每个像素8位或以上
address = pb + (x * cbxPitch) + (y * cbyPitch);
(4) GXDLL_API BOOL GXIsDisplayDRAMBuffer ();
如果是标准设备返回FALSE,如果是非标准设备返回TRUE。可以不使用此函数,但是请务必设置视口(viewport)。
(5) GXDLL_API int GXSetViewport ( DWORD dwTop, DWORD dwHeight, DWORD dwReserved1, DWORD dwReserved2 );
其中:
dwTop 视口的顶坐标再屏幕中的位置
dwHeight 视口高度
dwReserved1 保留字,必须为0
dwReserved2 保留字,必须为0
如果成功则返回1,错误则返回0,可以使用GetLastError获得错误的详细信息。此函数仅对于非标准设备有效,标准设备无效。
(6)GXDLL_API void * GXBeginDraw ();
为绘图作准备,返回显示存储区,如果不能锁定显示设备则返回NULL.
(7)GXDLL_API int GXEndDraw ();
当绘制完成后调用,成功返回1,否则返回0,可以使用GetLastError获得错误的详细信息。
(三)状态相关
(1)GXDLL_API int GXSuspend ();
暂停所有GAPI操作。成功返回1,否则返回0,可以使用GetLastError获得错误的详细信息。当存在WM_KILLFOCUS消息时,调用GXSuspend()。不需要和GXResume ()一一对应。
(2)GXDLL_API int GXResume ();
继续所有GAPI操作。成功返回1,否则返回0,可以使用GetLastError获得错误的详细信息。当存在WM_SETFOCUS消息时,调用GXResume()。不需要和GXSuspend()一一对应。
三 实际使用
实际使用GAPI的过程中,可以参考下面的步骤:
(1)获取GAPI开发相关文件(SDK)
http://www.microsoft.com/mobile/developer/downloads/gapi.asp
(2)将SDK的头文件、LIB文件、DLL文件配置到开发环境中
把“GX.H”包含文件复制到Pocket PC SDK的“Include”目录下,如果存在,说明已经配置好了。依赖CPU(ARM/X86)类型“GX.LIB”文件复制到Pocket PC SDK的相应“Lib”目录下。为支持GAPI程序的运行把依赖CPU类型的“GX.DLL” 文件复制到Pocket PC的“Windows”目录。
(3)创建项目,并加入头文件gx.h和gx.lib。
#include <gx.h>
#pragma comment(lib, "gx.lib")
(4)构建框架
初始化
// 创建窗口为全屏
if (GXOpenDisplay(hWnd, GX_FULLSCREEN) == 0) {
return FALSE; // 创建失败
}
// 获取显示属性
g_gxdp = GXGetDisplayProperties();
if ( GXIsDisplayDRAMBuffer() ) {
GXSetViewport(dwTop, dwHeight, 0, 0);
}
// 初始输入
GXOpenInput();
// 获取按键及布局信息
g_gxkl = GXGetDefaultKeys(GX_NORMALKEYS);
结束清理
GXCloseDisplay();
GXCloseInput();
(5)添加必要的响应(在窗口消息处理函数中,使用MFC开发时,重载相应的消息处理函数)
case WM_KILLFOCUS:
GXSuspend();
break;
case WM_SETFOCUS:
GXResume();
break;
case WM_KEYDOWN:
vkKey = (short)wParam;
if (vkKey == g_gxkl.vkUp) {
//处理函数
break;
}
if (vkKey == g_gxkl.vkDown) {
//处理函数
break;
}
if (vkKey == g_gxkl.vkLeft) {
//处理函数
break;
}
if (vkKey == g_gxkl.vkRight) {
//处理函数
break;
}
if (vkKey == g_gxkl.vkStart) {
//处理函数
break;
}
(6)在绘制函数中调用相关算法填充显示缓冲区
unsigned short * pusVideoBuffer = (unsigned short *)GXBeginDraw();
//实际图形绘制及图形缓冲区内容填充
GXEndDraw();
四 总结
GAPI提供了游戏制作所需要的主要两个功能:图形和输入控制。对于图形,由于其只是简单的暴露显示缓存(帧缓存),虽然提高了程序使用的自由度和绘制的效率,但是却需要自己实现各种基本的功能,这就加大了开发的难度。
分享到:
相关推荐
在Microsoft Foundation Classes (MFC) 中使用Graphics API (GAPI) 是一项技术性的挑战,因为MFC本身是基于Windows API构建的,而GAPI则提供了一种底层的图形处理方式。GAPI允许开发者直接控制显卡硬件,实现高效、...
一、GAPI简介 GAPI是Microsoft为移动设备开发的游戏优化库,它针对Windows CE和Windows Mobile系统进行了特别优化,以实现更快的图形渲染和更高效的内存管理。与标准的DirectDraw相比,GAPI在处理2D图形和动画时...
《Windows CE 5.0图形应用程序接口(GAPI)详解》 Windows CE 5.0是微软开发的一个嵌入式操作系统平台,广泛应用于各种小型设备和嵌入式系统。在Windows CE 5.0中,GAPI(Graphics Application Programming ...
GAPI Benchmark is one of the first Pocket PC benchmarks to test the GAPI (Game API) performance. The program has the following features: CPU Integer speed test, CPU Floating Point (using casting) ...
【标题】"HelloGameAPI.rar_gapi"是一个与游戏开发相关的压缩包,它包含了使用Visual C#.NET 2005编写的Gapi函数库的基本入门程序。Gapi,全称为Game Application Programming Interface,是一个专为游戏编程设计的...
【GAPI:GPU加速的移动对象并行索引方法】是一种针对移动对象数据库的高性能索引技术,旨在解决由锁定操作引起的并行性能影响,并提高数据处理吞吐量。该方法由车庆首、李传文、张轶和邓庆绪等人在2017年的《计算机...
Api-ng-gapi.zip,ng gapi角6 角6 谷歌api模块(nggapi),一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程。
GAPI32.DLL
本文将深入探讨Laravel开发中的一个重要概念——gapi,以及如何使用Laravel和Lumen框架来创建RESTful API。 首先,我们要理解什么是gapi。在上下文中,"gapi"似乎是指一个专门为Laravel和Lumen设计的包,用于简化...
GAPI(Game Application Programming Interface)是专为移动设备游戏开发者设计的一种高效图形处理接口,它不仅限于游戏开发,还可以用于任何需要高性能图形显示处理的场合。GAPI 是基于动态链接库(DLL)的方式实现...
### WinCe 地图引擎加速 GAPI:提升地图信息检索效率的关键策略 #### 概述 在当前数字化时代,电子地图已成为人们日常生活中不可或缺的一部分,无论是导航、位置服务还是地理信息查询,电子地图都扮演着至关重要的...
本文将深入探讨Baumer GAPI SDK (图形应用程序接口软件开发工具包) Win v2.9.0.18905,这是专为Windows操作系统设计的堡盟相机驱动程序,用于支持和优化堡盟相机的性能。 GAPI,全称为Generic Application ...
根据提供的文件信息,以下是从Baumer相机SDK(软件开发工具包)v2.9中提炼出的相关知识点: 1. Baumer相机SDK概述:Baumer相机SDK是一个适用于Baumer系列相机的软件开发工具包。它允许开发者轻松地将Baumer相机集成...
:rocket: 用法将包添加到您的项目中: // npmnpm install -- save gapi - script// yarnyarn add gapi - script 您可以使用两种不同的方法来加载gapi 1-在需要的地方导入gapi : import { gapi } from 'gapi-script...
使用gapi-script npm包的Google登录的React示例 此示例是使用create-react-app创建的。 本示例仅使用Google gapi的登录和注销功能,它不会在第三方应用程序中收集或存储您的数据的任何数据 设置 创建您的Google项目...
将在v2.0中受支持,并且今天可以通过vue-gapi@next 。 安装 npm install --save vue-gapi 要么 yarn add vue-gapi 用法 使用配置参数安装插件: import Vue from 'vue' import VueGapi from 'vue-gapi' Vue . use...
这个软件包,即PPCHAL_0_7_7.zip,旨在替代传统的图形应用程序接口(GAPI),为开发者提供更高效、更快捷的图形处理能力。 GAPI,全称是Graphics Application Programming Interface,是微软为掌上设备开发图形应用...
GAPI(Graphics Application Programming Interface)通常指的是使用Win32 API进行图形编程的方式。在本项目中,“我自己做的Win32 GAPI 代码”是一个个人编写的示例程序,使用了Visual Studio 2005进行开发,并且...
clj-gapi 发现文档API所描述的Google Web服务API的简单客户端。 请参阅以获取与此有关的API的完整列表。 确保已为您希望进行的任何访问创建了控制台项目! 安装 在您的project.clj文件中,只需包括以下依赖项: ...