9秒學院總結Cocos2d-X面試題

1.autoreleaserelease的區別javascript

 

    release是當即釋放引用計數,若是到達0,對象被銷燬。java

    autorelease是延遲釋放,是爲了更好管理內存產生的。好比以下代碼:緩存

vbash

CCObject *fun() ide

函數

   CCObject *myobj = new CCObject(); oop

   //myobj->release();                   //語句this

   //myobj->autorelease()                //語句lua

   return myobj; spa

    若是不調用語句1語句2,會致使內存泄露,根據函數定義原則,誰污染誰治理,若是要求外部調用者釋放,不科學。

    若是調用語句1,會當即被釋放,外部調用者沒法獲取對象。

    調用語句2,延遲被釋放,能夠保證外部調用者得到對象指針,而又會被釋放。

    autorelease的實現機制,是將對象加入一個pool統一管理,當poolrelease時,pool裏面每一個對象都會被releasepool基於一個棧式結構管理,每個mainlooppop一次。同一個mainloop裏面調用autorelease,會把引用加入棧頂pool

 

 

2.cocos2d-x的圖形渲染機制是什麼

 

    只知道是每一幀調用mainloop,而後drawScene.

 

 

3.cache機制原理是什麼

 

    把新加進內存的資源作一個hashmap存儲,每個資源加一個key。每次加載資源的時候,先查找資源是否存在,存在直接返回,不然加載進內存。

 

 

4.場景切換的內存處理過程是什麼

 

    先構建新場景,而後顯示新場景,而後釋放舊場景。

    可是在新場景onEnter,舊場景onExit的時候,會調用舊場景的cleanup,清理schedule相關部分。

5.動做回調函數是怎麼做用的其原理是什麼

    target(回調對象指針)加 selector(回調函數指針)。

 

 

6.還有減小內存開銷的方法有哪些,圖片壓縮方法有哪些

 

    及時釋放,減小泄露,重用資源,延遲加載,分部加載等。

   

    通常的圖片是4通道32位,即一個像素用4個字節表示,每一個字節依次表示ARGB,即alpharedgreenblue。那麼圖片佔用的內存能夠算出。

    壓縮像素即減小圖片像素點多少,內存即減小。可是圖片會變小。

   

    壓縮圖片質量,即不用4個字節表示一個像素,如256色,就是用一個字節表示一個像素,每2bit表示一個通道。可是圖片表現效果變差。

 

 

    PS:轉換圖片質量不能減小內存使用,好比把png換成jpg,緣由上面說的。

 

7.cocos2d-x 如何處理、存儲、顯示中文字符串,好比 玩家的名字,用戶名,密碼。存儲在本地的文件裏面,該如何處理才能防止不亂碼?

         使用 iconv 庫進行轉換。或者XML 進行存儲。

 

 

 

 

8.簡述cocos2d-x的屏幕適配解決方案

        

         pEGLView->setDesignResolutionSize(480, 320, kResolutionNoBorder);第三個參數,找到定義:

講得很清楚了:

kResolutionExactFit:會靠拉伸來填滿屏幕,本例來講背景圖會變形來填充屏幕,由於1024:768=1.3 480:320=1.5,寬高比不一樣,圖片也就沒法等比縮放來填滿屏幕,只能變形了。

kResolutionNoBorder 看不到黑邊,實際就是寬高等比縮放,但縮放比例取寬比和高比之中大的那一個。

kResolutionShowAll:所有顯示,能夠理解爲保證內容都顯示在屏幕以內,實際也是寬高等比縮放,但縮放比例取寬比和高比之中小的那一個。

通常來講,咱們但願設計時一屏的內容,用戶在實際設備上也能在一屏內看到,拿本例來講,1024x768分辨率時,右下角的按鈕卻跑到屏幕外去了。看完上面的分析,你應該知道如何解決了: 對了,改變pEGLView->setDesignResolutionSize(480, 320, kResolutionNoBorder);第三個參數爲kResolutionShowAll

 

 

 

9.簡述cocos2d-x內存管理,圖片緩存機制

 

cocos2d-x最初移植自cocos2dobjective C版本。所以,在內存管理上,使用了和NSObject相似的引用計數器方法,相關接口放置在CCObject類中。

引用計數器——手動管理內存

CCObject的及其子類的對象在建立時,引用計數自動設置爲1。以後每次調用retain,引用計數+1。每次調用release,引用計數-1;若引用計數=0,則直接delete this

retain是在指針傳遞和賦值時使用的,他的含義是表示擁有。這常常用在指針賦值上。

自動釋放池——自動管理內存

對於使用autorelease的對象,沒必要管它,每幀結束後會自動釋放。

CCNode節點管理

cocos2d-x使用節點組成一棵樹,渲染的時候要遍歷這棵樹。CCNode是全部節點類的父類,他內部使用了一個CCArray對象管理他的全部子節點,當對象被添加爲子節點時,其實是被添加到CCArray對象中,同時會調用這個對象的retain方法。同理,從CCArray中移除時,也會調用release方法。

靜態工廠

cocos2d-x中存在大量的靜態工廠方法,這些方法中,全都對this指針調用了autorelease函數。

cache機制類

 

cache內部也使用了ratainrelease方法,防止這些資源被釋放掉。

使用這些cache,咱們能夠保存預加載的一些資源,在方便的時候調用它,去綁定給一些對象。注意,這些cache在場景切換時,不會自動刪除,須要手動調用purgeXXXX方法,進行清理。

 

 

10.簡述cocos2d-x 3.0Cocos2d-x 2.X版本有哪些區別? 3.0 版本的新特性.

 

如下提到便可

1

運用了C++ 11  的新特性,例如:

std::function

strongly typed enums

std::thread

override 

2

移除了全部Object-c模式,刪除了CC前輟使用純C++函數    

 

3

全部的單例都使用getInstance() and destroyInstance() 

 

4

建立新項目:

 v3.0再也不須要建立Xcode模版,使用create-multi-platform-projects.py來建立一個跨平臺的項目,使用方法

 1cd 2dx根目錄,MAC平臺使用./create-multi-platform-projects.py  而後提示:

-bash: ./create-multi-platform-projects.py: /usr/bin/evn: bad interpreter: No such file or directory

不要緊,咱們打開.py文件,發現其實引用的是tools/project_creator/create_project.py 這文件

 2,咱們再cd project_creator文件中,使用 ./create_project.py -p <PROJECT_NAME> -k <PACKAGE_NAME> -l <cpp|lua|javascript>

 3,這樣咱們就能夠在2dxprojects文件夾中找到建立好的項目

相關文章
相關標籤/搜索