SDL系列游戏在ARM上移植的实现 - 图文

更新时间:2024-03-10 19:29:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程考核大作业 课程名称:《嵌入式技术》 任课教师: 学期:2016-2017学年第1学期 成绩

《SDL系列游戏在ARM上移植的实现》

院 系 专 业 班 级

提交时间: 2016年 11月 12日

SDL系列游戏在ARM上移植的实现

湖北省武汉,430070

摘要:在现在,年轻人喜欢通过玩游戏来放松自己,娱乐自己。许多人会选择到电玩厅游戏厅放松自己。因此,我研究并使用FriendlyARM实现一个简易的SDL系列《仙剑奇侠传一》的移植,使其能够通过键盘运行游戏。完成这个游戏移植同时需要嵌入式硬件知识和软件知识。硬件方面主要是烧写SD卡,将linux镜像文件安装到嵌入式设备上,修改分辨率;软件方面主要是移植游戏和SDL游戏库,设置开机自启动。并且,因为移植原理简单方便,可以以此为模板移植到一些大型设备上,比如电玩厅的游戏机,以此获得商业利益。 关键词:SDL系列游戏;ARM移植

The Realization of SDL Series Game Porting on ARM

Abstract: In the present, young people like to play through the game to relax and entertain themselves. Many people choose to relax in the arcade game room. Therefore, I study and use FriendlyARM to achieve a simple SDL series \this game migration requires both embedded hardware knowledge and software knowledge. Hardware is the main programming SD card, the linux image file installed on the embedded device, modify the resolution; software is mainly transplant games and SDL game library, set the boot from the start. And, because the transplant principle is simple and convenient, you can use this as a template to transplant to some large equipment, such as video game console, in order to obtain commercial interests. Keywords: SDL series of games; ARM transplantation

1 实验的主要工作

1. 了解linux操作系统,熟悉各种基础指令代码;了解SDL游戏移植基本原理,熟悉移植过程;了解ARM硬件软件操作。

了解linux操作系统 了解SDL游戏移植基本原理 了解ARM硬件软件操作 准备工作 通过之前的学习,我基本上学会了所有linux基本代码,能够独立编写出移植过程中的全部代码;我了解到SDL游戏有SDL_mixer声音库、SDL_net网络库、SDL_ttf字体库、SDL_rtf图像库,移植游戏的时候必须也移植进去;我了解到ARM上没有运行操作系统、屏幕是A70长640宽480、cpu为512MHZ、内存为256M,我选择了满足硬件要求的《仙剑奇侠传一》作为本次移植对象,我选择烧写linux到开发板中。

2. 进行硬件相关操作,烧写SD卡;再烧写linux的镜像文件到开发板中;修改游戏分辨率。

我使用superboot工具烧写SD卡,使其能够进行SD-BOOT,再修改烧写linux的ini配置文件,比如烧写的系统名称,ARM屏幕是A70,烧写格式是ubfi,使其适合FriendlyARM,再烧写linux的镜像文件到开发板中,方便之后软件更容易移植;我了解到FriendlyARM屏幕分辨率为640*480,并修改main.c中的游戏分辨率参数,并且编写函数让游戏动态获取分辨率。

3. 进行软件操作,对SDL库以及游戏进行交叉编译;再将可执行文件连同游戏一起倒入ARM之中;建立一个开机自启动的脚本文件。

交叉编译 创建开机自启动shell程序 我将五个游戏库以及游戏下载,在电脑linux交叉编译并打包,然后使用U盘将打包文件拷入开发板中,游戏不能直接运行,必须建立开机自启动shell脚本,并在脚本中引导游戏启动。

软件相关操作 烧写SD卡 烧写linux的镜像文件到开发板中 修改游戏分辨率 硬件相关操作

2 FriendlyARM与SDL游戏的介绍

1.FriendlyARM概念

FriendlyARM是一款以ARM11芯片(三星S3C6410)作为主处理器的嵌入式核心板,该CPU 基于 ARM1176JZF-S 核设计,内部集成了强大的多媒体处理单元,支持Mpeg4, H.264/H.263等格式的视频文件硬件编解码,可同时输出至LCD和TV显示;它还并带有 3D 图形硬件加速器,以实现 OpenGL ES 1.1 & 2.0 加速渲染,另外它还支持 2D 图形图像的平滑缩放,翻转等操作。FriendlyARM采用高密度 6 层板设计,尺寸为64 x 50mm,它集成了 128M/256M DDR RAM,SLC NAND Flash(256M/1GB)或 MLC NAND Flash(2GB)存储器,采用 5V 供电,在板 实现 CPU 必需的各种核心电压转换,还带有专业复位芯片,通过 2.0mm 间距的排针,引出各种常见的接口资源,以供不打算自行设计 CPU 板的开发者进行快捷的二次开发使用。

Tiny6410SDK 是采用FriendlyARM核心板的一款参考设计底板,它主要帮助开发者以此 为参考进行核心板的功能验证以及扩展开发。该底板具有三 LCD 接口、 4 线电阻触摸屏接口、 100M 标准网络接口、标准 DB9 五线串口、Mini USB 2.0 接口、USB Host 1.1、3.5mm 音频输 入输出口、标准 TV-OUT 接口、SD 卡座、红外接收等常用接口;另外还引出 4 路 TTL 串口, 另 1 路 TV-OUT、SDIO2 接口(可接 SD WiFi)接口等;在板的还有蜂鸣器、I2C-EEPROM、备 份电池、AD 可调电阻、8 个中断式按键等。 2.SDL系列游戏的基本介绍

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用 C 语言写成。SDL 提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平 台(Linux、Windows、Mac OS X 等)的应用软件。目前 SDL 多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

SDL 在结构上是将不同操作系统的库再包装成相同的函数,例如 SDL 在 Windows 平台上其实是 DirectX 的再包装,旧版本包装的是 DirectX 5,现时的版本(SDL 1.2)则是 DirectX 7。而在使用 X11 的 平台上(包括 Linux), SDL 则是与 Xlib 库沟通来输出图像。

SDL 库分为 Video、Audio、CD-ROM、Joystick 和 Timer 等若干子系统,除此之外,还有一些单独 的官方扩充函数库。这些库由官方网站提供,并包含在官方文档中,共同组成了 SDL 的“标准库”:

* SDL_image—支持时下流行的图像格式:BMP、PPM、XPM、 PCX、GIF、JPEG、PNG、TGA。

* SDL_mixer—更多的声音输出函数以及更多的声音格式支持。 * SDL_net—网络支持。

* SDL_ttf—TrueType 字体渲染支持。 * SDL_rtf—简单的 RTF 渲染支持。

3 硬件部分实验内容

1. 阅读产品说明书,了解FriendlyARM的CPU速率,内存大小,屏幕分辨率,预装系统。

2. 因为之前是没有任何系统,不符合软件要求,故烧写适合FriendlyARM的Linux系统的镜像文件到开发板中,在其中,我采用的是制作SD卡启动盘的方式。

3. 制作SD卡启动,通过superboot软件将SD卡转换为特殊的SD卡启动。 4. 将要烧写的linux系统导入SD卡的Image目录之下。

5. 修改linux配置文件,编写ini文件,找到”OS=”,并改为”OS=Linux”,保存修改,取出 SD 卡插到开发板上。

6. 上电开机,将S1开关设置为“SD-BOOT“启动,同样的“滴”一声开始,同样的“滴滴”两声后更新完毕,因为我们制作的 Linu映像文件比较大,烧写时间比较长,整个过程 1 分钟左右。

7. 把开发板 S2 开关设置为”NAND”启动,这时重启系统就可以看到 Linux 已经被安装好,并且出现了校正界面。

8. 开机出现以下画面,则烧写linux成功,硬件部分基本完成。

9. 修改游戏的main.c文件,更改屏幕分辩率,修改为长640,宽480大小,使其适合FriendlyARM大小;

用文本编辑器打开main.c文件,定位到 535/536 行,将内容: wScreenWidth = 640;

wScreenHeight = fFullScreen ? 480 : 400; 改成

getFBSize(&wScreenWidth,&wScreenHeight);

if(wScreenWidth>640||wScreenHeight>480) {wScreenWidth=640; wScreenHeight = 480; }

10. 再定位到main.c函数第439行,在main函数前面,插入以下函数,这个函数用于动态获取屏幕分辨率; #include #include #include #include

void getFBSize(int *w, int *h) {

char buf[256]; *w = 480; *h = 272;

FILE *file=fopen(\ if (!file) { return ; }

int tmp1=0,tmp2=0;

if (fgets(buf, sizeof(buf), file)) {

if (sscanf(buf, \ *w = tmp1; *h = tmp2; } } fclose(file); return ; }

11. 接下来应该需要修改其他配置文件,比如对手柄的支持,但是我使用键盘,故不展示细节;

4 软件部分实验内容

1. 我们首先需要在网上下载Fedora9,因为所有开发工作都是在Fedora9的Linux环境下进行的,所以在开始之前,需要先在 PC 上安装 Fedora9。

2. 建立交叉编译环境,安装好Friendly提供的mini6410交叉编译器。

3. 我们还需要在网上下载SDL/SDL_mixer/SDL_ttf/SDL_image以及iconv五个库,再将这五个库放入linux/tmp目录之下,在/opt/FriendlyARM/mini6410 目录下创建目录games来作为移植工作的工作目录,再在 games 目录下创建一个output目录,用来存放编译生成的可执行文件或者类库。

4. 接下来编译iconv/SDL/SDL_mixer/SDL_ttf/SDL_image库,因为这四个库编译方法类此,故以其中SDL库为例。 # cd /opt/FriendlyARM/mini6410/games # tar xvzf /tmp/SDL-1.2.14.tar.gz # cd SDL-1.2.14 #

./configure

--prefix=/opt/FriendlyARM/mini6410/games/output

--disable-video-photon

--disable-video-ggi

--enable-joystick

--disable-video-nanox --disable-video-svga --enable-input-tslib

-disable-video-qtopia --disable-alsa # make # make install

5. 将SDL库打包,为接下来操作做准备,打包SDL类库和其它相关的类: 6. 从网上下载《仙剑奇侠传》SDL版本源代码,并将其拷贝到/tmp目录下。 7. 解压其源代码,并且定位到源代码的目录,执行编译操作,在编译完成后,会在sdlpal目录下会生成可执行文件sdlpal_arm。

8. 光有可执行文件还不能直接运行游戏,还需要上网找到相应的《仙剑奇侠传》原版的资源文件,比如声音、图片等等,并拷贝到 /tmp 目录下备用,我创建一个目录output_pal用于存放仙剑的执行文件和资源,然后将资源解压到该目录下,这将会在/opt/FriendlyARM/mini6410/games/output_pal 目录下生成 xianjian 目录。

--disable-video-aalib --disable-video-dummy --disable-video-dga --disable-arts --disable-esd

--disable-video-x11

--disable-nasm

--enable-video-fbcon --host=arm-linux --build=i386

9. 接下来,把编译出来的仙剑可执行文件拷到

/opt/FriendlyARM/mini6410/games/output_pal/bin/目录下,并打包

10. 将 xianjian_setup.tar.gz和sdl_setup.tar.gz拷贝到 u盘中,然后将u盘拷贝到 FriendlyARM 开发板上,在根目录进行解压:

11. 修改启动项内容,使其开机运行run_xianjian.sh脚本 将/etc/init.d/rcS中以下内容:

/bin/qtopia &修改为/bin/run_xianjian.sh &

12. 编写run_xianjian.sh脚本 在/bin 下创建一个脚本run_xianjian.sh @# vi /bin/run_xianjian.sh 在其中输入: #!/bin/sh

export SDL_NOMOUSE=1

export LD_LIBRARY_PATH=/lib:/usr/lib:/xianjian/lib:$LD_LIBRARY_PATH cd /xianjian sdlpal_arm

给脚本 run_xianjian.sh 加上可执行权限:

13. 重启FriendlyARM就可以进入游戏,看到以下界面,则说明进入游戏成功。

5 心得体会

其实,我自己是第一次使用嵌入式,之前只简单学习过单片机,对ARM可以说在研究生生涯之前完全没有任何概念,许多ARM常见知识都不知道。当初选择它作为题目,一方面是因为对游戏的喜爱,另一方面是因为缺少wifi等其他硬件,是在只有一块嵌入式板子的情况下做出来选择。为了完成这一份实验报告,找了许多资料,虽然我自己做的以软件为主,比较简单,但是我仍然感受到了它的复杂深奥。在实际操作中也遇到了各种不懂的难题,比如烧写镜像文件到开发板之中,我曾经花费几个下午一无所获,全都烧写失败,后来才发现是我自己编写ini配置文件错误,每一次ARM开机都因为屏幕读取失败,导致一直没有开机画面。并且实验的最后一步,经常出错,开机之后没有任何提示,后来才发现是修改开机启动项时,由于linux系统保护,复制命令没有添加-f强制复制,不允许我修改开机启动项,每次开机都是原来的启动项而失败。虽然过程很漫长,但是当我看到仙剑这一款游戏启动时,还是觉得物有所值。 6

结论

通过查看学习资料以及相关的文献,我对嵌入式学习的应用有了一定程度上的了解。在此基础之上,我设计开发了这个SDL游戏移植。

具体来说,我在开发时使用的是烧录linux系统到开发板之中,编写SDL代码,生成可执行文件。通过一段时间的学习和研究后,我终于完成了《仙剑奇侠传》游戏能够在FriendlyARM上运行。

在设计和实现这个游戏移植的过程中,我学习到了很多的关于嵌入式的知识。大致上了解了它的特点,功能以及如何实现我深刻体会到了开发必须要建立在认真分析的前提下,以规范化的研究为依托。完整的SDL游戏移植应该是一个庞大而复杂的系统,但是,我所设计的这个移植只能实现一些简单的功能,想要进一步扩展完善它的功能,还需要进一步的学习和研究。

总而言之本文设计的SDL系列游戏在ARM上的移植: 1.烧写了linux到嵌入式开发板之上。

2.实现了《仙剑奇侠传一》在FriendlyARM上的运行。

3.用户界面友好,界面清晰易懂,系统操作起来十分简单,玩起来会很容易。

虽然本系统实现了游戏移植的一些基本功能,但还有很多想要改进和扩展的地方。比如:游戏不能存档。若进一步开发该移植,可以在此基础上提供更多的信息。

参考文献

1. 嵌入式系统 ,eeworld网,2012-09-21 2. 嵌入式 ,开发网,2012-09-21 3. 嵌入式技术介绍 ,5联网,2012-12-16 4. 嵌入式技术特点 ,偶然物联网,2013-01-7

5. 嵌入式开发工程师的未来在哪里? ,OFweek工控网,2015-08-13 6. 经济型闪存将为嵌入式市场带来生机 ,TechTarget,2015-06-7

7. 嵌入式就业人才创新华清远见总裁倡导“兴趣学习” ,北方网,2015-12-14 8. SDL ,中文维基百科,2012-09-7

本文来源:https://www.bwwdw.com/article/mc98.html

Top