我开发了一个实时3D引擎,现在我想切换到V8 JavaScript引擎。实施非常简单,一切都很好,除了我有垃圾收集问题,它会导致重要的性能泄漏。由于技术原因,我需要积极的垃圾收集,所以我收集垃圾:
v8 :: V8 :: LowMemoryNotification();
哪能做我想要的,但很慢。我也尝试过:
V8 :: IdleNotification();
然后垃圾收集会在真正执行时导致长时间中断。
在实时3D应用程序中实现V8垃圾收集的最佳方法是什么,我该如何思考?多线程怎么样?
似乎很重要的是,3D场景可以有脚本,每个脚本都在一个单独的隔离区中运行。
答案 0 :(得分:0)
让每个脚本在单独的Isolat
e中运行可能不是您想要的。您应该考虑共享一个Isolate
,而只是将它们与单独的Context
分开。
您还应该在自己的专用线程上运行JavaScript,使用适当的本机IPC机制与您的用户线程进行通信。然后,执行垃圾收集的适当方法是定期使用v8::IdleNotification()
(并且当您合法地耗尽内存时仅调用v8::LowMemoryNotification()
),并简单地限制它有多长时间可以花在它上面。如果您需要为游戏逻辑添加其他线程,则每个线程可以有一个Isolate
,并以这种方式拆分Context
(尽管如果这样做,您将无法在线程之间迁移脚本)。
还有一个更新的API用于运行“微任务”,这可能适合您的需求,尽管截至2015年2月它仍然是实验性的。
当然,确保您的脚本首先生成尽可能少的垃圾。避免在每帧的基础上创建新对象,包括被它们包围的函数和局部变量。另外,尝试预先在一个属性包中预先分配您的所有状态。这样做可以减少首先需要收集的垃圾量。