我已经开发了一个实时3D引擎,现在我想切换到V8 JavaScript引擎。实现非常简单,一切都很好,除了垃圾收集有问题,它导致了一个重要的性能泄漏。由于技术原因,我需要主动垃圾收集,所以我需要收集垃圾:
v8::V8::LowMemoryNotification ();
这就是我想要的,但是非常慢。我也已经尝试过了:
V8::IdleNotification ()
但是,当垃圾收集真正执行时,它会导致长时间中断。
在实时3D应用程序中实现V8垃圾收集的最佳方式是什么?我该如何思考?那么多线程呢?
似乎很重要的一点是,3d场景可以有几十个脚本,每个脚本都在单独的独立环境中运行。
发布于 2015-02-17 13:07:15
让每个脚本在单独的Isolate中运行可能不是您想要的。您应该考虑使用单独的Context来隔离它们,而不是共享单个Isolate。
您还应该在自己的专用线程上运行JavaScript,使用适当的本机IPC机制与用户线程通信。然后,执行垃圾收集的适当方法是定期使用v8::IdleNotification() (并且仅在内存耗尽的情况下才调用v8::LowMemoryNotification() ),并简单地限制它可以在垃圾收集上花费的时间。如果您的游戏逻辑需要额外的线程,您可以为每个线程设置一个Isolate,并以这种方式拆分您的Context(尽管这样做将无法在线程之间迁移脚本)。
还有一个更新的API来运行“微任务”,它可能适合你想要的东西,尽管到2015年2月为止,它似乎还处于实验阶段。
当然,首先要确保你的脚本生成的垃圾尽可能少。避免在每个帧的基础上创建新对象,包括函数和包含在其中的局部变量。此外,尝试预先在单个属性包中预先分配所有状态。这将大大减少首先需要收集的垃圾数量。
https://stackoverflow.com/questions/28345884
复制相似问题