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

李錦俊(mybios)的blog

游戲開發(fā) C++ Cocos2d-x OpenGL DirectX 數(shù)學(xué) 計(jì)算機(jī)圖形學(xué) SQL Server

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

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團(tuán)隊(duì)

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 373303
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

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

Object
JSValueRef
v8::Local<v8::Value>
JsValueRef
USObject
腳本對象,對象可以由key、value組成,可以擁有繼承結(jié)構(gòu)
table
Object
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USFunction
腳本函數(shù)
function
Function
JSObjectRef
v8::Local<v8::Function>
JsValueRef
USArray
數(shù)組類型,下標(biāo)從0開始
table
Array
JSObjectRef
v8::Local<v8::Array>
JsValueRef
USMap
鍵-值配對的map類型
table
Map
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USSet
值作為鍵也作為值得列表,值不能重復(fù)
table
Set
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USNumber
數(shù)值類型
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
內(nèi)存塊緩存對象
string
Int8Array
JSValueRef
v8::Local<v8::Int8Array>
JsValueRef
USConstructor
對象實(shí)例的構(gòu)造器,用來導(dǎo)出C++類
table
Object
JSValueRef
v8::Local<v8::Object>
JsValueRef
3、定義一批API,用以對以上定義的基本類型進(jìn)行創(chuàng)建、調(diào)用、修改等操作,例如創(chuàng)建的過程API定義成這種形式:

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


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

不如打賞我一杯咖啡,鼓勵(lì)我繼續(xù)分享優(yōu)秀的文章。





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

Feedback

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

話說看你博客為什么2011年到現(xiàn)在連一篇都沒有呢?斷了這么長時(shí)間  回復(fù)  更多評論
  

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美三级在线播放| 午夜精品理论片| 亚洲亚洲精品三区日韩精品在线视频 | 最新日韩精品| 男女av一区三区二区色多| 欧美在线观看视频一区二区三区| 亚洲女人小视频在线观看| 久久精品国产亚洲aⅴ| 久久这里只精品最新地址| 欧美大胆成人| 在线综合亚洲| 久久午夜精品| 欧美性色综合| 亚洲高清视频中文字幕| 亚洲视频高清| 久久综合久久美利坚合众国| 亚洲国产成人精品视频 | 久久精品亚洲一区二区| 欧美jizz19hd性欧美| 国产精品成人播放| 亚洲国产成人在线| 西西人体一区二区| 91久久精品www人人做人人爽| 亚洲一级二级| 欧美福利视频| 国产一级久久| 亚洲一区二区在线视频| 男人插女人欧美| 亚洲男女毛片无遮挡| 欧美高清视频| 在线观看91精品国产入口| 亚洲一区二区三区777| 欧美xxx成人| 久久av老司机精品网站导航| 欧美日本不卡视频| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美午夜理伦三级在线观看| 亚洲国产精品成人综合色在线婷婷 | 免费在线日韩av| 国产区精品在线观看| 一区二区三区久久| 亚洲成色精品| 国内精品伊人久久久久av一坑| 亚洲国产高清高潮精品美女| 欧美在线视频观看| 99国产精品久久久久久久成人热| 久久综合中文色婷婷| 亚洲图片在区色| 免费在线观看精品| 一区在线观看视频| 久久久国产精品一区| 亚洲视频在线视频| 欧美日韩亚洲精品内裤| 亚洲欧美色一区| 国产精品美女一区二区| 亚洲欧美综合另类中字| 亚洲视频网站在线观看| 国产精品久久9| 午夜精品av| 亚洲一区二区久久| 国产伦精品一区二区三区| 欧美亚洲在线播放| 亚洲欧美区自拍先锋| 国产女优一区| 久久一二三四| 蜜臀久久久99精品久久久久久 | 99精品视频免费观看| 欧美成人精品三级在线观看 | 国产一区二区三区最好精华液| 午夜精品视频网站| 先锋a资源在线看亚洲| 国产一区三区三区| 欧美ab在线视频| 欧美黄色一区二区| 亚洲小说欧美另类社区| 午夜欧美大尺度福利影院在线看| 国产欧美精品日韩精品| 久久久久国产一区二区| 久久伊人亚洲| 一区二区三区欧美在线| 一区二区三区蜜桃网| 国产精品自在欧美一区| 久久这里有精品15一区二区三区| 欧美/亚洲一区| 亚洲一区免费| 久久五月天婷婷| 亚洲先锋成人| 久久亚裔精品欧美| 亚洲一区二区三区777| 久久精品国产一区二区三| 亚洲精品影视在线观看| 午夜精品福利在线观看| 亚洲国产欧洲综合997久久| 99亚洲一区二区| 一区二区在线观看视频在线观看| 亚洲精品系列| 一区二区三区在线免费观看 | 亚洲国产三级网| 欧美少妇一区| 国产视频在线观看一区二区三区 | 免费成人黄色片| 国色天香一区二区| 亚洲国产欧美一区| 国产亚洲美州欧州综合国| 亚洲国产精品热久久| 国产精品日日摸夜夜摸av| 麻豆精品精华液| 国产精品视频| aa日韩免费精品视频一| 亚洲区欧美区| 久久全国免费视频| 久久精品女人| 国产精品青草综合久久久久99 | 亚洲一级一区| 亚洲精品久久视频| 久久精品成人| 欧美一级视频| 欧美午夜在线观看| 亚洲免费观看视频| 亚洲国产另类精品专区| 欧美在线观看视频一区二区三区 | 亚洲精品久久久久久一区二区| 国产日韩欧美夫妻视频在线观看| 亚洲最新在线| 亚洲一区影音先锋| 欧美日韩性视频在线| 亚洲国产欧美在线人成| 亚洲国产精品精华液2区45| 欧美有码视频| 久久婷婷蜜乳一本欲蜜臀| 国产亚洲一级高清| 欧美中文字幕在线| 久久人人超碰| 在线观看福利一区| 久久视频一区二区| 亚洲国产精品va在线看黑人动漫| 亚洲国产精品一区二区尤物区| 久久国产免费看| 久久这里有精品视频| 尤妮丝一区二区裸体视频| 久久久在线视频| 欧美黄色成人网| 亚洲精品日韩综合观看成人91| 免费不卡中文字幕视频| 亚洲国产一区在线| 亚洲最新色图| 国产精品国产福利国产秒拍 | 欧美一区2区视频在线观看 | 一区二区三区免费看| 亚洲欧美日韩爽爽影院| 国产精品免费网站| 性色av一区二区三区| 久久五月天婷婷| 亚洲黄网站黄| 欧美日韩在线看| 亚洲香蕉成视频在线观看| 欧美一区二区私人影院日本| 欧美亚洲日本国产| 久久久无码精品亚洲日韩按摩| 黄色一区三区| 欧美激情导航| 亚洲午夜久久久久久久久电影院 | 欧美国产一区二区在线观看| 亚洲免费大片| 久久色在线播放| 亚洲精品视频免费在线观看| 欧美视频在线视频| 久久精视频免费在线久久完整在线看| 免费成人高清在线视频| 一区二区三区日韩在线观看| 国产九色精品成人porny| 久久综合五月天婷婷伊人| 一本大道av伊人久久综合| 久久一区视频| 亚洲一区二区三区视频| 在线看视频不卡| 国产精品久久久久免费a∨大胸 | 国产精品一区二区在线| 麻豆精品一区二区综合av| 亚洲一区二区免费视频| 欧美大片在线看免费观看| 午夜天堂精品久久久久| 亚洲人成在线播放| 国产亚洲成精品久久| 欧美日韩高清不卡| 久久久久成人精品| 亚洲永久网站| aa日韩免费精品视频一| 亚洲第一精品电影| 久热爱精品视频线路一| 午夜免费日韩视频| 一区二区三区精品视频| 亚洲国产精品第一区二区| 国产又爽又黄的激情精品视频| 欧美日韩一区二区高清| 久久艳片www.17c.com| 欧美一乱一性一交一视频| 亚洲一级一区| 亚洲视频中文| 在线性视频日韩欧美|