一、什么是SDL?
SDL是 “Simple DirectMedia Layer”的縮寫,SDL是一個開源的跨平台的多媒體庫,封裝了復雜的音視頻底層操作,簡化了音視頻處理的難度。
SDL使用C語言寫成,提供了數種控制圖像、聲音、輸出入的函數,可以開發出跨多個平台(Linux、Windows、Mac OS X等)的應用軟件。目前多用於開發游戲、模擬器、媒體播放器等多媒體應用領域。
1. SDL 庫分類
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渲染支持。
2. SDL 子系統分類
SDL 按照功能可以分成下列數個子系統(subsystem):
- Video(圖像): 圖像控制以及線程(thread)和事件管理(event)。
- Audio(聲音): 聲音控制
- Joystick(搖桿): 游戲搖桿控制
- CD-ROM(光盤驅動器): 光盤媒體控制
- Window Management(視窗管理): 與視窗程序設計集成
- Event(事件驅動):處理事件驅動
二、 SDL 開發環境配置
學習階段推薦使用Visual Studio進行學習,因為環境配置方面相對來說比較簡單。后續需要向其他平台遷移的時候,再進一步深入學習和整理。
SDL官網:http://www.libsdl.org/index.php 。目前SDL有兩個版本 1.2 和 2.0,建議學習階段使用 SDL 2.0。
1. 下載SDL Development Libraries
下載地址為:http://www.libsdl.org/download-2.0.php
解壓縮文件,將這個文件夾拷貝到任意地方。
2. 在Visual Studio 中新建一個控制台項目
將第1步解壓的文件的include目錄和lib目錄拷貝到項目的目錄下。
3. 添加include目錄
右鍵打開項目的屬性窗口,找到 C/C++,添加附加包含目錄:

4. 添加 library 目錄
將lib目錄添加配置進來:

5. 添加"附加依賴項"
先找到屬性-->鏈接器--> 輸入---> 附加依賴項,添加附加依賴項:SDL2.lib;SDL2main.lib;

6. 編寫HelloWorld代碼,驗證環境配置
// SDL.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。 // #include "pch.h" #include <iostream> extern "C" { #include "SDL.h" } int main(int argc, char* argv[])
{ if (SDL_Init(SDL_INIT_VIDEO)) { std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN); if (win == nullptr) { std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl; return 1; } SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == nullptr) { SDL_DestroyWindow(win); std::cout << "SDL_CreateRender Error: " << SDL_GetError() << std::endl; SDL_Quit(); return 1; } std::string imagePath = "1.bmp"; SDL_Surface *bmp = SDL_LoadBMP(imagePath.c_str()); if (bmp == nullptr) { SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl; SDL_Quit(); return 1; } SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp); SDL_FreeSurface(bmp); if (tex == nullptr) { SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl; SDL_Quit(); return 1; } for (int i = 0; i < 3; ++i) { SDL_RenderClear(ren); SDL_RenderCopy(ren, tex, NULL, NULL); SDL_RenderPresent(ren); SDL_Delay(1000); } SDL_DestroyTexture(tex); SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); SDL_Quit(); // Return return 0; }
7. 查看代碼運行結果

至此,我們的SDL的環境配置成功了,並且能夠正常使用了。

