C++/SDL 线程 - 事件分解

标签 c++ multithreading sdl

我有一款贪吃蛇游戏正在开发中(在 https://github.com/RobotGymnast/Gingerbread/tree/eventThreaded 上)。最初,一切(图形、事件、游戏逻辑更新、物理)都从“主”线程调用。然后我开始多线程(使用升压线程)。这非常简单,但我最近将图形显示逻辑拆分到一个新线程中,该线程在其本地堆栈空间中分配了屏幕对象。然后我将我的事件检测和事件处理逻辑拆分到一个新线程中。然后我的屏幕停止出现。从我的命令行输出来看,一切仍然正常,只是屏幕停止出现。原来它卡在我的 SDL_SetVideoMode() 调用上。

我通过在“主”线程中分配屏幕对象并传入对图形线程的引用来解决此问题。出于某种原因,在事件逻辑的新线程中分配屏幕对象会产生问题。

自此修复后,事件检测和事件处理不再有效。事件检查仍在进行中,例如SDL_PollEvent(),但它们根本没有接收任何事件(键盘、鼠标等)。

我怀疑 SDL 可能会进行一些幕后线程同步,但我一直在使用增强线程。这可能是个问题吗? SDL 线程相当严格,我宁愿不切换。

有人遇到过这个问题吗?有什么建议吗?

最佳答案

我不确定 SDL,但在几个窗口子系统上(我相信在 X 和 Win32 上),你不能修改与图形对象或小部件相关的任何东西,除了最初创建该图形对象/小部件的线程.

它看起来不像(在我有限的 10 秒谷歌搜索中)SDL 从你那里抽象出来——你只需要从创建它们的线程修改图形相关对象。否则就是招致奇怪的行为。

关于C++/SDL 线程 - 事件分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4372312/

相关文章:

c++ - 在 for 循环中创建和存储数组

c++ - MSVC 链接到调试版本中的发布库而不是调试版本

c# - 在 C# .NET 标准中,为什么使用位测试 "Running"确定线程状态 `(ThreadState & (Stopped | Unstarted)) == 0`

c++ - Microsoft Visual Studio 2013 链接错误 1104

c++ - 'this' 指针存储在计算机内存中的什么位置?

c++ - 准备 vim 环境以使用 clang-format

java - 寻找多线程死锁的原因?

java - 如果未收到数据,请发送并重试数据?

c++ - SDL 将光标更改为 Windows 默认值

windows - 尝试使用 pkg-config 但它不是注册命令