avs


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

SDL2.0入门简介

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


image.png

SDL使用GNU宽通用公共许可证为授权方式,意指动态链接(dynamic link)其库并不需要开放本身的源代码。因此诸如《雷神之锤4》等商业游戏也使用SDL来开发。



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


SDL的“标准库”

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

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

SDL_net—网络支持。

SDL_ttf—TrueType字体渲染支持。

SDL_rtf—简单的RTF渲染支持。

image.png



子系统

SDL将功能分成下列数个子系统(subsystem):

Video(图像)—图像控制以及线程(thread)和事件管理(event)。

Audio(声音)—声音控制

Joystick(摇杆)—游戏摇杆控制

CD-ROM(光盘驱动器)—光盘媒体控制

Window Management(视窗管理)-与视窗程序设计集成

Event(事件驱动)-处理事件驱动



以下是一支用C语言写成、非常简单的SDL示例:

// Headers
#include "SDL.h"
 
// Main function
int main(int argc, char* argv[])
{
    // Initialize SDL
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
        return(1);
 
    // Delay 2 seconds
    SDL_Delay(2000);
 
    // Quit SDL
    SDL_Quit();
 
    // Return
    return 0;
}

SDL 整体框架

    SDL的整个框架结构:这里我们可以看到,SDL是个跨平台多支持的渲染框架,完成在硬件驱动层之上的抽离,实现Window linux Android等一系列平台的适配。如此,我们可以使用SDL完成我们的逻辑开发,便可以快速编译到各个平台,实现跨平台。


image.png



SDL 可以干什么


视频

    3D图形:

        SDL可以与OpenGL API或Direct3D API结合使用,用于3D图形

    加速2D渲染API:

        支持简单旋转,缩放和Alpha混合,所有这些都使用最新的3D API加速

        使用OpenGL和Direct3D支持加速

    创建和管理多个窗口

输入事件

    提供的事件和API方法如下:

        应用程序和窗口状态更改

        鼠标输入

        键盘输入

        操纵杆和游戏控制器输入

        多点触控手势

    可以使用SDL_EventState()启用或禁用每个事件

    在发布到内部事件队列之前,事件将通过用户指定的过滤器函数传递

    线程安全事件队列

音频

    设置8位和16位音频,单声道立体声或5.1环绕声的音频播放,如果硬件不支持格式,可选择转换

    音频在单独的线程中独立运行,通过用户回调机制处理

    专为自定义软件音频混音器而设计,其中SDL_mixer提供完整的音频/音乐输出库

文件I / O抽象

    通用抽象开放,读写数据

    内置支持文件和内存支持

共享对象支持

    加载共享对象(Windows上的DLL,Mac OS X上的.dylib,Linux上的.so)

    共享对象中的查找方法,调用

线程

    简单线程创建API

    简单线程本地存储API

    互斥量,信号量和条件变量

    用于无锁编程的原子操作

计时器

    获取流逝的毫秒数

    等待指定的毫秒数

    在单独的线程中创建与代码并行运行的计时器

    使用高分辨率计数器进行分析

CPU特征检测

    查询CPU数量

    检测CPU功能和支持的指令集

支持大小端检测

    检测当前系统的字节顺序

    用于快速交换数据值的例程

    读取和写入指定字节数据的数据

电源管理

    查询电源管理状态


SDL的总体概况

    SDL主要围绕着实现一套快速渲染的框架,同时能够兼容更多平台。除了渲染之外,做了一些外围扩展,比如播放更多音频格式,支持渲染TTF字体,支持加载更多图片格式,同时实现了网络请求。除此之外,SDL直接能做的事情确实比较少,需要我们自己去扩展,去将三方的其他库封装过来,以便提供更强大的开发支撑。


    从现在开始,我会带领大家,一起领略SDL的风采,在快速学习掌握使用的基础上,进行原理学习,技能扩展,提升。


在完成原理,使用讲解之后,我会移植一些开源库,来支援SDL框架,使得SDL可以开发简单,轻量级别的游戏。


    那么你准备好了吗?






三个图形库SDL、OpenGL、DX/D3D


SDL与DirectX比较对应关系:

SDL DirectX 说明

SDL_Video、SDL_Image、OpenGL DirectDraw、Direct3D  

SDL_Audio、SDL_Mixer DirectSound  

SDL_Joystick、SDL_Base DirectInput  

SDL_Net DirectPlay  

SMPEG、SDL_Video、SDL_Audio、SDL_Sound、SDL_Filter DirectShow  


OpenGL是由SGI公司1992年7月发布,是一款基于桌面操作系统、功能强大、调用方便的底层3D图形库。 它是与硬件无关的软件接口, 可以在windows/Linux/Unix 之间移植。

针对嵌入式设备图形开发的标准 OpenGL ES, 是 OpenGL的一个子集。 OpenGL ES是一种独立的平台无关的三维图形开发库,在各种语言下进行主框架开发并结合应用,使用OpenGL ES函数可以开发出三维游戏。


SDL(Simple DirectMedia Layer)作为免费的跨平台多媒体应用编程接口,已经被人们广泛用于开发二维游戏,其优秀的消息框架支持、文件支持和声音支持都使得它能与微软DirectX匹敌。


现在很多game游戏里面,都采用 SDL+OpenGL ES 的模式来绘制3D界面。 可以让SDL使用OpenGL ES的函数接口来渲染3D。




#1 DirectX(包含Direct3D) 和 OpenGl 都是 API

API = Application Program Interface  应用程序编程接口


API允许开发者(游戏开发者或者视频CAD开发者等)使用预定义的函数调用让开发游戏或者使用CAD更方便。DX和OpenGL定义了多种方式去渲染图片,而且他们提供了中间层去控制硬件和软件,(译者注:某著名学者说过,任何计算机的问题都可以通过添加中间层的方式解决)。这些预定义的控制层简化了视频软件开发如游戏。


当使用特定功能的API时,开发者会在开发写代码的时候会更简单快捷,否则开发者必须自己去写所有的图形渲染。


#2 默认情况下,Win95以上的Windows系统在某种程度上已经包含了所有早期版本的API

所以他们不必去安装早期的版本,不过需要实时更新。


#3下面是我们一定要知道的DX和OpenGL的差异

OpenGl单纯是一个图形渲染API,所以它只能处理图像


DirectX包含图形(Direct3D)、声音甚至网络API,他们全都在一个package里


#4 DX和OpenGl的背景

D3D(现在包含在DX)是由微软发明用来对抗OpenGL的,微软发明的D3D会更简单,微软希望D3D未来会比OpenGL更强大,并取代他。(译者注:D3D的API源码真的比OpenGL的简洁太多)


OpenGL是SGI公司在1980年发明的一门语言,开始SGI公司只是内部使用其强大的图形渲染能力,慢慢的,他们意识到如果想让其成为行业标准,必须开源允许其他公司来一起定义规范。


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***