SDL中SDL_WINDOWEVENT_RESIZED与SDL_WINDOWEVENT_SIZE_CHANGED的区别是什么?
SDL_WINDOWEVENT_RESIZED 与 SDL_WINDOWEVENT_SIZE_CHANGED 的区别解析
我完全理解你的困惑——看着这两个事件的代码示例几乎一模一样,确实会让人摸不着头脑。其实核心差异在于触发的场景和原因,而非它们传递的数据内容:
SDL_WINDOWEVENT_RESIZED:这个事件是专门针对用户主动交互调整窗口大小的场景触发的。比如你用鼠标拖拽窗口的边框、边角来拉伸或缩小窗口,这时候就会触发它。它本质是用来标识“窗口尺寸变更是用户手动发起的”这个动作。
SDL_WINDOWEVENT_SIZE_CHANGED:这个事件的触发范围要宽泛得多——任何导致窗口尺寸改变的情况都会触发它,包括但不限于:
- 用户拖拽窗口边框(此时会同时触发
SDL_WINDOWEVENT_RESIZED和SDL_WINDOWEVENT_SIZE_CHANGED) - 程序通过代码主动调用
SDL_SetWindowSize()修改窗口大小 - 窗口在普通模式、全屏模式、无边框模式之间切换
- 系统层面的变动(比如显示器分辨率调整、窗口被系统自动适配大小)
- 用户拖拽窗口边框(此时会同时触发
举个实际的例子:如果你的程序里有个按钮,点击后调用SDL_SetWindowSize()把窗口改成800x600,这时候只会触发SDL_WINDOWEVENT_SIZE_CHANGED,不会触发SDL_WINDOWEVENT_RESIZED——因为这个尺寸变更是程序主动发起的,不是用户的拖拽操作导致的。
你贴的代码示例处理逻辑看起来一致,是因为两个事件都会通过event->window.data1(宽度)和event->window.data2(高度)传递新的窗口尺寸。但你可以根据业务需求做差异化处理:比如只有用户调整窗口时才需要重新加载纹理资源,那你就只在SDL_WINDOWEVENT_RESIZED分支里处理;如果不管谁触发的尺寸变更都要更新渲染视图,那就在SDL_WINDOWEVENT_SIZE_CHANGED里处理(或者两个分支都处理,但要注意避免重复执行逻辑)。
内容的提问来源于stack exchange,提问作者tuket
相关产品推荐
相关产品推荐

