【问题标题】:C++/SDL threading - events break downC++/SDL 线程 - 事件分解
【发布时间】:2010-12-07 00:27:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c++ multithreading sdl


    【解决方案1】:

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

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

    【讨论】:

    • 原来我就是这么干的;修复它的唯一方法是在主线程中分配屏幕并将其传递给图形线程
    • @Robot:然后你必须在主线程上做你的图形相关工作。那是平台特定的。 Win32(我相信)没有这样的限制,但其他窗口系统可能。
    • 哎呀,感谢您的提醒!我在 Windows 上运行,当我从我的 Gentoo 机器切换时它不是多线程的。现在换了。
    【解决方案2】:

    由于各种平台上的一些技术考虑,图形显示逻辑应该几乎总是在主线程中。

    同样,事件处理(至少在低级别)应该在主线程中,因为事件可以发布到特定线程而不是进程。

    在大多数情况下,我建议不要从主线程以外的任何地方调用任何 SDL 函数,除了那些不在共享状态上运行的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      相关资源
      最近更新 更多