高級cocos2d-x招聘面試試題參考

from http://edu.9miao.com/group/1/thread/155html



最初原文:http://www.cnblogs.com/xxiaoye/p/3950185.htmljava

做者:xxiaoyelinux

 

昨天聽了騰訊2015校招的在線宣講會,看到了遊戲技術大拿Steven,他總結了須要的達人得愛技術,能堅持,夠挑剔。立刻校招了,加油吧,騷年~android

   網上關於cocos2d-x的面試題比較少,這裏蒐集和整理了一寫網上關於cocos2d-x遊戲開發的面試題。但願對找工做的同窗有幫助。若有錯誤,請拍磚ios

 

一、Cocos2d-x是怎樣實現跨平臺?c++

AppDelegate 做爲跨平臺程序入口,在這之上作了另外一層的封裝,封裝了不一樣平臺的不一樣實現。好比咱們一般認爲一個程序是由 main 函數開始運行,那咱們就去找尋,咱們看到了在 proj.linux 目錄下存在 main.cpp 文件。在main.cpp 中 CCApplication::sharedApplication()–>run(); 這一句看起,這一句標誌着, cocos2d-x 程序正式開始運行,如今定位到 sharedApplication() 方法的實現,在CCAplication類中咱們能夠看到從 sharedApplication() 方法,在調用 run() 方法,在這以前,咱們須要調用到它的構造函數,不然不能運行,這就是爲何在 CCApplication::sharedApplication()–>run(); 以前,咱們首先有語句 AppDelegate app; 而建立 AppDelegate 變量的緣由是 AppDelegate 是 CCApplication 的子類,在建立子類對象的時候,調用其構造函數的同時,父類構造函數也會執行,而後就將 AppDelegate 的對象賦給了 CCApplication 的靜態變量,而在 AppDelegate 之中咱們實現了 applicationDidFinishLaunching方法,因此在 CCApplication 中 run 方法的開始處調用的就是 AppDelegate 之中的實現。而咱們在此方法中咱們初始化了一些變量,建立了第一個 CCScene 場景等,以後的控制權,便全權交給了CCDirector::sharedDirector()–>mainLoop(); 方法了。面試

在cocos2d-x的文件夾下,有一個platform文件夾,裏面存放了跨平臺的封裝接口。當前目錄下有CCApplicationProtocol.h頭文件,子目錄有win32,Android,IOS三個文件夾,裏面分別存放跨平臺須要的函數,其中包括CCApplication。而AppDelegate 類則是繼承自CCApplicationCCApplication又繼承自sql

CCApplicationProtocol。在CCApplicationProtocol中定義了applicationDidFinishLaunching虛方法,由CCApplication 繼承, AppDelegate 實現的。以此實現了跨平臺。數據庫

java輸入→Jni→c++輸入→c++處理(API實現)→c++輸出→Jni→java輸出編程

而在Android 平臺啓動 cocos2d-x程序。能夠找到Android 平臺與上面等價的入口點,proj.android/jni/hellocpp/main.cpp。在main.cpp文件裏面並無看到 main 函數,這是因爲不一樣的平臺封裝因此有着不一樣的實現,在 Android 平臺,默認是使用 Java 開發,可使用 Java 經過 Jni 調用 C++ 程序,而這裏也正式如此。咱們暫且只需知道,由 Android 啓動一個應用,經過各類峯迴路轉,最終執行到了 Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit 函數,由此,變開始了咱們 cocos2d-x Android 平臺的程序入口處。,其它平臺程序的入口必然包含着其它平臺的不一樣封裝實現 。

參考:http://blog.leafsoar.com/archives/2013/05-05.html

 

2.cocos2d-x 程序的結束流程?

程序運行時期,由 mainLoop 方法維持運行着遊戲以內的各個邏輯,當在彈出最後一個場景,或者直接調用 CCDirector::end(); 方法後,觸發遊戲的清理工做,執行 purgeDirector 方法,從而結束了 CCEGLView(不一樣平臺不一樣封裝,PC使用OpenGl封裝,移動終端封裝的爲 OpenGl ES) 的運行,調用其 end() 方法,從而直接執行 exit(0); 退出程序進程,從而結束了整個程序的運行。(Android 平臺的 end() 方法內部經過Jni 方法 terminateProcessJNI(); 調用 Java 實現的功能,其功能同樣,直接結束了當前運行的進程)

 

三、cocos2d-x內存管理?

目前主要有兩種實現智能管理內存的技術,一種是引用計數,一種是垃圾回收。Cocos2d-x採用的是引用計數機制。爲此實現了本身的根類CCObject,每一個對象都包含了一個用來控制生命週期的引用計數器,就是CCObject的成員變量m_uReference。

對於m_uReference,構造函數建立時對該引用計數器賦值爲1(自引用,並無實際的使用),當須要引用對象時調用retain()方法增1,當引用結束的時候調用release()方法減一。而autorelease()方法(create工廠方法迫切須要)會將對象放入自動回收池(CCAutoReleasePool)實現靈活的垃圾回收。當每一幀結束的時候,自動回收池中的對象都會被執行一次release()

autorelease()方法裏面代碼將該對象添加到自動釋放池中:CCPoolManager::sharedPoolManager()->addObject(this);

 create方法將對象加入內存池後,對象的全部權已經屬於內存池了, 咱們返回的指針實際上是沒有全部權的.  主循環mainloop幹了件很是重要的事情, 那就是pop最上層的autorelease pool, 此時是在release所有僅僅由此內存池全部的對象. 就是依靠這樣的原理, 咱們能夠放心的將對象放在autorelease pool中, 知道在須要的時候, 這個對象就能正確的釋放, 同時只要有上層的父節點經過addChild對遊戲對象有了全部權之後, 又能正確的保證該對象不會被刪除.

 

若是在一幀以內生成了大量的autorelease對象,將會致使回收池性能降低。所以,在生成autorelease對象密集的區域(一般循環中)的先後,咱們最好能夠手動建立並釋放一個回收池。CCAut0m_pReleasePoolStack

 CCPoolManager::sharePoolManage()->push()  

 for(){}

   CCPoolManager::sharePoolManage()->pop()

CCAutoreleasePool

 

四、Cocos2d-x中如何處理內存泄露,處理內存泄露有哪些檢測工具,如何針對crash後的遊戲聲稱報告發送回服務器

VS下內存泄露檢測工具Visual Leak Detector:教程http://blog.csdn.net/onerain88/article/details/8574938

xcode ios下內存泄露使用Instruments來查找程序中的內存泄露:http://blog.csdn.net/totogo2010/article/details/8233565


四、Cocos2d-x 3版本的特性?

3.0版 一、將有一個新的渲染系統。

二、支持多線程,而且易於支持新的GPU平臺。

         三、更快,更高效也更易於維護的Label文本繪製。

  四、擁有一個新的,統一的事件派發器。

  五、減小對objectc的兼容考慮,更多考慮對C++開發者更友好。用C++最佳實踐,替換掉了objectc模式。移除匈牙利命名法。

  六、menu和action能夠接受Lambda表達式做爲輸入

cocos2d之父×××觸控視頻講解3.0新特性:http://v.youku.com/v_show/id_XNjM0OTY1NzEy.html


五、C++ 11的特性?

參考文章:C++11 語法記錄    Cocos2dx3.2學習準備(一):C++11新特性  Cocos2d-x 3.1.1 學習日誌6--30分鐘瞭解C++11新特性

 

六、闡述cocos2d-x 中CCScene CCLayer CCSprite CCNodee

CCNode是CCScene,CCLayer,CCSprite的基類,是一個抽象類,沒有可視化的表現形式。是爲了方便構造渲染樹而定義的一個類。CCScence是場景類,裏面能夠放CCLayer和CCSprite。一個app裏面能夠放多個scence,可是同一時刻只有一個scence被激活。CCLayer是層類,裏面能夠放CCSprite。CCSprite是最小的精靈單元。


七、說一下CCAction和CCActionMessager

CCAction是動做的基類,全部的動做都派生自這個類,它建立的一個對象表明一個動做,動做做用於CCNode。主要使用CCFiniteTimeAction有限次動做執行,就是按時間順序執行一系列動做,執行完後動做結束;CCFiniteTimeAction 繼承自CCAction。CCFiniteTimeAction又分爲CCActionInstanse(瞬時動做的基類)和CCActionInterval(延時動做的基類)。

CCActionInstanse:沒什麼特別,跟CCActionInterval主要區別是沒有執行過程,動做瞬間就執行完成了;CCActionInterval:執行須要必定的時間(或者說一個過程)。咱們用的最多的就是延時動做,下面對它進行單獨介紹。

 

     CCActionMessage是管理全部Action的單例,通常狀況下並不直接使用這個單例,而是使用CCNode的接口,(CCNiode*)->runaction()

而在runaction函數裏,經過CCActionMessage動做管理類將新的CCAction和對應的目標節點添加到其管理的動做表中。

 m_pActionManager->addAction(action, this, !m_bIsRunning); 再調用 action->startWithTarget(pTarget);

CCActionMessage的初始化在CCDirector的初始化裏執行。在裏面經過CCSchedule定時調度器爲CCActionMessage註冊了一個按期更新任務。因此

每一幀刷新更新時都會觸發CCActionMessage的update方法,系統都會遍歷動做表中每個動做,並調用該動做的setup方法。

 

可是假如你想操做的目標不是CCNode的子類或者你想暫停/恢復行動就要使用到CCActionMessager

 

八、你經常使用的cocos2d-x工具備哪些?

TiledMap (地圖編輯器)ParticleEditor(粒子編輯器)cocosBuilder(可視化編輯)Texture Packer(圖片組合工具) plistEditor工具等

 

九、簡單介紹一下CocoStudio

CocoStudio是一套基於Cocos2D-X引擎的工具集,包括UI編輯器、動畫編輯器、場景編輯器和數據編輯器。UI編輯器和動畫編輯器主要面向美術,而場景編輯器和數據編輯器面則面向遊戲策劃,這四個工具合在一塊兒構成了一套完整的遊戲開發體系,幫助開發者進一步下降開發難度、提升開發效率、減小開發成本。
UI編輯器:支持目前Cocos2D-X的全部控件,同時支持多分辨率適配、碎圖合併以及自定義UI。
動畫編輯器:支持骨骼關鍵幀動畫、序列幀動畫,同時支持碎圖合併、Flash動畫直接導入等。
數據編輯器:把策劃用的Excel數值表分解,而後轉化成Cocos2D-X能夠識別的格式。
場景編輯器:能夠整合咱們以前CocoStudio其餘編輯器的資源,編輯當前的遊戲場景,實時演示,所見即所得。同時也支持第三方的工具模式。

 

十、簡述CCSpriteframeCache   CCSpriteBatchNode,並說出CCNode,CCSprite是如何實現繪製的?

CCSpriteframeCache:精靈框幀緩存,緩存了精靈框幀,主要是爲了處理多張碎圖合併出來的紋理圖片。因爲一張大圖包含了多張小圖因此不適合使用CCTextureCache。

CCSpriteBatchNode 中的全部CCSprite只會被渲染1次,所以能夠提升遊戲的FPS,可是加入到 CCSpriteBatchNode 中的CCSprite必須使用同一張紋理圖。

 

十一、cocos2d-x的屏幕適配解決方案?

決定着咱們屏幕適配的因素主要有:屏幕大小 和 寬高比

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(720, 480, kResolutionShowAll);

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(720, 480, kResolutionExactFit); 

kResolutionUnKnown:

這是 cocos2d-x 編寫的默認模式,沒有作任何處理,在這種狀況下,遊戲畫面的大小與比例都是不可控的

kResolutionExactFit

 犧牲了畫質而保持了全屏顯示,對畫面進行了拉伸,意味着相對極端狀況下,原本精靈是方形的,顯示出來變成長方形,原本圓形的變成了橢圓,固此模式不推薦使用。

kResolutionShowAll:

爲了保持設計畫面比例對四周進行留黑邊處理,使得不一樣比例下畫面不能全屏。魚和熊掌不能兼得

kResolutionNoBorder

此模式能夠解決兩個問題,其一:遊戲畫面全屏;其二:保持設置遊戲時的寬高比例,相比 kResolutionShowAll 有所區別的是,爲了填補留下的黑邊,將畫面稍微放大,以致於可以正好補齊黑邊,而這樣作的後果可想而知,補齊黑邊的同時,另外一個方向上將會有一部分畫面露出屏幕以外。

 

十二、cocos2d-x遊戲儲存 CCUserDefault和SQLite

CCUserDefault 是Cocos2d-x引擎提供的持久化方案,存儲全部遊戲通用的用戶配置信息。例如音樂和音效配置。本質是一個XML文件。使用只需一行代碼:

CCUserDefault::sharedUserDefault()->setIntegerForKey("coin",coin-1);

缺點:每次設置和讀取都會遍歷整棵XML樹,效率不高,且值類型具備侷限性,只支持int和float等基本類型。

 http://blog.163.com/zhoulong19880518@126/blog/static/607097022012985417804/

SQList是一個嵌入式數據庫,具備開源,輕量等特色,用於高速且安全地在本地存儲數據。核心接口函數只有一個:

int sqlite3_exec(sqlite3*, const char* sql, int (*callback)(void*,int,char**,char**), void*, char**errmsg);

還有函數: bool sqlite3_open(const char*, sqlite3*);

sqlite3_close(sqlite3*);

 

 

1三、autorelease和release的區別:

release 會立馬對對象進行引用計數減一操做,若是當前對象的引用計數小於0,則會進行釋放。

autorelease 則會將該對象放入到自動釋放池中,當一幀結束的時候會執行release操做進行引用計數減一操做,若是當前對象的引用計數小於0,則會進行釋放。

詳細由第三個問題cocos2d-x內存管理能夠詳細解答。

 

 

1四、cache機制原理是什麼?

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

 

1五、減小內存開銷的方法有哪些,圖片壓縮方法有哪些 及時釋放,減小泄露,重用資源,延遲加載,分部加載等

1)不使用JPG,由於JPG紋理在加載的時候,會實時地轉化爲PNG格式的紋理。

2)預先加載全部的紋理。

3)在後臺加載紋理CCTextureCache類還支持異步加載資源的功能,利用addImageAsync方法。你能夠很方面地給addImageAsync方法添加一個回調方法,這樣,當紋理異步加載結束的時候,能夠獲得通知。

4)若是遊戲有不少場景,在切換場景的時候能夠把前一個場景的內存所有釋放,防止總內存太高. 通常在切換場景的時候釋放資源,若是從A場景切換到B場景,調用的函數順序爲B::init()---->A::exit()---->B::onEnter() 。可若是使用了切換效果,好比CTransitionJumpZoom::transitionWithDuration這樣的函數,則函數的調用順序變爲B::init()---->B::onEnter()---->A::exit() 。
並且第二種方式會有一瞬間將兩個場景的資源疊加在一塊兒,若是不採起過分,極可能會由於內存吃緊而崩潰。

5)儘可能去拼接圖片,使圖片邊長儘量的保持2的N次方而且裝的很滿。但要注意,有邏輯關係的圖片儘可能打包在一張大圖裏,另一點就是打包的時候要考慮到層的分佈。由於爲了渲染效率可能會用到CCSpriteBatchNode;同一個BatchNode裏的圖片都是位於一個層級的,所以必須根據各個圖片的層級關係,打包到不一樣的plist裏。有時內存和效率不能夠兼得,只能儘可能平衡了。

6)避免一個接一個地加載PNG和JPG紋理(他們之間至少等待一幀),由於等待一幀,引用計數會把臨時的UIImage對象釋放掉,減小內存壓力。

7)使用pvr格式的紋理時,只使用pvr.ccz格式,不要使用其它格式!由於它加載速度超快,並且加載的時候使用更少的內存!

7)最快速地減小紋理內存佔用的辦法就是把它們做爲16位顏色深度的紋理來加載。cocos2d默認的紋理像素格式是32位顏色深度。若是把顏色深度減半,那麼內存消耗也就能夠減小一半。而且這還會帶來渲染效率的提高。

1六、說說Lua

 

1七、Cocos2d-x中使用的各類設計模式

觀察者模式:NotificationCenter

裝飾者模式:Action和它的繼承類之間的關係

單例模式:Director有一個sharedDirector,NotificationCenter也有sharedNotificationCenter

      工廠方法:Create方法

 

1九、Unity和Cocos2d-x的區別

Unity3D的亮點是可視化編程,資源輕鬆導入,一鍵部署各個平臺,擁有衆多第三方插件,輕鬆處理音頻/視頻的兼容。Cocos2d-x是擁 有發達的開發者社區,可以方便的找到各類問題的解決方案。spine、TexturePacker、Cocostudio等工具讓引擎方便的處理各類資 源,UI問題。並且開源方式也使開發者很方便的研發出適合本身項目的編輯器。

使用方式:Unity3D任何功能均可以拆分紅單個組件來實現;Cocos2d-x開源的優點在於能夠根據自身的需求進行自定義修改。

可視化編輯:

Unity3D對可視化編輯的支持更好,腳本編譯時間很快,能夠快速出原型出Demo Cocos2d-x更可能是代碼層面的編寫,爲了補充可視化編輯方面的問題推出了Cocos studio 。

形象生動的比較:http://unity3d.9tech.cn/news/2013/1223/39327.html

 

20、遊戲中的狀態機的設計,動畫曲線的設計,相機的移動,遊戲中如何使用MVC之類


2一、如何對手機遊戲進行優化

通常分爲內存優化幀數優化,內存優化和運存優化。

 幀數優化能夠考慮對一個message loop中的邏輯運算進行優化,好比能夠考慮A*的剪枝。或者進行time slice

體積和運行內存優化有如下幾點

使用TexturePacker等工具把多張資源合成一張圖片。

採用png壓縮工具,在打包圖片以前對每張圖片進行壓縮,好比將32bit顏色深度改成16bit顏色深度以下降圖片質量。

 針對不一樣的平臺使用特定的壓縮格式的圖片

 若是項目中幀序列佔的比較多,那麼能夠採用降幀的方式來優化。

縮放圖片,將原來圖片縮小爲原來的70% ~ %80,再對圖像進行放大 採用編輯器,

將大圖轉化爲拼接,那麼就能夠利用地圖編輯器、動做編輯器等從而減小體積,下降內存的使用。

 

2二、如何在對遊戲的「手感」進行改進?

遊戲手感通常指的是打擊感,那麼我就在打擊到一個遊戲對象時,遊戲對象要產生擊退的效果,產生該對象被打擊的感受。 時間控制要恰當,要讓某個對象(好比拳頭)打擊到另外一個遊戲對象的時候,才產生擊退效果,這就須要進行使用消息機制和回調來解決。 

 

2三、如何在數據庫中存儲一我的的全部裝備

創建一我的物ID和裝備ID的關係表。

將人物的全部裝備的id序列化爲一個JSON字符串存儲爲人物的一個字段。 這兩個最大的區別是在修改裝備時,第一個只會影響一條記錄,當時第二個會影響全部裝備,一旦出現bug還讓玩家損失全部裝備。二者各有利弊,根據使用場景本身權衡。。

2四、如何減少cocos2d-x壓縮包的大小?

2五、如何減小遊戲內存的使用?


本人意見:上述問題只能做爲參考。我的感受,若是一下可以對上述問題回答得較使人滿意,這我的至少有個2年以上cocos2d-x開發經驗。即便如此,也未必可以流暢地回答上述問題。若是貴公司就是使用上述標準招人,仍是算了吧--先別開遊戲公司了!


我的認爲,若是一個新手,拿着一個本身製做的半成品去應聘,就應該值得認真思考。

上述意見僅供參考,別誤了您賺大錢啊!

相關文章
相關標籤/搜索