• <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>

            李錦俊(mybios)的blog

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

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

            公告

            QQ:30743734
            EMain:mybios@qq.com

            常用鏈接

            留言簿(16)

            我參與的團(tuán)隊

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 370190
            • 排名 - 67

            最新評論

            閱讀排行榜

            評論排行榜

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


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

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





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

            Feedback

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

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

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

            久久丫精品国产亚洲av| 国产精品久久国产精麻豆99网站| 午夜精品久久久久久| 伊人久久大香线蕉av一区| 国产成人AV综合久久| 亚洲狠狠婷婷综合久久久久| 久久综合噜噜激激的五月天| 久久精品国产清自在天天线| 国产精品久久久久久福利69堂| 2021国内久久精品| 亚洲国产精品人久久| 青青草原综合久久| 久久天天躁狠狠躁夜夜av浪潮 | 久久久久综合中文字幕| 久久久久一本毛久久久| 久久天天躁狠狠躁夜夜avapp| 久久精品无码免费不卡| 久久水蜜桃亚洲av无码精品麻豆| 亚洲伊人久久成综合人影院 | 看久久久久久a级毛片| 亚洲国产综合久久天堂| 99久久国语露脸精品国产| 成人国内精品久久久久影院VR| 成人免费网站久久久| 久久99国产综合精品女同| 久久99精品久久久久久久不卡| 国内精品九九久久精品| 国产成人精品三上悠亚久久| 无码人妻久久一区二区三区免费丨| 亚洲色欲久久久久综合网| 伊人精品久久久久7777| 99久久国产综合精品网成人影院| 久久久中文字幕| 久久er热视频在这里精品| 精品国产乱码久久久久软件| 日韩人妻无码精品久久免费一| 久久精品成人| 久久精品人人做人人爽电影蜜月| 久久久久久久亚洲精品| 国产麻豆精品久久一二三| 性欧美大战久久久久久久|