我应该在自己的线程中运行每个插件吗?

时间:2011-08-23 01:44:58

标签: c# multithreading scripting threadpool

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

  1. 当脚本崩溃时,其他脚本不应受到影响。
  2. 脚本Update方法允许每帧最多运行1毫秒。所以我还需要能够中止冻结/不及时反应的脚本。
  3. 我该怎么做?我认为每秒启动3000 - 6000个线程并不是最好的做法。 一旦在循环中调用Update并等待16ms,我也无法启动线程,因为脚本需要与游戏同步。脚本依赖于每帧运行。

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

1 个答案:

答案 0 :(得分:4)

简短:保护敌意代码很难。

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

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