首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SDL2 視窗調整大小導致視頻卡頓:SDL_WINDOWEVENT_SIZE_CHANGED 與 RESIZED 事件差異修復

     編輯:程式設計綜合問答

現象:調用 `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` 不再卡頓,視頻播放流暢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved