SDL 以子系統形式管理多媒體資源:視頻、音頻、事件、CDROM、游戲手柄、定時器、錯誤捕獲、線程。啟動時按需初始化,退出時統一清理。
| 函數 | 作用 | 常用參數 |
|---|---|---|
SDL_Init(Uint32 flags) | 初始化指定子系統 | SDL_INIT_VIDEO、SDL_INIT_AUDIO、SDL_INIT_EVERYTHING、按位或組合 |
SDL_InitSubSystem(flags) | 在已初始化後追加子系統 | 同上 |
SDL_Quit() | 關閉所有子系統、釋放資源 | 無 |
SDL_QuitSubSystem(flags) | 關閉指定子系統 | 同上 |
SDL_WasInit(flags) | 檢查子系統是否已初始化 | 返回已初始化標誌位 |
SDL_GetError() | 獲取最後一條錯誤信息 | 返回 const char* |
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError());
return 1;
}
// 註冊退出鉤子,確保任何路徑退出都能清理
atexit(SDL_Quit);
// ... 遊戲主循環 ...
return 0; // 程序正常結束,atexit 自動調用 SDL_Quit()
關鍵點:
int main(int argc, char* argv[]),否則鏈接報錯。atexit(SDL_Quit) 比到處寫 SDL_Quit() 更安全,覆蓋 exit()、return、異常拋出等所有退出路徑。SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32,
SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_HWPALETTE);
if (!screen) { SDL_Quit(); return -1; }
SDL_HWSURFACE:顯存表面,硬件加速。SDL_DOUBLEBUF:雙緩衝,防止撕裂。if (SDL_Init(SDL_INIT_VIDEO) < 0) {
SDL_Log("無法初始化視頻: %s", SDL_GetError());
return EXIT_FAILURE;
}
SDL 2.0+ 推薦使用 SDL_Log 系列輸出日誌,支援分級、Android logcat 等。
掌握「初始化 → 註冊退出鉤子 → 業務邏輯 → 自動清理」模式,能避免 90% 的資源洩漏與崩潰問題,是 SDL 程序穩健運行的基石。