对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
7function 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结合的代码