[{"data":1,"prerenderedAt":608},["ShallowReactive",2],{"page-\u002Fgraphy\u002Fsdl3":3},{"id":4,"title":5,"body":6,"description":12,"extension":597,"meta":598,"navigation":603,"path":604,"seo":605,"stem":606,"__hash__":607},"content\u002Fgraphy\u002FSDL3.md","SDL3",{"type":7,"value":8,"toc":591},"minimark",[9,13,17,20,151,154,157,160,293,305,486,511,514,588],[10,11,12],"p",{},"SDL即Simple DirectMedia Layer，类似DirectX，是完整的游戏、多媒体开发包，但不同的是它跨越几乎所有的平台，有各种语言的接口，多种语言的文档，而这一切都是广大志愿者完成的。目前扩展部分还没有正式的文档，以下为核心部分文档的向导部分。",[14,15,16],"h2",{"id":16},"主要架构",[10,18,19],{},"SDL 的全部工作就是「把平台差异挡在下面，给你一套统一函数」。所以它的架构是纵向切开的四层：",[21,22,27,28,27,32,27,36,27,58,27,67,27,79,27,86,27,94,27,100,27,106,27,110,27,115,27,120,27,125,27,129,27,132,27,136,27,140,27,144,27,147],"svg",{"width":23,"viewBox":24,"role":25,"xmlns":26},"100%","0 0 680 438","img","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","\n  ",[29,30,31],"title",{},"SDL3 分层架构",[33,34,35],"desc",{},"自上而下：你的应用、SDL3 公共 API 层、子系统层、后端驱动层，最后落到操作系统与硬件。",[37,38,39,40,27],"defs",{},"\n    ",[41,42,49,50,39],"marker",{"id":43,"viewBox":44,"refX":45,"refY":46,"markerWidth":47,"markerHeight":47,"orient":48},"arrow","0 0 10 10","8","5","6","auto-start-reverse","\n      ",[51,52],"path",{"d":53,"fill":54,"stroke":55,"stroke-width":56,"stroke-linecap":57,"stroke-linejoin":57},"M2 1L8 5L2 9","none","context-stroke","1.5","round",[59,60],"rect",{"x":61,"y":62,"width":63,"height":62,"rx":45,"fill":64,"stroke":65,"stroke-width":66},"230","40","220","#085041","#5DCAA5","0.5",[68,69,78],"text",{"x":70,"y":71,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":76,"font-weight":77},"340","60","#9FE1CB","middle","central","system-ui, sans-serif","14","500","你的应用（C \u002F C++）",[80,81],"line",{"x1":70,"y1":82,"x2":70,"y2":83,"stroke":84,"stroke-width":56,"marker-end":85},"80","97","#B4B2A9","url(#arrow)",[59,87],{"x":62,"y":88,"width":89,"height":90,"rx":91,"fill":92,"stroke":93,"stroke-width":66},"100","600","258","20","#2C2C2A","#5F5E5A",[68,95,99],{"x":71,"y":96,"fill":97,"font-family":75,"font-size":98,"font-weight":77},"124","#888780","13","SDL3 运行库（libSDL3 \u002F SDL3.dll）",[59,101],{"x":71,"y":102,"width":103,"height":104,"rx":105,"fill":64,"stroke":65,"stroke-width":66},"142","560","48","10",[68,107,109],{"x":82,"y":108,"fill":72,"dominant-baseline":74,"font-family":75,"font-size":76,"font-weight":77},"160","公共 API 层",[68,111,114],{"x":82,"y":112,"fill":65,"dominant-baseline":74,"font-family":75,"font-size":113},"180","12","统一的 SDL_* 函数，头文件按子系统拆分",[59,116],{"x":71,"y":117,"width":103,"height":118,"rx":105,"fill":119,"stroke":93,"stroke-width":66},"200","64","#444441",[68,121,124],{"x":82,"y":122,"fill":123,"dominant-baseline":74,"font-family":75,"font-size":76,"font-weight":77},"222","#D3D1C7","子系统层",[68,126,128],{"x":82,"y":127,"fill":84,"dominant-baseline":74,"font-family":75,"font-size":113},"244","Video · Audio · Events · Input · Threads · Timer · IO · GPU …",[59,130],{"x":71,"y":131,"width":103,"height":118,"rx":105,"fill":119,"stroke":93,"stroke-width":66},"274",[68,133,135],{"x":82,"y":134,"fill":123,"dominant-baseline":74,"font-family":75,"font-size":76,"font-weight":77},"296","后端驱动层",[68,137,139],{"x":82,"y":138,"fill":84,"dominant-baseline":74,"font-family":75,"font-size":113},"318","win32 · cocoa · X11 · Wayland · KMSDRM · Android · iOS · Emscripten",[80,141],{"x1":70,"y1":142,"x2":70,"y2":143,"stroke":84,"stroke-width":56,"marker-end":85},"358","375",[59,145],{"x":61,"y":146,"width":63,"height":62,"rx":45,"fill":119,"stroke":93,"stroke-width":66},"378",[68,148,150],{"x":70,"y":149,"fill":123,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":76},"398","操作系统 \u002F 硬件",[10,152,153],{},"驱动层是运行时选的，不是编译器写死，SDL_Init(SDL_INIT_VIDEO)会按照优先级探测，windows上先试d3d\u002Fdxgi再试win32；linux平台上先试wayland、x11、kmsdrm。可以通过SDL_HINT_VIDEODRIVER或者环境变量SDL_VIDEODRIVER=x11来强制制定。",[10,155,156],{},"子系统是可以裁剪的，静态编译的时候可以关掉不需要的模块比如不编译音频、手柄，这个是sdl可以塞进switch、ps2、机顶盒这类设备的原因。",[10,158,159],{},"纵向是「层次」，横向是「功能块」。SDL3 的头文件就是它的模块清单，一个头文件对应一个子系统：",[21,161,27,163,27,166,27,169,27,173,27,178,27,183,27,189,27,192,27,196,27,199,27,203,27,205,27,208,27,211,27,215,27,217,27,221,27,223,27,227,27,229,27,232,27,234,27,237,27,240,27,244,27,247,27,251,27,253,27,256,27,259,27,263,27,265,27,268,27,270,27,273,27,275,27,278,27,280,27,283,27,285,27,288,27,290],{"width":23,"viewBox":162,"role":25,"xmlns":26},"0 0 680 338",[29,164,165],{},"SDL3 子系统分组",[33,167,168],{},"四个分组：显示与渲染、音频、输入、基础设施。高亮的是入门最先接触的模块。",[59,170],{"x":62,"y":62,"width":171,"height":172,"rx":113,"fill":92,"stroke":93,"stroke-width":66},"290","132",[68,174,177],{"x":175,"y":176,"fill":123,"dominant-baseline":74,"font-family":75,"font-size":98,"font-weight":77},"56","66","显示与渲染",[59,179],{"x":175,"y":82,"width":96,"height":180,"rx":45,"fill":181,"stroke":182,"stroke-width":66},"32","#633806","#EF9F27",[68,184,188],{"x":185,"y":186,"fill":187,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"118","96","#FAC775","Video",[59,190],{"x":191,"y":82,"width":96,"height":180,"rx":45,"fill":181,"stroke":182,"stroke-width":66},"190",[68,193,195],{"x":194,"y":186,"fill":187,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"252","Renderer",[59,197],{"x":175,"y":198,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},"120",[68,200,202],{"x":185,"y":201,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"136","GPU",[59,204],{"x":191,"y":198,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,206,207],{"x":194,"y":201,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"Camera",[59,209],{"x":210,"y":62,"width":171,"height":172,"rx":113,"fill":92,"stroke":93,"stroke-width":66},"350",[68,212,214],{"x":213,"y":176,"fill":123,"dominant-baseline":74,"font-family":75,"font-size":98,"font-weight":77},"366","音频",[59,216],{"x":213,"y":82,"width":96,"height":180,"rx":45,"fill":181,"stroke":182,"stroke-width":66},[68,218,220],{"x":219,"y":186,"fill":187,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"428","Audio Stream",[59,222],{"x":77,"y":82,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,224,226],{"x":225,"y":186,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"562","Audio Device",[59,228],{"x":213,"y":198,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,230,231],{"x":219,"y":201,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"WAV 加载",[59,233],{"x":77,"y":198,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,235,236],{"x":225,"y":201,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"格式转换",[59,238],{"x":62,"y":239,"width":171,"height":172,"rx":113,"fill":92,"stroke":93,"stroke-width":66},"186",[68,241,243],{"x":175,"y":242,"fill":123,"dominant-baseline":74,"font-family":75,"font-size":98,"font-weight":77},"212","输入",[59,245],{"x":175,"y":246,"width":96,"height":180,"rx":45,"fill":181,"stroke":182,"stroke-width":66},"226",[68,248,250],{"x":185,"y":249,"fill":187,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"242","Events",[59,252],{"x":191,"y":246,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,254,255],{"x":194,"y":249,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"Keyboard\u002FMouse",[59,257],{"x":175,"y":258,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},"266",[68,260,262],{"x":185,"y":261,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"282","Gamepad",[59,264],{"x":191,"y":258,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,266,267],{"x":194,"y":261,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"Haptic\u002FSensor",[59,269],{"x":210,"y":239,"width":171,"height":172,"rx":113,"fill":92,"stroke":93,"stroke-width":66},[68,271,272],{"x":213,"y":242,"fill":123,"dominant-baseline":74,"font-family":75,"font-size":98,"font-weight":77},"基础设施",[59,274],{"x":213,"y":246,"width":96,"height":180,"rx":45,"fill":181,"stroke":182,"stroke-width":66},[68,276,277],{"x":219,"y":249,"fill":187,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"Threads",[59,279],{"x":77,"y":246,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,281,282],{"x":225,"y":249,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"Timer",[59,284],{"x":213,"y":258,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,286,287],{"x":219,"y":261,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"IOStream",[59,289],{"x":77,"y":258,"width":96,"height":180,"rx":45,"fill":64,"stroke":65,"stroke-width":66},[68,291,292],{"x":225,"y":261,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":113},"Properties",[10,294,295,299,300,304],{},[296,297,298],"strong",{},"几块正式模块","（对应 ",[301,302,303],"code",{},"include\u002FSDL3\u002F"," 下的头文件）：",[306,307,308,324],"table",{},[309,310,311],"thead",{},[312,313,314,318,321],"tr",{},[315,316,317],"th",{},"组",[315,319,320],{},"头文件",[315,322,323],{},"干什么",[325,326,327,341,354,369,385,413,429,442,461],"tbody",{},[312,328,329,333,338],{},[330,331,332],"td",{},"视频",[330,334,335],{},[301,336,337],{},"SDL_video.h",[330,339,340],{},"窗口、显示器、HiDPI、全屏、OpenGL\u002FVulkan\u002FMetal\u002FD3D 上下文",[312,342,343,346,351],{},[330,344,345],{},"渲染",[330,347,348],{},[301,349,350],{},"SDL_render.h",[330,352,353],{},"2D 绘制：纹理、矩形、线段、旋转、裁剪",[312,355,356,358,363],{},[330,357,202],{},[330,359,360],{},[301,361,362],{},"SDL_gpu.h",[330,364,365,368],{},[296,366,367],{},"新增","。跨后端 3D\u002F计算，一套 API 跑 Vulkan \u002F Metal \u002F D3D12 \u002F WebGPU",[312,370,371,374,379],{},[330,372,373],{},"事件",[330,375,376],{},[301,377,378],{},"SDL_events.h",[330,380,381,382],{},"事件队列，是",[296,383,384],{},"所有输入的入口",[312,386,387,389,410],{},[330,388,243],{},[330,390,391,394,395,394,398,394,401,394,404,394,407],{},[301,392,393],{},"SDL_keyboard.h"," \u002F ",[301,396,397],{},"SDL_mouse.h",[301,399,400],{},"SDL_gamepad.h",[301,402,403],{},"SDL_joystick.h",[301,405,406],{},"SDL_pen.h",[301,408,409],{},"SDL_sensor.h",[330,411,412],{},"键鼠、手柄（统一映射）、压感笔、陀螺仪",[312,414,415,417,422],{},[330,416,214],{},[330,418,419],{},[301,420,421],{},"SDL_audio.h",[330,423,424,425,428],{},"设备枚举 + ",[301,426,427],{},"SDL_AudioStream","（播放\u002F录音流）",[312,430,431,434,439],{},[330,432,433],{},"线程",[330,435,436],{},[301,437,438],{},"SDL_thread.h",[330,440,441],{},"线程、互斥量、信号量、原子操作",[312,443,444,447,458],{},[330,445,446],{},"IO",[330,448,449,394,452,394,455],{},[301,450,451],{},"SDL_iostream.h",[301,453,454],{},"SDL_filesystem.h",[301,456,457],{},"SDL_asyncio.h",[330,459,460],{},"替代 stdio 的统一读写；异步 IO 是新增",[312,462,463,466,483],{},[330,464,465],{},"系统",[330,467,468,394,471,394,474,394,477,394,480],{},[301,469,470],{},"SDL_timer.h",[301,472,473],{},"SDL_properties.h",[301,475,476],{},"SDL_log.h",[301,478,479],{},"SDL_dialog.h",[301,481,482],{},"SDL_camera.h",[330,484,485],{},"计时、属性系统、日志、文件对话框、摄像头（新增）",[10,487,488,489,492,493,496,497,500,501,504,505,496,508],{},"还有一批「冷门但真能用」的：",[301,490,491],{},"SDL_messagebox.h","（原生弹窗）、",[301,494,495],{},"SDL_clipboard.h","、",[301,498,499],{},"SDL_tray.h","（托盘图标，新增）、",[301,502,503],{},"SDL_power.h","（电量）、",[301,506,507],{},"SDL_locale.h",[301,509,510],{},"SDL_process.h",[14,512,513],{"id":513},"入手顺序",[21,515,27,517,27,520,27,523,27,525,27,531,27,534,27,537,27,541,27,543,27,546,27,549,27,552,27,556,27,559,27,562,27,565,27,568,27,571,27,573,27,577,27,580,27,584],{"width":23,"viewBox":516,"role":25,"xmlns":26},"0 0 680 358",[29,518,519],{},"SDL3 上手路径",[33,521,522],{},"四步递进：先搭窗口和事件循环骨架，再用 Renderer 绘制，然后接入音频，最后按需选一个方向深入。",[59,524],{"x":62,"y":62,"width":89,"height":118,"rx":105,"fill":64,"stroke":65,"stroke-width":66},[526,527],"circle",{"cx":528,"cy":529,"r":76,"fill":530,"stroke":65,"stroke-width":66},"70","72","#04342C",[68,532,533],{"x":528,"y":529,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":98,"font-weight":77},"1",[68,535,536],{"x":186,"y":118,"fill":72,"dominant-baseline":74,"font-family":75,"font-size":76,"font-weight":77},"开窗口 + 事件循环",[68,538,540],{"x":186,"y":539,"fill":65,"dominant-baseline":74,"font-family":75,"font-size":113},"86","SDL_Init → SDL_CreateWindow → while (SDL_PollEvent)",[59,542],{"x":62,"y":185,"width":89,"height":118,"rx":105,"fill":64,"stroke":65,"stroke-width":66},[526,544],{"cx":528,"cy":545,"r":76,"fill":530,"stroke":65,"stroke-width":66},"150",[68,547,548],{"x":528,"y":545,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":98,"font-weight":77},"2",[68,550,551],{"x":186,"y":102,"fill":72,"dominant-baseline":74,"font-family":75,"font-size":76,"font-weight":77},"用 Renderer 画东西",[68,553,555],{"x":186,"y":554,"fill":65,"dominant-baseline":74,"font-family":75,"font-size":113},"164","SDL_CreateRenderer → SDL_RenderTexture → SDL_RenderPresent",[59,557],{"x":62,"y":558,"width":89,"height":118,"rx":105,"fill":64,"stroke":65,"stroke-width":66},"196",[526,560],{"cx":528,"cy":561,"r":76,"fill":530,"stroke":65,"stroke-width":66},"228",[68,563,564],{"x":528,"y":561,"fill":72,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":98,"font-weight":77},"3",[68,566,567],{"x":186,"y":63,"fill":72,"dominant-baseline":74,"font-family":75,"font-size":76,"font-weight":77},"接入音频",[68,569,570],{"x":186,"y":249,"fill":65,"dominant-baseline":74,"font-family":75,"font-size":113},"SDL_OpenAudioDeviceStream + 回调里往流里写采样",[59,572],{"x":62,"y":131,"width":89,"height":118,"rx":105,"fill":181,"stroke":182,"stroke-width":66},[526,574],{"cx":528,"cy":575,"r":76,"fill":576,"stroke":182,"stroke-width":66},"306","#412402",[68,578,579],{"x":528,"y":575,"fill":187,"text-anchor":73,"dominant-baseline":74,"font-family":75,"font-size":98,"font-weight":77},"4",[68,581,583],{"x":186,"y":582,"fill":187,"dominant-baseline":74,"font-family":75,"font-size":76,"font-weight":77},"298","选一个方向深入",[68,585,587],{"x":186,"y":586,"fill":182,"dominant-baseline":74,"font-family":75,"font-size":113},"320","GPU API \u002F Gamepad \u002F Camera \u002F 线程池 \u002F 自定义平台后端",[10,589,590],{},"继续更新",{"title":592,"searchDepth":593,"depth":593,"links":594},"",2,[595,596],{"id":16,"depth":593,"text":16},{"id":513,"depth":593,"text":513},"md",{"date":599,"tags":600},"2026-10-17",[601,602],"cpp","sdl",true,"\u002Fgraphy\u002Fsdl3",{"description":12},"graphy\u002FSDL3","f04CD07POyyf2IuJFiXAp70Y8XBWUp44j4LF6ywS7t4",1792338205485]