青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

李錦俊(mybios)的blog

游戲開發 C++ Cocos2d-x OpenGL DirectX 數學 計算機圖形學 SQL Server

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 372634
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

    cocos2d-x支持多種腳本引擎的綁定,例如支持lua(通過lua或luajit)、javascript(通過SpiderMonkey腳本引擎),分別對應libluacocos2d和libjscocos2d兩個工程,每個工程里分別對應大量的自動綁定和手動綁定代碼。如果需要增加一些引擎功能需要綁定到腳本的話,兩個工程都需要修改代碼,非常不便于維護。假如希望使用其他腳本引擎的話(例如google紅紅火火的V8,或者ms的chakra),那得多開幾個工程,每個工程都需要實現幾乎一樣,但是又不一樣的代碼?,F在我提出一種思想,來解決這類問題。
    現有的腳本引擎多如牛毛,而不同企業間可能有不同的技術積累,希望選擇不一樣的腳本引擎,有的python蟒蛇派,有的是lua派,有的是ruby派,還有JavaScript、lua等等等等,所以,JavaScript和Lua不應該成為二選一。
而這些腳本引擎之間,有很多的共同點,例如都是弱類型語言,都是支持那么幾種簡單類型,都是使用GC機制來回收等等。
腳本引擎統一化,是把多個腳本引擎(lua、JavaScriptCore、chakra、v8、spidermonkey等等)通過同一套抽象接口進行封裝,引擎的腳本綁定代碼都通過抽象接口來編寫。通過選擇編譯不同的實現層來實現腳本引擎間的切換,而不是每個腳本引擎都要寫不一樣的腳本綁定代碼,這樣能大大簡化腳本綁定層的維護成本,并能保證所有腳本引擎的接口的絕對一致性,并讓用戶輕松選擇使用哪個腳本引擎,而不限定于必須使用官方選擇的引擎。
    腳本引擎抽象層API的定義非常關鍵,概括起來我認為他必須符合以下要求:
1、抽象層的接口必須在各個腳本引擎之間都可以實現,例如:“創建字符串”這個接口,是任意腳本引擎都能實現。
2、抽象層在綁定腳本的過程中是足夠用的,例如:我們需要導出一個C++的類,還需要導出類里的函數,還有特殊的結構體,甚至包含lambda表達式,這些都需要考慮進去抽象層定義的需求里。
3、抽象層還必須足夠的薄,薄到運行時根本感覺不到他的存在。需要使用“宏”或者inline函數的方式來給這個抽象層減肥,堅決不使用C++類的方式來加厚他。
4、抽象層在使用的過程中必須足夠簡單,簡單到就好像是一個單獨的腳本引擎API一樣,這些API看上去是大統一的,并且是腳本語言無關的。
    在定義抽象層的過程中,我參考了很多別人的方案,最終,我使用 了這么個方案:
1、使用C inline函數來定義API接口函數的聲明,各個引擎的實現部分分別實現這些函數
2、定義一些基本類型,基本類型有各個腳本引擎來最終定義,但名字和意義都是統一的,初步定義了這些類型,每個類型在不同腳本引擎中對應的類型分別如下表:
統一類型
描述
Lua
JavaScript
JavaScriptCore
V8
chakra
USValue
表示腳本中的任意類型
任意類型

Object
JSValueRef
v8::Local<v8::Value>
JsValueRef
USObject
腳本對象,對象可以由key、value組成,可以擁有繼承結構
table
Object
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USFunction
腳本函數
function
Function
JSObjectRef
v8::Local<v8::Function>
JsValueRef
USArray
數組類型,下標從0開始
table
Array
JSObjectRef
v8::Local<v8::Array>
JsValueRef
USMap
鍵-值配對的map類型
table
Map
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USSet
值作為鍵也作為值得列表,值不能重復
table
Set
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USNumber
數值類型
number
Number
JSValueRef
v8::Local<v8::Number>
JsValueRef
USBoolean
bool類型
boolean
Boolean
JSValueRef
v8::Local<v8::Boolean>
JsValueRef
USString
字符串類型
string
String
JSValueRef
v8::Local<v8::String>
JsValueRef
USBuffer
內存塊緩存對象
string
Int8Array
JSValueRef
v8::Local<v8::Int8Array>
JsValueRef
USConstructor
對象實例的構造器,用來導出C++類
table
Object
JSValueRef
v8::Local<v8::Object>
JsValueRef
3、定義一批API,用以對以上定義的基本類型進行創建、調用、修改等操作,例如創建的過程API定義成這種形式:

 1  // 創建Null值
 2     inline USValue createUSNull();
 3  // 創建Undefined值
 4     inline USValue createUSUndefined();
 5  // 創建普通的對象
 6     inline USObject createUSObject();
 7  // 創建數組
 8     inline USArray createUSArray(int length = 0);
 9  // 創建Map
10     inline USMap createUSMap();
11  // 創建Set
12     inline USSet createUSSet();
13  // 創建字符串
14     inline USString createUSString(const char *str, int length = -1);
15  // 創建Buffer,將會拷貝數據到Buffer中,腳本引擎負責銷毀
16     inline USBuffer createUSBuffer(const char *buffer, size_t size);
17  // 創建一個腳本函數,函數調用時會回調到callback,并帶上data
18     USFunction createUSFunction(USFunctionCallback callback, void *data = nullptr, const char *name = nullptr);
19  // 創建數字
20     inline USNumber createUSNumber(double number);
21  // 創建bool
22     inline USBoolean createUSBoolean(bool value);
23 
24  // 創建對象構造器
25     USConstructor USClassCreateConstructor(const USClass &cls);
 
抽象層定義好后,需要經過大量的努力,才能在各個腳本引擎間的最終實現。當最終實現完畢后,就可以下一步工作:
1、把cocos2d-x對于自動綁定代碼的template類進行修改,修改成使用統一腳本引擎的API
2、把cocos2d-x對于手動綁定的代碼如法炮制
3、使用不同的引擎實現來編譯
經過這樣如法炮制之后,最終cocos2d-x只剩下一套腳本綁定的工程,而通過選擇不同的底層腳本引擎,卻可以編譯出完全不一樣的腳本引擎版本。
經過cocos2d-x github社區的努力,最終應該會出現不同的fork,如python、ruby等等各種語言出現各種綁定版本,而這種綁定版本的出現,只需實現抽象層API的基本API即可。
至此cocos2d-x的腳本引擎統一即可完成大業。
但,事情還沒完,我在下一篇中,將會講到抽象API的詳細定義,敬請期待下一篇。


如果本文對你的開發有所幫助,并且你手頭恰好有零錢。

不如打賞我一杯咖啡,鼓勵我繼續分享優秀的文章。





posted on 2015-11-20 15:03 李錦俊(mybios) 閱讀(3309) 評論(2)  編輯 收藏 引用 所屬分類: 3D引擎開發

Feedback

# re: cocos2d-x腳本引擎(JavaScript、Lua等等)的大統一(方案概述) 2015-11-29 09:07 ffmo
這個想法著實不錯!支持一個

話說看你博客為什么2011年到現在連一篇都沒有呢?斷了這么長時間  回復  更多評論
  

# re: cocos2d-x腳本引擎(JavaScript、Lua等等)的大統一(方案概述) 2015-12-02 15:06 李錦俊(mybios)
@ffmo
當時工作的公司說一切都需要保密,所以就對外禁言了。回想當時也是太天真。呵呵。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产日韩在线| 91久久午夜| 久久久久久91香蕉国产| 亚洲女同性videos| 亚洲免费在线观看| 欧美一级久久久| 久久精品噜噜噜成人av农村| 欧美一区成人| 另类成人小视频在线| 美日韩在线观看| 欧美精品v日韩精品v国产精品 | 在线中文字幕一区| 国产精品99久久久久久久久| 亚洲欧美日韩网| 久久久伊人欧美| 亚洲国产精品一区在线观看不卡| 欧美成人免费全部观看天天性色| 亚洲国产mv| 中文av字幕一区| 久久国产精品72免费观看| 久久亚洲欧洲| 国产精品成人一区二区网站软件 | 亚洲日韩欧美视频| 亚洲三级免费电影| 久久国产手机看片| 久久久精品999| 亚洲电影观看| 亚洲欧美一区二区三区久久| 久久综合给合| 国产精品久久久久久一区二区三区| 国产一区成人| 正在播放欧美一区| 蜜桃av综合| 亚洲一级在线观看| 欧美激情一区二区三级高清视频| 国产欧美一级| 一本大道久久a久久精品综合| 欧美影院午夜播放| 亚洲精品一区二区在线观看| 久久精品视频va| 国产精品天天看| 在线一区二区日韩| 亚洲高清不卡一区| 久久久久久久久久久久久女国产乱| 欧美三日本三级少妇三2023| 最新国产乱人伦偷精品免费网站| 久久久久久亚洲精品杨幂换脸 | 西瓜成人精品人成网站| 亚洲国产精品久久久| 午夜精品福利视频| 欧美日韩一区二| 99国产一区| 亚洲激情第一页| 欧美高清视频免费观看| 在线观看精品一区| 久久综合狠狠综合久久综合88| 亚洲综合色激情五月| 国产精品第2页| 亚洲欧美另类国产| 99精品国产在热久久婷婷| 欧美精品999| 一区二区三区免费网站| 亚洲国产成人av| 欧美国产乱视频| 99re6这里只有精品| 亚洲精选一区二区| 欧美四级在线观看| 亚洲欧美日韩一区二区| 亚洲综合色在线| 国产欧美在线观看| 久久精品五月婷婷| 久久久久中文| 亚洲国产精品小视频| 欧美激情欧美狂野欧美精品| 欧美成人日本| 亚洲线精品一区二区三区八戒| 一卡二卡3卡四卡高清精品视频| 国产精品国产三级国产专播品爱网 | 美女久久一区| 你懂的国产精品| 一本大道久久a久久综合婷婷| 亚洲精品视频免费在线观看| 欧美视频中文一区二区三区在线观看 | 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 亚洲在线成人| 一区二区亚洲精品国产| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美激情一区在线| 欧美亚洲日本网站| 久久亚洲午夜电影| 亚洲一区二区三区四区五区午夜| 午夜精品久久久久久| 亚洲国产婷婷综合在线精品| 亚洲精品综合| 激情久久久久久久| 亚洲三级国产| 国产主播一区二区三区| 亚洲国产日韩欧美在线99| 国产精品国产三级国产| 免费美女久久99| 国产精品国内视频| 欧美成人自拍| 国产精品视频一区二区三区| 欧美va天堂| 国产目拍亚洲精品99久久精品| 欧美成人午夜视频| 国产日韩欧美一区二区三区在线观看 | 亚洲精品中文字幕在线| 亚洲一区二区三区高清| 亚洲激情社区| 欧美在线视频不卡| 亚洲一区二区三区国产| 美女脱光内衣内裤视频久久网站| 亚洲欧美日韩精品| 欧美日韩不卡视频| 欧美激情第一页xxx| 国产一区二区日韩| 亚洲午夜精品视频| 中文欧美在线视频| 欧美精品在线一区二区| 男男成人高潮片免费网站| 国产伦精品一区二区三区免费迷| 最新亚洲一区| 亚洲免费观看在线视频| 久久综合网hezyo| 久久精品首页| 欧美不卡视频一区发布| 欧美激情视频一区二区三区不卡| 久久久精品免费视频| 国产精品亚洲美女av网站| 99re这里只有精品6| 亚洲精品久久久久| 老鸭窝91久久精品色噜噜导演| 欧美一区二区日韩| 国产精品女主播一区二区三区| 亚洲精品一二区| 99国产精品久久久久久久久久 | 噜噜噜噜噜久久久久久91| 国产日韩精品一区二区浪潮av| 一区二区三区四区精品| 亚洲视频狠狠| 国产精品裸体一区二区三区| 在线视频日韩| 羞羞答答国产精品www一本| 国产精品激情av在线播放| 一区二区三区精品视频| 性欧美办公室18xxxxhd| 国产女主播一区二区三区| 亚洲男人的天堂在线aⅴ视频| 久久成人免费网| 一区二区三区在线高清| 欧美1区免费| 亚洲国内自拍| 在线亚洲精品福利网址导航| 国产精品日日摸夜夜添夜夜av| 亚洲欧美激情一区| 麻豆精品91| 宅男噜噜噜66一区二区| 国产日韩精品在线观看| 久久全国免费视频| 亚洲人体大胆视频| 欧美一级视频免费在线观看| 在线成人亚洲| 国产精品国产三级国产普通话99| 亚洲欧美另类综合偷拍| 免费成人高清视频| 一区二区三区四区蜜桃| 国产亚洲欧美一区在线观看 | 亚洲视频国产视频| 久久久久国产免费免费| 亚洲精品中文在线| 国产热re99久久6国产精品| 老司机免费视频一区二区| 一本色道**综合亚洲精品蜜桃冫| 久久岛国电影| 9l视频自拍蝌蚪9l视频成人| 国产欧美一区二区精品秋霞影院| 久久亚洲午夜电影| 一区二区三区鲁丝不卡| 蜜臀av一级做a爰片久久| 亚洲一区二区三区在线观看视频 | 欧美丝袜一区二区| 久久久精品性| 亚洲视屏在线播放| 亚洲国产日韩欧美在线动漫| 久久精品72免费观看| 制服丝袜激情欧洲亚洲| 亚洲国产欧美一区二区三区丁香婷| 欧美手机在线视频| 欧美成在线视频| 欧美剧在线观看| 香蕉久久a毛片| 亚洲精品在线观看视频| 免费黄网站欧美| 欧美专区日韩专区| 一区二区三区 在线观看视频| 原创国产精品91| 国产一区二区三区免费观看| 国产精品成人一区二区| 欧美日韩精品免费观看视频|