SDL
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用c语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
简介
Simple DirectMedia Layer ( SDL ) 是一个跨平台软件开发库,旨在为计算机多媒体硬件组件提供硬件抽象层。软件开发人员可以使用它来编写可以在Android、iOS、Linux、Mac OS和Windows等多种操作系统上运行的高性能电脑游戏和其他多媒体应用程序。SDL的作者是Sam Lantinga, Loki Entertainment Software的主力程序员(Lead Programmer)。SDL 2.0 于 2013 年发布,与之前的版本有很大不同,提供更多用于 3D 硬件加速的机会,但打破了向后兼容性。
功能介绍
SDL提供了丰富的功能,包括视频、事件、音频、CD音频、线程和定时器等。
SDL 2.0 版本起,增加了对 Mir 和 Wayland 的支持,并在 SDL 2.0.4 中默认启用。2.0.4 版本还为 Android 提供了更好的支持。
SDL 的语法是基于函数的,所有操作都是通过向子程序(函数)传递参数来完成的。
SDL 分为几个子系统,包括基础、视频、输入事件、力反馈、音频、线程、计时器、文件抽象、共享对象支持、平台和 CPU 信息、电源管理等。
SDL支持的功能
视频
设置8bpp或更高的任意色彩深度的视频模式。如果某个模式硬件不支持,可以选择转化为另一模式。
直接写入线性的图像帧缓冲(framebuffer)。
用颜色键值(colorkey)或者alpha混合属性创建surface。
Surface的blit能自动的转化为目标格式。blit是优化过的,并能使用硬件加速。x86平台上有针对MMX优化过的blit。
硬件加速的blit和fill(填充)操作,如果硬件支持的话。
事件
提供以下事件:
应用程序的visibility发生改变
键盘输入
鼠标输入
用户要求的退出
每种事件都能通过SDL_EventState() 关闭或者打开。
事件经由用户指定的过滤函数再被加入到内部的事件队列。
线程安全的事件队列。
音频
设置8位和16位的音频,单声道或者立体声,如果格式硬件不支持,可以选择转换。
由独立的线程执行音频部分,并提供用户回调(callback)机制。
设计上考虑到了客户定制的软混音器,但实际上在例程中就包含了一个完整的音频/音乐输出库。
CD音频
完整的CD音频控制API
线程
简单的线程创建API
用于同步的简单的二进制信号量(semaphores)
定时器
读取已流逝的毫秒数。
等待指定的毫秒数。
设置一个10毫秒精度的周期性定时器。
字节序无关
侦测当前系统的字节序
快速转换数据的函数
读写指定字节序的数据
结构与特色
虽然SDL时常被比较为‘跨平台的DirectX’,然而事实上SDL是定位成以精简的方式来完成基础的功能,它大幅度简化了控制图像、声音、输出入等工作所需撰写的代码。但更高阶的绘图功能或是音效功能则需搭配OpenGL和OpenAL等API来达成。另外它本身也没有方便建立图形用户界面的函数。
SDL在结构上是将不同操作系统的函式库再包装成相同的函数,例如SDL在Windows平台上其实是DirectX的再包装,旧版本包装的是DirectX 5,SDL 1.2则是DirectX 7。而在使用X11的平台上(包括Linux),SDL则是与Xlib函式库沟通来输出图像。
虽然SDL本身是使用c语言写成,但是它几乎可以被所有的编程语言所使用,例如:C++、Perl、Python(借由Pygame函式库)、Pascal等等,甚至是Euphoria、Pliant这类较不流行的编程语言也都可行。
软件应用
SDL在大型和小型项目中都得到广泛使用。例如,MobyGames 在 2013 年列出了 120 款使用 SDL 的游戏,而 SDL 网站本身在 2012 年列出了约 700 款游戏。SDL 用于教授多媒体和计算机科学的大学课程,例如,2010 年卡迪兹大学使用 libSDL 的游戏编程研讨会,或 2015 年 UTFPR(蓬塔格罗萨校区)的游戏设计课程。此外,一些非视频游戏程序也使用 SDL;例如,模拟器,如 DOSBox、FUSE ZX Spectrum 模拟器和 VisualBoyAdvance。有几本书是为使用 SDL 开发而写的。
参考资料
Warning: Invalid argument supplied for foreach() in /www/wwwroot/newbaike.com/id.php on line 280