1、cocos2d-x 3.0里面的數據結構有哪些?簡要說明其作用
回答:Cocos2d-x 3.0用Vector和Map<K, V>代替了之前的CCArray和CCDictionary,新的容器類使用模板類來避免了不必要的數據類型轉換,同時能夠完美地支持標准庫中的各種迭代操作,例如std::find(),std::sort()等等。實際上,在3.0中Vector和Map<K,T>是對標准庫中std::vector和std::unordered_map<K,T>的封裝,使其能夠結合Cocos2d-x的內存管理方式
cocos2d::Vector<T>的一些操作的時間復雜度如下:隨機訪問,O(1);將元素插入到尾部或者刪除尾部的元素,O(1);隨機插入或刪除, O(n)
cocos2d::Map<K,V>是使用std::unordered_map作為底層結構的關聯式容器。而std::unordered_map是一個存儲鍵值對的關聯式容器,它可以通過它們的鍵快速檢索對應的值。使用unordered_map,鍵通常是唯一的,而值則與這個鍵對應。
Vector<T>和 Map<K,V>通常用來和 autorelease 一起工作,我們通常應該將一個autorelease 對象加入到 Vector 或者 Map 中,例如 Node 將所有的子元素存儲在一個 Vector<Node*>中。Vector 和 Map 對新加入的元素執行 retain 操作,並對從中移除的元素執行 release 操作,這樣元素在從 Vector 或者 Map 中移除的時候就會被自動釋放。
2、 Cocos2d-‐x 內存管理機制
回答:Cocos2d-‐x 中所有內存管理方式的基礎是引用計數,動態分配一個 Ref 對象后其引用計數為 1,並通過 retain 和 release 來增持和減少其引用計數。引用計數本身並不能幫助我們進行內存管理。 為了正確地釋放對象的內存, Cocos2d-x 使用 Objective-C 里面的自動回收池的機制來管理對象內存的釋放。Autorelease 有點類似於一個共享的”智能指針”,該”智能指針”的作用域為一幀,該幀結束后,它將釋放自己的引用計數,此時,如果該對象沒有被其他”共享指針”引用, 則對象被釋放。 如果對象被引用, 則保留。
3、cocos2d-x的圖形渲染機制?
回答: 頂點着色(頂點坐標變幻等一系列操作)———>幾何着色器(添加或刪除部分頂點)———>光柵化(把數據信息轉化成像素信息)———>片段着色器(把像素顯示到屏幕上)着色器==其他操作(比如深度測試,光線疊加等)
CCApplication::sharedApplication()->run()----》 CCDirector::sharedDirector()->mainLoop()----》drawScene();
4、cache的機制原理
CCApplication::sharedApplication()->run()----》 CCDirector::sharedDirector()->mainLoop()----》drawScene();
4、cache的機制原理
回答:把新加進內存的資源做一個hashmap存儲,每一個資源加一個key。每次加載資源的時候,先查找資源是否存在,存在直接返回,否則加載進內存。
5、場景切換的內存處理過?
5、場景切換的內存處理過?
回答:先構建新場景,然后顯示新場景,然后釋放舊場景。
但是在新場景onEnter,舊場景onExit的時候,會調用舊場景的cleanup,清理schedule相關部分。
6、動作回掉函數是怎么作用的氣原理是什么?
但是在新場景onEnter,舊場景onExit的時候,會調用舊場景的cleanup,清理schedule相關部分。
6、動作回掉函數是怎么作用的氣原理是什么?
回答:target(回調對象指針)加 selector(回調函數指針)。
7、有哪些操作會導致內存泄露,如果發生內存泄露如何處理?
7、有哪些操作會導致內存泄露,如果發生內存泄露如何處理?
回答:在堆上分配動態內存和釋放動態內存的方法是 new 和 delete,在申請內存之后,如果不使用了就需要delete掉,不然就會造成內存的溢出。解決辦法:使用vld、memwatch加載到項目中,調試
8、cocos2d-x游戲儲存
回答:CCUserDefault和SQList
CCUserDefalt存在的的問題
1.沒有記錄和表的概念
你會發現,如果要設置多存檔,必須自己操作,而且代碼會變得復雜,容易出錯。
對於簡單的游戲可以使用CCUserDefalt,但是對於復雜游戲,可以考慮使用SQLite。
2.沒有數據類型安全
比如,如果你錯寫把一個Integer按Bool讀取,是沒有錯誤提示的
3.沒有存檔數據完整性的校驗
我們找到之前的存檔記錄,用CCUserDefault::getXMLFilePath()可以獲得存檔位置,打開它。
CCUserDefalt存在的的問題
1.沒有記錄和表的概念
你會發現,如果要設置多存檔,必須自己操作,而且代碼會變得復雜,容易出錯。
對於簡單的游戲可以使用CCUserDefalt,但是對於復雜游戲,可以考慮使用SQLite。
2.沒有數據類型安全
比如,如果你錯寫把一個Integer按Bool讀取,是沒有錯誤提示的
3.沒有存檔數據完整性的校驗
我們找到之前的存檔記錄,用CCUserDefault::getXMLFilePath()可以獲得存檔位置,打開它。
9、簡述CCSpriteframeCache CCSpriteBatchNode?
回答:CCSpriteFrameCache 緩存了所有CCSpriteFrame. 可以一下方式獲取特定frame並設定給Sprite. 前提是文件已經緩存
CCSpriteBatchNode 中的所有CCSprite只會被渲染1次,因此可以提高游戲的FPS。
限制:加入到CCSpriteBatchNode 中的CCSprite必須使用同一張紋理圖。
CCSpriteBatchNode 中的所有CCSprite只會被渲染1次,因此可以提高游戲的FPS。
限制:加入到CCSpriteBatchNode 中的CCSprite必須使用同一張紋理圖。
10、cocos2d-x的屏幕適配解決方案?
回答:pEGLView->setDesignResolutionSize(480, 320, kResolutionNoBorder);第三個參數,
kResolutionExactFit:會靠拉伸來填滿屏幕,舉例來說背景圖會變形來填充屏幕,因為1024:768=1.3, 480:320=1.5,寬高比不同,圖片也就無法等比縮放來填滿屏幕,只能變形了。
kResolutionNoBorder: 看不到黑邊,實際就是寬高等比縮放,但縮放比例取寬比和高比之中大的那一個。
kResolutionShowAll:全部顯示,可以理解為保證內容都顯示在屏幕之內,實際也是寬高等比縮放,但縮放比例取寬比和高比之中小的那一個。
kResolutionExactFit:會靠拉伸來填滿屏幕,舉例來說背景圖會變形來填充屏幕,因為1024:768=1.3, 480:320=1.5,寬高比不同,圖片也就無法等比縮放來填滿屏幕,只能變形了。
kResolutionNoBorder: 看不到黑邊,實際就是寬高等比縮放,但縮放比例取寬比和高比之中大的那一個。
kResolutionShowAll:全部顯示,可以理解為保證內容都顯示在屏幕之內,實際也是寬高等比縮放,但縮放比例取寬比和高比之中小的那一個。
11、減少內存開銷的方法有哪些?圖片壓縮方法有哪些?
回答:及時釋放,減少泄露,重用資源,plist,延遲加載,分部加載等。
調整加載圖片的方式,改變圖片的格式,.pvr,pngquant壓縮圖片 、32位圖片改為16圖片加載。
12、autorelease和release的區別?
autorelease封裝了retain和release,它會把類加入到autoreleaseManager進行管理,在autoreleaseManager里,通過autoreleasePool進行自動加減引用數目(refrence),retain 和release類似於new 跟delete,
retain會對object引用計數加1,release會對object引用計數減1,retain跟release要成對使用,如果我們新創建一個實例,這個實例已經加入到autorelease,但是我們沒有馬上使用這個實例,我們需要對這個實例進行retain操作,在其他地方引用之后,對其進行release操作。
retain會對object引用計數加1,release會對object引用計數減1,retain跟release要成對使用,如果我們新創建一個實例,這個實例已經加入到autorelease,但是我們沒有馬上使用這個實例,我們需要對這個實例進行retain操作,在其他地方引用之后,對其進行release操作。
release是立即釋放引用計數,如果到達0,對象被銷毀。autorelease是延遲釋放,是為了更好管理內存產生的。
autorelease的實現機制,是將對象加入一個pool統一管理,當pool被release時,pool里面每個對象都會被release。pool基於一個棧式結構管理,每一個mainloop會pop一次。同一個mainloop里面調用autorelease,會把引用加入棧頂pool。
