对cocos2dx-lite的JSB做针对性优化

前言

cocos2dx-lite(creator 2.0之前版本)同时支持多种js的vm,所以也就基本没有做针对特定vm的优化,项目优化时决定坚定的走V8路线,启动了针对V8的专门优化。当然这些优化都用宏定义分离开了,保障V8不可用时原有逻辑仍然不变。

具体优化条目

  • jsb绑定部分,避开se::State和se::Value直接生成V8形式的绑定,实测简单情况如 setPosition 函数效率提升50%左右。

  • 更新V8到8.0以上,开启指针压缩,降低内存 20%左右,实际项目不同会有差别,别问我怎么编译的

  • 所有源码使用v8::String::ExternalOneByteStringResource管理,减少内存copy(c++ -> v8),避免字符转码(ut8 -> utf16)消耗,实际降低内存 40M ,当然这取决于脚本文件的多少,这个项目有大量脚本。为什么是OneByteString,因为js是utf16内码,但v8有个优化处理对于纯单字节的字符串是可以用OneByteString表示的可以省一半内存,当然源码需要预处理一下,使用unicode转意表示

    1
    2
    3
    4
    5
    6
    7
    function to_latin1(str) {
    return str.replace(/[\u007f-\uffff]/g, function(ch) {
    var code = ch.charCodeAt(0).toString(16);
    while (code.length < 4) code = "0" + code;
    return "\\u" + code;
    });
    }
  • 使用v8::ArrayBuffer::Allocator使得部分ArrayBuffer可以使用宿主内存,避免宿主与VM间的copy

  • 对纹理等大内存对象通过Isolate::AdjustAmountOfExternalAllocatedMemory告知V8外部内存占用情况

  • 启用WeakRef启动参数增加--harmony-weak-refs,可以使用新标准中的WeakRef,解决动态加载的图片释放问题(项目有大量网络下载的图片)。目前会偶有崩溃,不确定是接入方式不对,还是什么原因,仍在观察中

其它

  • 通用性和效率总是需要平衡的两个方面,针对具体项目是可以做一些更激进的选择
  • V8是个好项目,但文档还不够细,读代码可以了解细节
  • 实在搞不清楚了可以参考node.js与V8结合的代码