c++ - V8:尝试每秒调用 60 次函数时性能不佳
问题描述
我正在尝试将 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运行程序。
推荐阅读
- excel - 使用 VBA 创建总计
- jquery - 如果数据值为真,则jQuery添加类
- spring - 微服务的批处理——Spring服务设计?
- java - 与 Hibernate 和 Spring 一起配置数据库开发环境
- gtk3 - GTK+3.0 - Treeview/ScrolledWindow 上的滚动条 - 控制滚动条的 CSS 属性
- ssh - 谷歌云虚拟机上的 Wordpress
- android-studio-3.0 - 渲染错误 Cardview android studio 3.1 和 appCompact 主题错误
- macos - Gitlab 的 Jenkins 配置中的 Gitlab 主机 URL 是什么?
- c# - 如何将数据传递给为各种页面提供通用控件的布局
- java - 如何将 JNDI 添加到 Crystal 报表 bean?