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

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

本文关键字:是否 巨大 开销 C++ 调用 JavaScript v8      更新时间:2023-10-16

我希望开发一个JavaScript游戏引擎,它使用C++作为渲染/更新/碰撞等的后端。 几乎所有繁重的东西。

然后,通过修改isolate变量(或者可能只是一个本机nodejs模块(来公开C++类/函数。其中一些类(如Sprite类(可以将其update函数由 JS 子类覆盖,以便允许用户自定义行为。

最后,游戏引擎将在 JavaScript 中循环运行,但每一帧都会调用C++上下文进行更新/渲染,此外,还会有大量的调用来检查输入、碰撞等。更不用说每个子类对用C++编写的父类进行的所有回调。

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

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

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

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