首页 > 解决方案 > V8:尝试每秒调用 60 次函数时性能不佳

问题描述

我正在尝试将 V8 集成到我的游戏引擎中。这就是引擎当前处理脚本的方式:当游戏开始时,所有的脚本都被加载、编译和运行。之后,脚本引擎尝试获取一个指向两个 JS 函数的指针setupupdate。如果源代码中存在函数,则它们的指针放置在两个Persistent<Function>对象中。然后引擎调用该setup函数一次。

此后,游戏循环开始,我的引擎尝试update每秒调用该函数 60 次(计时由 VSync 处理,这就是为什么它是 60 次)。这是通过以下代码完成的:

void ScriptComponent::Update()
{
    if (!script_context->function_update.IsEmpty())
    {
        v8::Isolate* isolate = script_context->isolate;
        v8::Isolate::Scope isolate_scope(isolate);
        v8::HandleScope handle_scope(isolate);

        // script_context->context is a Persistent<Context> and
        // script_context->function_update is a Persistent<Function>
        v8::Local<v8::Context> context = script_context->context.Get(isolate);
        script_context->function_update.Get(isolate)->Call(context, context->Global(), 0, {});
    }
}

一切正常,但由于某种原因,它使 CPU 使用率高达 20% 左右,fps 降至 30-45 FPS 左右,偶尔会出现延迟峰值。但如果我注释掉这段代码,我会得到 1% 的平均 CPU 使用率和稳定的 60 FPS。

有什么办法可以优化上面的代码,所以它不需要那么长时间来执行?

标签: c++v8

解决方案


如果有人在使用 V8 时遇到性能问题,请确保使用Release 版本而不是 Debug运行程序。


推荐阅读