1.autorelease和release的區別javascript
release是當即釋放引用計數,若是到達0,對象被銷燬。java
autorelease是延遲釋放,是爲了更好管理內存產生的。好比以下代碼:緩存
vbash
CCObject *fun() ide
{ 函數
CCObject *myobj = new CCObject(); oop
//myobj->release(); //語句1 this
//myobj->autorelease() //語句2 lua
return myobj; spa
}
若是不調用語句1語句2,會致使內存泄露,根據函數定義原則,誰污染誰治理,若是要求外部調用者釋放,不科學。
若是調用語句1,會當即被釋放,外部調用者沒法獲取對象。
調用語句2,延遲被釋放,能夠保證外部調用者得到對象指針,而又會被釋放。
autorelease的實現機制,是將對象加入一個pool統一管理,當pool被release時,pool裏面每一個對象都會被release。pool基於一個棧式結構管理,每個mainloop會pop一次。同一個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,即alpha,red,green,blue。那麼圖片佔用的內存能夠算出。
壓縮像素即減小圖片像素點多少,內存即減小。可是圖片會變小。
壓縮圖片質量,即不用4個字節表示一個像素,如256色,就是用一個字節表示一個像素,每2個bit表示一個通道。可是圖片表現效果變差。
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最初移植自cocos2d的objective 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內部也使用了ratain和release方法,防止這些資源被釋放掉。
使用這些cache,咱們能夠保存預加載的一些資源,在方便的時候調用它,去綁定給一些對象。注意,這些cache在場景切換時,不會自動刪除,須要手動調用purgeXXXX方法,進行清理。
10.簡述cocos2d-x 3.0與Cocos2d-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來建立一個跨平臺的項目,使用方法
1,cd 到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,這樣咱們就能夠在2dx的projects文件夾中找到建立好的項目