SDL_CreateRendererWithProperties报错
Parameter ‘window’ is invalid
这个错误日志表明,即使你的窗口(p_sdl_window
)被成功创建了,并且你尝试通过属性集(renderer_props
)将其传递给渲染器,但渲染器在创建时仍然认为它没有获得一个有效的窗口。
先说明,本文使用的SDL版本是3.2.14!
SDL_PROP_RENDERER_WINDOW_POINTER
-> SDL_PROP_RENDERER_CREATE_WINDOW_POINTER
(核心问题解决的关键)
修改点: 这是我们经过多次验证,最终发现的导致 window
参数无效的直接原因。 原始代码中:
if (!SDL_SetPointerProperty(renderer_props, SDL_PROP_RENDERER_WINDOW_POINTER, p_sdl_window)) {
修正后:
if (!SDL_SetPointerProperty(renderer_props, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, p_sdl_window)) { // 修正为 CREATE_WINDOW_POINTER
原因和解决的问题: 这个是关键!SDL3 的属性系统对于“创建时设置的属性”和“获取已存在对象属性”使用了不同的命名。
SDL_PROP_RENDERER_WINDOW_POINTER
倾向于用于获取一个已存在渲染器的关联窗口。SDL_PROP_RENDERER_CREATE_WINDOW_POINTER
才是用于在创建渲染器时,明确告知 SDL 这个渲染器应该关联哪个窗口的属性。
当你使用 SDL_PROP_RENDERER_WINDOW_POINTER
去设置时,尽管 SDL_SetPointerProperty
返回了 true
(这本身可能是一个误导性的成功返回,或者说它成功地处理了“设置一个未知属性”这个操作),但实际上渲染器在创建时并没有在 renderer_props
中找到它期望的 SDL_PROP_RENDERER_CREATE_WINDOW_POINTER
。所以它认为 window
参数是无效的。
通过修正为 SDL_PROP_RENDERER_CREATE_WINDOW_POINTER
,我们确保了窗口指针被正确地存储在了渲染器创建函数期望的属性位置,从而解决了 Parameter 'window' is invalid
这个错误。
SDL_PROP_RENDERER_DRIVER_STRING
-> SDL_PROP_RENDERER_CREATE_NAME_STRING
(指定驱动名的修正)
修改点: 类似于窗口指针的属性,用于指定渲染器驱动的名称也需要使用 CREATE
前缀。 原始代码中可能尝试:
// if (!SDL_SetStringProperty(renderer_props, SDL_PROP_RENDERER_DRIVER_STRING, "opengl")) {
修正后:
if (!SDL_SetStringProperty(renderer_props, SDL_PROP_RENDERER_CREATE_NAME_STRING, "opengl")) { // 修正为 CREATE_NAME_STRING
原因和解决的问题: 类似,SDL_PROP_RENDERER_DRIVER_STRING
倾向于用于获取已存在渲染器的驱动名称。SDL_PROP_RENDERER_CREATE_NAME_STRING
才是用于在创建渲染器时指定其应使用的渲染器驱动(例如 “opengl”, “direct3d” 等)。这个修改确保了渲染器能够按照你的意愿尝试使用 OpenGL 驱动。