SDL_UpdateTexture 是线程安全的吗?
Posted
技术标签:
【中文标题】SDL_UpdateTexture 是线程安全的吗?【英文标题】:Is SDL_UpdateTexture threadsafe? 【发布时间】:2018-08-20 13:52:19 【问题描述】:我有一个程序可以处理大小为 1920x1080 的纹理,并在多线程环境中通过 SDL_UpdateTexture
更新纹理。纹理在线程之间“平铺”,因此线程 1 将更新与线程 2 不同的区域。例如,t1
将更新区域 0,0,64,64
,t2
将更新 65, 65, 128, 128
。
这种情况下SDL_UpdateTexture
可以不用加锁,让线程并发更新纹理吗?
【问题讨论】:
你已经有了答案,但是如果你想经常更新纹理——你需要一个流式纹理,而不是静态的(而 UpdateTexture 是用于静态纹理的),并且对于流式纹理你可以使用 LockTexture,然后在不同线程中更新零件,并在图形线程中解锁纹理。 谢谢。是的,流媒体可能会更快。就我而言(我做了基准测试),UpdateTexture 函数更快(2ms vs 10ms)。不过还是谢谢你的提示! 【参考方案1】:看看
Multithreaded Rendering on OpenGL
但是,简单地说:GL 不是线程安全的(甚至不是线程感知的)。在 Windows 上,您一次不能在多个线程上激活上下文,因此如果不同步线程(这违背了多线程的目的),您将无法更新纹理。我敢打赌,在 Linux 上也是如此。
【讨论】:
非常感谢。我认为 SDL 可能会以某种方式处理库内部的问题。但接下来我将创建另一个线程,负责上传纹理和更新像素数据的线程。谢谢。 @Nidhoegger 如果你喜欢冒险,看看 Vulkan。这不是为了伪装,而是命令缓冲区等使实现高性能多线程渲染器变得更加容易。此外,使用 SDL:developer.tizen.org/development/guides/native-application/… 我打算在某个时候看看 vulkan。也许现在已经达到了这一点:P。感谢您的提示!以上是关于SDL_UpdateTexture 是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章