V8:尝试每秒调用函数 60 次时性能不佳
V8: Poor performance when trying to call a function 60 times a second
我正在尝试将 V8 集成到我的游戏引擎中。这是引擎当前处理脚本的方式:当游戏开始时,所有脚本都被加载、编译和运行。之后,脚本引擎尝试获取指向两个 JS 函数的指针,分别是 setup
和 update
。如果函数存在于源代码中,它们的指针被放置在两个 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。
有什么方法可以优化上面的代码,这样执行起来就不会那么长吗?
如果有人遇到 V8 的性能问题,请确保 运行 使用 Release 版本且 不是 Debug 的程序].
我正在尝试将 V8 集成到我的游戏引擎中。这是引擎当前处理脚本的方式:当游戏开始时,所有脚本都被加载、编译和运行。之后,脚本引擎尝试获取指向两个 JS 函数的指针,分别是 setup
和 update
。如果函数存在于源代码中,它们的指针被放置在两个 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。
有什么方法可以优化上面的代码,这样执行起来就不会那么长吗?
如果有人遇到 V8 的性能问题,请确保 运行 使用 Release 版本且 不是 Debug 的程序].