現象:調用 `SDL_SetWindowSize` 後視頻幀率暴跌,移動視窗 (`SDL_SetWindowPosition`) 正常。
根因
- SDL 內部 `SDL_OnWindowResized` 處理 `SDL_WINDOWEVENT_SIZE_CHANGED` 事件時,**同步重建渲染目標/纹理**,阻塞渲染線程。
- `SDL_WINDOWEVENT_RESIZED` (用戶拖拽調整) 為**異步通知**,不觸發同步重建。
- 程式碼中直接調用 `SDL_SetWindowSize` 產生 `SIZE_CHANGED`,導致渲染幀同步等待重建完成。
修復方案 (修改 SDL 源碼重編譯)
文件 `src/events/SDL_windowevents.c` 函數 `SDL_OnWindowResized`:
// 原代碼
case SDL_WINDOWEVENT_SIZE_CHANGED:
// 同步重建渲染器/纹理
break;
// 修改為
case SDL_WINDOWEVENT_RESIZED:
// 異步標記需重建,渲染循環中檢查標記非阻塞重建
break;
或**應用層規避**:
- 調整大小前 `SDL_RenderSetLogicalSize` / `SDL_RenderSetViewport` 適配,避免觸發內部重建。
- 使用 `SDL_WINDOW_RESIZABLE` 旗標讓用戶拖拽調整 (產生 `RESIZED`),程式化調整改用 `SDL_RenderSetScale` 縮放而非改視窗大小。
驗證
修改 SDL 源碼重編譯後,`SDL_SetWindowSize` 不再卡頓,視頻播放流暢。