【问题标题】:Is there significant overhead in repetitively calling C++ within v8 JavaScript?在 v8 JavaScript 中重复调用 C++ 是否有很大的开销?
【发布时间】:2018-08-26 12:44:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 对任何语言的所有函数调用都有开销。
  • @NeilButterworth 嗯,是的,很明显,但某些情况可能会导致比其他情况更大的开销,我问的是这个非常具体的情况。从 C++ 内部调用 C++ 或 JS 调用 JS 函数与 v8 中的 JS 到 C++ 截然不同。我不明白为什么问这个问题这么荒谬?
  • Python 通常很慢。不过也许不比 JavaScript 慢 :)
  • @zzxyz CPython 无疑比 v8 JavaScript 慢得多。
  • 我不会担心它然后@griffort 它会是微不足道的

标签: javascript c++ game-engine v8 embedded-v8


【解决方案1】:

这个答案将是非常主观的,它来自我的经验观察,我不会说非常严格,我现在自己正在解决这个问题,我还没有用基准验证我的主张。那就是……

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

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

【讨论】:

  • 啊,有趣。根据您的知识,至少从比较的角度来看,是否有任何其他语言/框架可以与 C++ 作为前端更好地交互(就用户友好的脚本语言而言)?或者这可能是总体上最好的选择?
  • @griffort V8 是一个不错的选择
猜你喜欢
  • 2011-03-29
  • 2010-11-14
  • 1970-01-01
  • 2011-04-06
  • 2013-07-06
  • 1970-01-01
  • 2011-01-15
  • 2012-11-29
  • 1970-01-01
相关资源
最近更新 更多