溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

【cocos2d-x從c++到j(luò)s】08:JS腳本語言的優(yōu)勢與一些問題

發(fā)布時間:2020-08-02 17:55:23 來源:網(wǎng)絡(luò) 閱讀:4213 作者:老G 欄目:游戲開發(fā)

優(yōu)勢:

1.不需聲明,甚至匿名方式原地定義。編碼量少。

這一條在C++中尤其明顯,以綁定一個回調(diào)為例,需要聲明,定義,調(diào)用綁定,三處代碼。雖然C++11中支持lambda表達式,對于回調(diào)的寫法有很大改進。但是其他地方依然蛋疼。


2.弱類型語言,一般情況下,不需關(guān)心實際類型。Debug時除外。

在使用C++這種強類型語言的開發(fā)中,尤其是寫功能代碼時,類型檢查遠不如想象中那么有用,很多時候反而是問題根源,編譯不通過時,很大一部分時間是在對變量類型,由此還衍生出一些特殊技術(shù)手段,比如適配器模式等等。

使用JS這種弱類型語言,只要接口名稱能對上,那么在對象的函數(shù)被調(diào)用時就認為是正確的。簡單說,只要長得像某一類型就行了,不需要必須是某一類型。

C++11中auto關(guān)鍵字也可以提升編碼速度(和JS的var很類似,可以隨時無腦輸出),不過看了一下引擎附帶的幾個例子代碼,好像有濫用auto的趨勢。


3.腳本語言動態(tài)擴展能力強,可以不必構(gòu)造很多臨時類型和消息類型。

比如,在大型游戲中,全局使用消息機制時,C++可能用結(jié)構(gòu)體,自定義類,或者我們以前直接丟JSON對象過去。在JS里面就很簡單了,直接扔JSON對象吧。

在運行時可以動態(tài)給一個對象添加函數(shù)和屬性,而不需要重新構(gòu)造新類和初始化。JSON源自JS,JSON是天然的消息對象,非常合適。當(dāng)然JSON有自身的缺點,訪問父節(jié)點和兄弟節(jié)點不太方便。并且JSON的結(jié)構(gòu)和二維表沒法完全兼容,這是一直讓策劃和工具程序員頭痛的一個問題。


4.語法靈活,可以支持各種編碼方式。隨機應(yīng)變。

業(yè)界普遍認為面向?qū)ο笤趫D像編程是最好的。但對于事件處理邏輯處理AI處理來說,面向?qū)ο髣t是羅嗦的要死。比如,我實在對觀察者模式提不起興趣,Qt中的信號槽機制優(yōu)雅的多。又比如我曾經(jīng)做了一個A*算法代碼,想改成好用的面向?qū)ο蠓绞?,發(fā)現(xiàn)很痛苦。

JS很靈活,適合什么樣的編碼方式,就用什么樣的方式。


5.在語言級別天生集成了兩種最有用的數(shù)據(jù)結(jié)構(gòu),向量和映射表。

記得在KJava時代,MIDP的里面只有很少的數(shù)據(jù)結(jié)構(gòu),里面就有向量和哈西表。這兩種是最為常用的。JS在語言層面提供了支持,編碼極其方便。

6.腳本語言無需編譯,大量節(jié)約了開發(fā)時間。

如果你在Mac上,并且開了虛擬機然后編譯VS的話,應(yīng)該有那個恐怖的按小時計算的編譯時間長度經(jīng)驗。Clang雖然速度比VC快很多,但是每次如果clean一下然后編譯幾十上百個文件也需要若干分鐘。


一些問題:

1.太靈活,更容易出爛代碼。


2.調(diào)試問題與IDE問題。

目前在cocos2d-x領(lǐng)域,還缺乏好用的支持JS的IDE?,F(xiàn)在目前暫時還是用cocos2d-html5版本做調(diào)試(兩者的接口已經(jīng)高度一致化),未來會有基于c++的IDE做的JS調(diào)試插件(比如在Eclipse上面的)。

3.善變的this

this關(guān)鍵字絕對是JS里面的變形金剛。根據(jù)不同的上下文,經(jīng)常會變成其他東西。

這個經(jīng)常會和回調(diào)函數(shù)問題糾纏不清,如果再加上閉包,三合一,夠你喝一壺的。

4.閉包

閉包很強大,無限制傳參,抓取快照。

但是閉包本身的問題也不小,首先是閱讀和理解上的困難,面向?qū)ο蟮某绦騿T一上來很難理解這東西,從他們的角度看閉包的代碼也很丑。

還有就是效率問題,同事測了一下SpiderMonkey中的閉包在生成大對象時效率不太高。

目前在cocos2d-x前端開發(fā)中,為了防止出現(xiàn)問題,對于缺乏經(jīng)驗的程序員,盡量不要使用閉包代碼。

我個人在回合制戰(zhàn)報,生成動畫里是用了一些閉包的,不過那是一次性代碼。


5.變量生命周期不明確

變量生命周期問題,因為不需要聲明,很多時候也沒有特別明顯的初始化,并不能通過閱讀代碼明確知道,一個變量的生存周期,這是所有腳本語言和GC語言的特性,有些時候?qū)φ{(diào)試會形成麻煩。


6.原型繼承

難以理解的原型繼承。熟悉面向?qū)ο蟮娜艘话愣紝@個東西莫名其妙。


從靜態(tài)語言過度到動態(tài)腳本語言,一般程序員會疑惑在幾個地方,this,閉包,原型繼承,以及如何靈活地使用腳本語言的動態(tài)性進行編碼,我觀察了一下,很多人寫JS像靜態(tài)語言,還是c++風(fēng)格或者Java風(fēng)格。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI