【问题标题】:cocos2d-x: loading sprite from another thread not possible, any pattern?cocos2d-x:不可能从另一个线程加载精灵,任何模式?
【发布时间】:2014-01-27 05:40:29
【问题描述】:

我的程序的事实

  1. Cocos2d-x 主循环在自己的线程中运行。我们称之为 cocos2d-x-thread。
  2. 我有一个task_scheduler,它在自己的线程中运行,您可以在其中提交轻量级任务。我们称之为 task_scheduler-thread。
  3. 每隔 x 毫秒,就会从 task_scheduler 线程发出一个回调。我们称之为 task_scheduler-tick-callback。

我想做的事

我想在发出 task_scheduler-tick-callback 时加载一个精灵,但我无法从该线程执行此操作,所以我必须提交某种工作 由 cocos2d-x 线程 执行。

问题

  1. 我怎样才能让cocos2d-x-thread,在收到这个work时,被执行?因为 cocos2d-x 已经在运行自己的循环,并且我想不惜一切代价避免将自定义代码注入到 cocos2d-x 生成的项目中。

任何模式?

编辑:想法 -> 在 cocos2d-x 中为每个循环迭代调用的任何回调函数?那存在吗?我可以像这样将调用整合到我的作品中。

【问题讨论】:

  • 搜索线程同步,注意cocos2d本身不是线程安全的
  • 好吧,我猜我对线程同步的了解已经够多了。我的主要问题是让 cocos-2d-x-thread 调用我提交的工件,而无需在该侧添加或删除代码。我认为应该有回调。
  • 为什么不安排一个更新选择器(方法),例如在现场,然后从那里运行你的线程?

标签: c++ multithreading design-patterns cocos2d-x


【解决方案1】:

使用它在主线程中执行您的代码:

Director::getInstance()->getScheduler()->performFunctionInCocosThread([]{
    // your code
});

【讨论】:

    【解决方案2】:

    实现这一点的最简单(并且可能不是最优雅)的方法是拥有一种缓冲区(即std::list)和一种定期检查缓冲区中是否有新数据的方法。在 cocos 中,这样的函数是在每帧之间运行的每个 (CC)Scene 上的 void update(float dt),或者您也可以安排自己的所需时间间隔。

    当然读取和写入缓冲区需要在临界区完成。

    【讨论】:

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