3

我在 C# 中使用 VB .NET 4 在 VS2010 中创建了一个游戏。游戏为每个玩家创建一个线程,并运行玩家创建的 LUA 代码。

每个 LUA 代码都为线程阻塞,并且只应在线程终止时终止(LUA 脚本应包含无限循环)

我想限制 CPU 使用率,因为计算机在以 100% CPU 运行几个小时后当前过热。

如何在不控制线程的情况下限制线程?我希望有一个线程管理器来强制挂起/恢复,但那些已经过时了,我不想抛出异常,因为这会中止我正在执行的 LUA 代码。

有任何想法吗?

谢谢!

4

3 回答 3

7

您可以将这些线程的线程优先级设置为低 - 这将有助于您的系统保持响应......但您仍然会使用 100% CPU 并且仍然过热,所以我不会详细说明如何。

正如其他海报所提到的,你需要让你的线程插入小睡眠。如果您根本无法控制它们,那么您将无能为力。

我建议您需要更改游戏 API。

我建议您让 Lua 代码具有“运行一帧”功能,而不是让您的代码一次调用 Lua 代码,然后 Lua 代码无限循环。然后,您将无限循环移动到您自己的代码中,并重复调用“运行一帧”函数。

这样,您可以插入睡眠、添加日志记录以及执行各种其他有用的事情。

于 2012-08-08T21:06:08.930 回答
1

确保无限循环中的线程不会消耗太多 cpu 的典型方法是让它在每次迭代中休眠一点(通常 5 毫秒就可以了)。这将使系统有时间允许其他资源使用 cpu。另外,不要给线程最高优先级。

于 2012-08-08T20:31:56.320 回答
1

控制执行线程调度的经典方法是使用 Fibers。

然而,Fibers 是 WIN32 API 的一个原生特性……你可以在 C# 中最接近的是使用迭代器……你在每个产量之间做一些工作……但你决定何时需要下一个通过调用迭代器来完成一些工作。

请参阅第二个链接...可能是一种使用非托管本机 Fiber API 来包装一些 .NET 协程的方法,或者如果您在此线程中运行的 LUA 代码是本机的并且您无权访问源代码。 .那么您也许可以使用 ConvertThreadToFibre 来控制它(并决定何时使用 Fiber API 调用的一些互操作来安排它)。

或者你可以有一个调度线程,它使用事件向玩家线程发出信号,当他们可以继续并做一些工作时(如果你的一些代码是本机/C++,一些是 C#,那么每个都可以引用相同的事件句柄...... .just 在每一位代码中使用 WIN32API 或 .NET API)。

于 2012-08-08T20:41:19.493 回答