在 v8 JavaScript 中重复调用 C++ 是否有很大的开销?

Is there significant overhead in repetitively calling C++ within v8 JavaScript?

我希望开发一个 JavaScript 游戏引擎,使用 C++ 作为 rendering/updates/collision 等的后端。几乎所有繁重的工作。

然后将通过修改 isolate 变量(或者可能只是本机 nodejs 模块)公开 C++ classes/functions。其中一些 classes,例如 Sprite class,可以让其 update 函数被 JS subclass 覆盖,以允许用户自定义行为。

最后,游戏引擎会 运行 在 JavaScript 中循环,但每一帧都会调用 C++ 上下文 update/render 以及那里的所有内容将进行大量调用以检查输入、碰撞等。更不用说每个子 class 将对用 C++ 编写的父 classes 进行的所有回调。

我担心的是,我读到从 JS 上下文(无论是 ffi 还是本机模块)调用 C++ 时会产生很大的开销(比正常情况下多)。通常它的性能是值得的,但考虑到每帧在两种语言之间来回调用多少次,也许这不是最好的主意?相反,也许像 Python 这样的东西会更合适,因为它的开销为零(尽管 Python 通常要慢得多),或者一起使用不同的 JS 解释器?

这个答案将是非常主观的,它是根据我的经验观察得出的,我不会说是非常严格的,我现在正在自己解决这个问题,而且我还没有用基准来验证我的说法。也就是说...

是的,从 JS 调用到 C++ 是比较昂贵的。当然比纯 JS 中的调用更重要。实际上,比从 C++ 到 JS 的另一个方向的调用要多得多。我认为效率低下的一个主要原因是 javascript 引擎失去了一些优化机会。

但是,假设您坚持使用 V8 引擎,从 JS 调用 C++ 将比调用任何其他语言快得多。