【问题标题】:using SDL_Texture* on several SDL_Renderers*在多个 SDL_Renderers* 上使用 SDL_Texture*
【发布时间】:2018-07-20 13:17:09
【问题描述】:

我正在尝试在两个单独的 SDL_Renderer* 上使用相同的 SDL_Texture*,但显然 SDL_Texture 似乎与 SDL_Renderer*“绑定”。
有没有办法让第二个渲染器能够使用第一个渲染器通过 SDL_CreateTextureFromSurface 创建的纹理?如果我尝试通过仅复制 SDL_Texture* 指针并将 SDL_RenderCopy 与第二个渲染器一起使用来执行此操作,则屏幕将保持黑色。

如果需要更多详细信息:
我在 Virtual Studio 中使用 SDL2 库。我有两个独立的 SDL_Window,每个都有一个 SDL_Renderer。包含第一个渲染器的窗口在整个程序中永久存在,而第二个窗口仅在需要时创建并在不久后销毁。

【问题讨论】:

  • 为什么不使用两个SDL_Textures?
  • 我尽量保持低冗余,因为随着程序的增长,使用 2 个 SDL_Texture 会占用大量空间。
  • 您说第二个窗口在创建后不久就被销毁了。为与该窗口关联的渲染器创建纹理并用窗口销毁它不会损害您的内存使用。它确实会影响性能,因为您需要再次复制源表面,但与创建窗口相比,它不会花费太多。
  • 这是真的,但是当我创建第二个窗口时,我使用一个长时间释放的单一表面创建所有纹理。我可以编写一个解决方法以再次加载到表面,但是当我的程序运行时更改源失败时,编写起来会相当不愉快并且可能导致一些奇怪的错误。这就是为什么我问是否有一个简单的方法。
  • 我是否理解在 SDL 2 中的多个窗口中使用位图字体纹理的正确方法是为将使用位图字体纹理的每个窗口创建一组单独的纹理?跨度>

标签: c++ window sdl-2 renderer


【解决方案1】:

不确定,如果这是最直接的方法,但您可以将纹理复制到 SDL_Surface,然后在另一端使用 SDL_CreateTextureFromSurface。

【讨论】:

  • 这将是一个好的解决方案,因为我的问题是内存关键问题,但此时不是真正的时间关键,但我找不到将 SDL_Texture 转换为 SDL_Surface 的方法。
  • @a_familiar_wolf 这可能有问题。您可以使用SDL_RenderReadPixels(不要忘记先将纹理设置为渲染目标,然后将其重置),但它需要使用SDL_TEXTUREACCESS_TARGET 标志创建纹理。如果可以的话,从原始文件重新加载图像看起来是一个更好的解决方案。
  • 问题不大,尽管速度很慢:假设您确实按照@keltar 的建议创建了纹理并创建了一个 SDL_Surface surf,您可以使用 SDL_RenderReadPixels(renderer, &surf->clip_rect, surf->format->format, surf->pixels, surf->pitch) 将像素放入您的表面.之后,一个简单的SDL_CreateTextureFromSurface(renderer, surf) 应该会产生 SDL_Texture。
  • @baueran 我不认为这很简单,但这取决于渲染后端。例如。在这种特殊情况下,在创建纹理时可能不知道另一个渲染器是否需要它,因此最终可能会将 all 纹理标记为渲染目标。这可能具有非零成本(例如,使用 GL/GLES 渲染器为每个纹理分配 FBO),驱动程序可能会将纹理放在可能影响渲染性能的不同内存区域,但最重要的是 - 不需要“目标”纹理来保持其使用 d3d 渲染器丢失设备时的内容(例如切换到全屏)。
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多