SDL显示的使用

在客户机中,特别是对于桌面级的Linux系统和所有的Windows系统来说,虚拟机中的图形显示是非常重要也是几乎必需的功能。本节主要主要介绍KVM中图形界面显示相关配置。

4.5.1 SDL的使用

SDL(Simple DirectMedia Layer)是一个用C语言编写的、跨平台的、免费和开源的多媒体程序库,它提供了一个简单的接口用于操作硬件平台的图形显示、声音、输入设备等。SDL库被广泛应用于各种操作系统(如Linux、FreeBSD、Windows、Mac OS、iOS、Android等)上的游戏开发、多媒体播放器、模拟器(如QEMU)等众多应用程序之中。尽管SDL是用C语言编写的,但是其他很多流行的编程语言(如C++、C#、Java、Objective C、Lisp、Erlang、Pascal、Perl、Python、PHP、Ruby等等)都提供了SDL库的绑定,在这些编程语言中都可以很方便的调用SDL的功能。

在QEMU模拟器中的图形显示默认就是使用SDL的。当然,需要在编译qemu-kvm时需要配置SDL的支持,之后才能编译SDL功能到QEMU的命令行工具中,最后才能启动客户机时使用SDL的功能。在编译qemu-kvm的系统中,需要有SDL的开发包的支持,在RHEL6.3系统中需要安装SDL-devel这个RPM包。如果有SDL-devel软件包,在3.4.2节中配置QEMU时默认就会配置为提供SDL的支持,通过运行configure程序,在其输出信息中可以看到“SDL support   yes”即表明SDL支持将会被编译进去。当然,如果不想将SDL的支持编译进去,在配置qemu-kvm时加上“–disable-sdl”的参数即可,configure输出信息中会显示提示“SDL support   no”。

在运行QEMU命令行的系统中必须安装SDL软件包,否则命令行启动客户机时会有产生“无法加载libSDL”的错误,命令行的输入输出演示如下:

[root@jay-linux kvm_demo]# qemu-system-x86_64 rhel6u3.img

qemu-system-x86_64: error while loading shared libraries: libSDL-1.2.so.0: cannot open shared object file: No such file or directory

[root@jay-linux kvm_demo]# yum install SDL   #安装SDL软件包

SDL的功能很好用,也比较强大,不过它也有一个局限性,就是在创建客户机并以SDL方式显示时,它会直接弹出一个窗口,所以SDL方式只能在图形界面中使用。如果在非图形界面中(如ssh连接到宿主机中),使用SDL时会出现如下的错误信息。

[root@jay-linux kvm_demo]# qemu-system-x86_64 rhel6u3.img

Could not initialize SDL(No available video device) – exiting

qemu-kvm命令启动客户机时,采用SDL方式,其效果如图4-10所示。

图4-10 启动客户机时使用SDL,自动弹出客户机的显示窗口

在使用SDL时,如果将鼠标放入到客户机中进行操作会被完全抢占,此时在宿主机中不能使用鼠标进行任何操作。QEMU默认使用“Ctrl+Alt”组合键[15]来实现鼠标在客户机与宿主机中切换。图4-11显示了客户机抢占了鼠标的使用场景,在QEMU monitor上部边框中提示了按哪个组合键可以释放出鼠标。

图4-11 SDL显示中客户机完全占用鼠标

使用SDL方式启动客户机时,弹出的QEMU窗口是一个普通的窗口,其右上角有最小化、最大化(或还原)和关闭窗口等功能。其中,如果点击了“关闭”按钮,会将QEMU窗口关闭,而同时客户机也被直接关闭了,QEMU进程会直接退出。为了避免因误操作而关闭窗口从而让客户机直接推出的情况发生,QEMU命令行提供了“-no-quit”参数来去掉SDL窗口的直接关闭功能。加了“-no-quit”参数后,SDL窗口中的“关闭”按钮的功能将会失效,而最小化、最大化(或还原)等功能正常。图4-12演示了启动客户机时加上了“-no-quit”参数时情况。

图4-12 添加“-no-quit”参数后,SDL窗口中的关闭窗口功能失效

要在Ubuntu上使用SDL显示图片,你需要进行以下步骤: 1. 安装SDL库:首先,确保你已经安装了SDL库。可以使用以下命令在Ubuntu上安装: ``` sudo apt-get install libsdl2-dev ``` 2. 初始化SDL:在你的代码中,首先需要初始化SDL。你可以在程序的开始处调用`SDL_Init`函数来初始化SDL。例如: ```c if (SDL_Init(SDL_INIT_VIDEO) != 0) { printf("SDL initialization failed: %s\n", SDL_GetError()); return 1; } ``` 3. 创建窗口和渲染器:在初始化SDL后,你需要创建一个窗口和一个渲染器来显示图片。你可以使用`SDL_CreateWindow`函数创建一个窗口,并使用`SDL_CreateRenderer`函数创建一个渲染器。例如: ```c SDL_Window* window = SDL_CreateWindow("Image Display", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN); if (window == NULL) { printf("Window creation failed: %s\n", SDL_GetError()); return 1; } SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); if (renderer == NULL) { printf("Renderer creation failed: %s\n", SDL_GetError()); return 1; } ``` 4. 加载图片并创建纹理:使用SDL_image库加载图片,并将其转换为纹理以供渲染。你需要安装SDL_image库,并在代码中包含相应的头文件。例如,加载一张名为"image.png"的图片并创建纹理: ```c #include <SDL2/SDL_image.h> SDL_Surface* surface = IMG_Load("image.png"); if (surface == NULL) { printf("Image loading failed: %s\n", IMG_GetError()); return 1; } SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); if (texture == NULL) { printf("Texture creation failed: %s\n", SDL_GetError()); return 1; } ``` 5. 渲染纹理:最后,你可以在主循环中使用`SDL_RenderCopy`函数将纹理渲染到窗口上。例如,将纹理渲染到整个窗口: ```c SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); ``` 6. 释放资源:在程序结束时,记得释放已分配的资源。例如,释放纹理、渲染器和窗口: ```c SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); ``` 这就是在Ubuntu上使用SDL显示图片的基本步骤。你可以根据自己的需求进行更多的操作和调整。如果你有其他问题,请提供更多的细节,我将尽力帮助你解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值