【问题标题】:Should I run each plugin in its own thread?我应该在自己的线程中运行每个插件吗?
【发布时间】:2011-11-01 14:22:41
【问题描述】:

在我的游戏中,用户可以加载自定义脚本。 通常会加载 50-100 个脚本。 每个脚本都会通过其 Update 方法在每一帧中调用。

  1. 当一个脚本崩溃时,其他脚本不应该受到影响。
  2. 脚本更新方法允许每帧最多运行 1 毫秒。所以我还需要能够中止被冻结/没有及时反应的脚本。

我该怎么做?我认为每秒启动 3000 - 6000 个线程并不是最佳实践。 一旦在循环中调用 Update 并等待 16 毫秒,我也无法启动线程,因为脚本需要与游戏同步。脚本依赖于每帧运行。

线程池在这里是正确的选择吗?如果是这样,我将如何中止超时的脚本?

【问题讨论】:

    标签: c# multithreading scripting threadpool


    【解决方案1】:

    简短:防止恶意代码很难。

    1.当一个脚本崩溃时,其他脚本不应该受到影响:要实现这一点,在 Windows 中唯一可靠的方法是在单独的进程中运行每个脚本。 IE。由“脚本”引起的 StackOverflow 异常将使您的进程停止运行。跨进程通信不太可能轻松满足您的性能要求。

    2.每个脚本 1 毫秒:中止线程是一种解决方案。避免大量线程(超过十个线程是有问题的:在线程之间切换会降低性能,堆栈空间会占用所有内存,并且通常同步状态跨线程很有趣)。考虑不要重新启动表现不佳的“脚本” - 这样您就不必担心过多的 Thread.Abort 调用。请注意,不需要杀死线程将杀死与“脚本”相关的所有内容,因为它可能已经产生了自己的线程/异步操作/线程池任务......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多