描述:我的node.js后台应用程序生成游戏结果依赖于物理引擎的算法。我的node.js后台应用生成游戏结果依赖于物理引擎的算法。服务器快速生成游戏结果,通过物理引擎运行游戏物理。while
循环并发送给客户端。当客户端得到游戏结果时,他们会以60 FPS的速度运行游戏循环,并对这个结果进行动画。
while
循环在生成结果时冻结了node.js。这个应用程序还负责REST API,原因是它也被冻结了,直到REST API被冻结。while
循环会完成游戏结果的生成。while
循环?也许可以创建其他进程,从主程序中访问它,或者......?? 正如你所发现的,nodejs非常不适合运行超过一两毫秒的计算。它有一个单一的主循环,用来调用回调、事件和等待操作(承诺解决或拒绝)。
如果你从其中一个回调事件什么的调用一个长期运行的函数,它就会阻塞主循环,直到它完成,所以nodejs等待处理下一个操作。这就会让你的应用程序感觉很慢,很卡顿。这种一次一个事件的操作是Javascript所固有的。
有几种方法可以管理这种情况。 到目前为止,最好的方法是想办法让你的客户端代码在用户的机器上运行,来完成像游戏物理学这样的重计算。这意味着重新思考你系统的设计。这也意味着你要让你的用户为你的物理引擎埋单,如果你有很多用户,这总是一个明智之举。
你可以改用轻量级线程的语言来为你的服务器编程。Java和C#是合理的选择,golang也可以。
你可以把你的长期运行的计算拆分开来,异步地进行,就像这样。
async function comp () {
while (computationNotDone) {
await doChunkOfComputation()
}
}
await操作让节点重新激活主循环。你的计算块通过其他事件和回调轮流进行。
你也可以尝试node Worker Threads。解释这些超出了StackOverflow回答的范围。