cocos2dx[3.x](3)——大鉅變3.x



【嘮叨】

    本節摘自https://github.com/fusijie/Cocos2d-x3.0-Release-Note/blob/master/cocos2d-x_v3.0_release_notes.md

 

【目錄】

  • v3.0 亮點

  • 細節

    • C++11 特性

      • std::function

      • 強類型枚舉

      • 覆蓋

    • 去OC化

      • 移除C++類的“cc”前綴以及free functions

      • 使用 clone 替代 copy

      • 單例類採用了 getInstance 和 destroyInstance

      • 使用了 Ref 代替 Object

      • getters

      • POD 類型

    • 新的渲染器

      • 渲染器特性

        • 自動批處理

        • 自動剔除

        • 全局 Z 值

      • Sprite 和 SpriteBatchNode

    • 優化 LabelTTF / LabelBMFont / LabelAtlas

    • 新的事件分發機制

    • 物理引擎集成

  • 其他 API 變更

    • ccTypes.h

    • 棄用的函數和全局變量

  • 新的模板容器

    • Map    替代 CCDictionary

    • Vector 替代 CCArray

    • Value  替代 CCBool, CCFLoat, CCDouble

 


 

v3.0 亮點

  • 使用 C++(C++11) 的特性取代了 Objective-C 的特性

  • 優化了 Labels

  • 優化了渲染器(比 v2.2 更快)

  • 新的事件分發機制

  • 物理引擎集成

  • 新的 UI 對象

  • 模板容器

    • 使用 cocos2d::Map<> 替代了 CCDictionary , 用法

    • 使用 cocos2d::Vector<> 替代了 CCArray, 用法

    • 使用 cocos2d::Value 替代了 CCBoolCCFLoatCCDouble, 用法

細節

C++11 特性

C++11 的一部分特性已經被使用到 cocos2d-x 中了:

  • std::function, 包含了回調中使用的 lambda 對象

  • 對於大多數的 cocos2d-x 枚舉和常量採用了強類型枚舉

  • 在線程中使用了 std::thread

  • 對於 Override 和 final 方法,增加了 override 和 final 上下文關鍵字

std::function

  • CallFunc 可以由 std::function<void()> 來創建

  • CallFuncN 可以由 std::function<void(Node*)> 來創建

  • CallFuncND 和 CallFuncO 已經被移除了因爲它們可以類似地由 CallFuncN 和 CallFunc 來創建. 可以查看示例中的 ActionsTest.cpp 文件

  • MenuItem 支持 std::function<void(Node*)> 作爲回調

CallFunc 示例:

//
// v2.1 版本
CCCallFunc *action1 = CCCallFunc::create( this, callfunc_selector( MyClass::callback_0 ) );

// v3.0 版本 (短版本)
auto action1 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_0,this));
auto action2 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_1,this, additional_parameters));

// v3.0 版本 (長版本)
auto action1 = CallFunc::create( std::bind( &MyClass::callback_0, this));
auto action2 = CallFunc::create( std::bind( &MyClass::callback_1, this, additional_parameters));

// v3.0 中你也可以使用lambda表達式或者其他函數對象
auto action1 = CallFunc::create(
 [&](){
 auto s = Director::sharedDirector()->getWinSize();
 auto label = LabelTTF::create(“called:lambda callback”, “Marker Felt”, 16);
 label->setPosition(ccp( s.width/4*1,s.height/2-40));
 this->addChild(label);
 }  );
//

MenuItem 示例:

//
// v2.1 版本
CCMenuItemLabel *item = CCMenuItemLabel::create(label, this, menu_selector(MyClass::callback));

// v3.0 版本 (短版本)
auto item = MenuItemLabel::create(label, CC_CALLBACK_1(MyClass::callback, this));

// v3.0 版本 (長版本)
auto item = MenuItemLabel::create(label, std::bind(&MyClass::callback, this, std::placeholders::_1));

// v3.0 中你也可以使用lambda表達式或者其他函數對象
auto item = MenuItemLabel::create(label,
 [&](Object *sender) {
 // do something. Item “sender” clicked
  });
//

強類型枚舉

    以 k 開頭的常量和枚舉量,通常被定義爲 int 或者簡單的 enum 類型,現在已經被強類型枚舉(enum class)所替代,這樣有利於避免衝突和類型錯誤。

新的格式是:

| v2.1       | v3.0        |
| kTypeValue | Type::VALUE |

示例:

| v2.1                             | v3.0                             |
| kCCTexture2DPixelFormat_RGBA8888 | Texture2D::PixelFormat::RGBA8888 |
| kCCDirectorProjectionCustom      | Director::Projection::CUSTOM     |
| ccGREEN                          | Color3B::GREEN                   |
| CCPointZero                      | Point::ZERO                      |
| CCSizeZero                       | Size::ZERO                       |

覆蓋

    爲了捕獲覆蓋方法中可能出現的錯誤,子類的覆蓋方法添加了 override 的關鍵字。

示例:

//
class Sprite : public Node {
// Overrides
virtual void setTexture(Texture2D *texture) override;
virtual Texture2D* getTexture() const override;
}
//

去OC化

移除C++類的“cc”前綴以及free functions

類的變更

    因爲 cocos2d-x 已經使用了 cocos2d 的命名空間,因此也就不需要在所有的類中添加 CC 的前綴。 

示例:

| v2.1       | v3.0     |
| CCSprite   | Sprite   |
| CCNode     | Node     |
| CCDirector | Director |
| etc…                |

free functions 的變更

    對於 drawing primitives:

  • 已經被添加到 DrawPrimitives 命名空間

  • 移除 cc 前綴

    對於 gl proxy functions:

  • 已經被添加到 GL 命名空間

  • 移除 ccGL 前綴

示例:

| v2.1                | v3.0                         |
| ccDrawPoint()       | DrawPrimitives::drawPoint()  |
| ccDrawCircle()      | DrawPrimitives::drawCircle() |
| ccGLBlendFunc()     | GL::blendFunc()              |
| ccGLBindTexture2D() | GL::bindTexture2D()          |
| etc…                                             |

使用 clone 替代 copy

    clone() 返回了一份 autoreleased 版本的拷貝。

    copy() 不再被支持,如果你使用它,仍然是可以編譯的,但是代碼會崩掉。

示例:

//
// v2.1
CCMoveBy *action = (CCMoveBy*) move->copy();
action->autorelease();

// v3.0
// 不需要使用autorelease,也不需要做轉換
auto action = move->clone();
//

單例類採用了 getInstance 和 destroyInstance

    所有的單例類使用 getInstance() 和 destroyInstance() (如果可用) 來獲取和摧毀實例。

Examples:

| v2.1                          | v3.0                        |
| CCDirector->sharedDirector()  | Director->getInstance()     |
| CCDirector->endDirector()     | Director->destroyInstance() |
| etc…                                                      |

使用了 Ref 代替了 Object

    因爲 Object 容易讓人混淆,所以重命名爲 Ref ,同時移除了和引用計數無關的函數,之前所有繼承於 Object 的類現在都改爲繼承於 Ref

getters

    Getters 現在使用了 get 前綴。

示例:

| v2.1                            | v3.0*                              |
| node->boundingBox()             | node->getBoundingBox()             |
| sprite->nodeToParentTransform() | sprite->getNodeToParentTransform() |
| etc…                                                               |

    當然 getters 在聲明中也被標識爲 const 。 

示例:

//
// v2.1
virtual float getScale();

// v3.0
virtual float getScale() const;
//

POD 類型

    接收 POD 類型作爲參數的方法(比如:TexParamsPointSize,等等)已經修改爲傳遞成 const 型引用。

示例:

//
// v2.1
void setTexParameters(ccTexParams* texParams);

// v3.0
void setTexParameters(const ccTexParams& texParams);
//

新的渲染器

    Cocos2d-x v3.0 有了一個更威武,更優雅,更易擴展,更靈活的新渲染器,但是它依舊很容易使用也很好理解。Cocos2d-x 的老用戶們將會發現新的API是如此的熟悉,根本不需要去考慮底層做了什麼改變和更新,用起來仍然是這麼的舒服。

  • 它已經從 Scene Graph 中分離出來,draw() 方法替代了 “drawing” 發送了一個 渲染命令 給 渲染器,而 渲染器 負責繪製排隊的 渲染命令 。

  • Quadcommands (Sprite 和 Particlesystem 對象使用) 將會自動進行批處理。

  • CustomCommand 對象允許用戶自定義 OpenGL 代碼,使用的 API 類似 v2.2。

  • GroupCommand 對象允許渲染器中擁有不同 OpenGL 值的“堆棧”。

  • Sprite 的自動剔除功能(雖然從技術上講,自動剔除功能是表現在 Sprite 代碼上而不是 Renderer 代碼上)

  • 全局 Z 軸順序 (局部 Z 軸順序仍然有效)

    更多的細節信息,可以閱讀如下文檔: Renderer Specification document

渲染器特性

自動批處理

    自動批處理功能意味着 渲染器將會把 多次繪製調用 打包爲一次 大的繪製調用(AKA batch)。組合 繪製調用當然需要滿足一定的條件:

  • 它僅工作在 QuadCommand 命令下(由 Sprite 和 ParticleSystem 對象使用)

  • QuadCommadnds 必須共享相同的材質 ID :相同的紋理ID,相同的 GLProgram 和相同的混合功能

  • QuadCommands 必須是連續的

    如果這些條件都滿足的話,渲染器 將會使用所有這些 QuadCommand 對象創建一個批處理(一次繪製調用)。

    如果你不熟悉 OpenGL 的使用,批處理對於您遊戲的能否擁有一個流暢的運行速度是很重要的,越少的批處理(繪製調用)越有利於您遊戲的表現力。

自動剔除

    目前,自動剔除功能只在 Sprite 對象中實現。

    當 Sprite::draw() 被調用的時候,它將會檢查 Sprite 是否超出屏幕,如果是的話,它將不會發送 QuadCommand 命令給 渲染器,因此可以獲得一些性能上的提升。

全局 Z 值

    Node 增加了新的函數 setGlobalZOrder() / getGlobalZOrder(),之前的舊函數 setZOrder() / getZOrder() 也被重命名爲 setLocalZOrder() / getLocalZOrder()

    globalZOrder 是一個 float (不是 int)的參數。這個值在 渲染器 中用來給 RenderCommand 排序。較低的值擁有較高的優先級。這意味着一個 globalZorder 爲 -10的節點會比一個 globalZOrder 爲 10 的節點優先繪製。

    globalZOrder 爲 0 (默認值)的節點將會根據 Scene Graph 順序繪製。

    如果 globalZOrder 不變的話,Cocos2d-x v3.0 和 Cocos2d-x v2.2 行爲一致。

    globalZOrder() 和 localZOrder():

  • globalZOrder 是用於 渲染器 中用來給“繪製命令”排序的

  • localZOrder 是用於父節點的子節點數組中給 節點 對象排序的

Sprite 和 SpriteBatchNode

    v2.2 版本中推薦的優化遊戲方式是將 SpriteBatchNode 對象設置爲 Sprite 對象的父節點。 雖然使用SpriteBatchNode 對象仍然是一個非常好的優化遊戲的方式,但是它仍然有一定的限制:

  • Sprite 對象的孩子只能是 Sprite (否則,Cocos2d-x 會觸發斷言)

    • 當 Sprite 的父節點是 SpriteBactchNode 時,不能添加 ParticleSystem 作爲 Sprite的子節點。

    • 這將導致當 Sprite 的父節點是 SpriteBatchNode 時,不能使用 ParallaxNode

  • 所有的 Sprite 對象必須共享相同的紋理ID (否則,Cocos2d-x 會觸發斷言)

  • Sprite 對象使用 SpriteBatchNode 的混合函數和着色器。

    雖然 v3.0 仍然支持 SpriteBatchNode (與之前的版本擁有相同的特效和限制),但是我們不鼓勵使用它。相反,我們推薦直接使用 Sprite,不需要再它作爲子節點添加到 SpriteBatchNode 中。

    但是,爲了能讓 v3.0 有更好的表現,你必須要確保你的 Sprite 對象滿足以下條件:

  • 貢獻相同的紋理ID(把它們放在一個spritesheet中,就像使用 SpriteBatchNode 一樣)

  • 確保它們使用相同的着色器和混合函數(就像使用 SpriteBatchNode 一樣)

    如果這麼做, Sprites 將會像使用 SpriteBatchNode 一樣的快…(在舊設備上大概慢了10%,在新設備上基本上察覺不出)

    v2.2 和 v3.0 最大的區別在於:

  • Sprite 對象可以有不同的紋理ID。

  • Sprite 對象可以有不同種類的 Node 作爲子節點,包括 ParticleSystem

  • Sprite 對象可以有不同的混合函數和不同的着色器。

    但是如果你這麼做,渲染器 可能無法對它所有的子節點進行批處理(性能較低)。但是遊戲仍然可以正常運行,不會觸發任何斷言。

總結:

  • 保持將所有的精靈放在一張大的 spritesheet 中。

  • 使用相同的混合函數(使用默認)

  • 使用相同的着色器(使用默認)

  • 不要將精靈添加到 SpriteBatchNode

    只有當你需要一些額外的性能上提升(雖然很小),SpriteBatchNode 纔會是你最後的選擇(你需要對它的限制條件很熟悉)。

優化 LabelTTF / LabelBMFont / LabelAtlas

    LabelTTFLabelBMFont 和 LabelAtlas 將會被新的 Label 代替. 新的 Label 帶來的好處有:

  • 統一了創建 LabelTTFLabelBMFont 和 LabelAtlas 的 API

  • 使用 freetype 生成 labels 的紋理,這樣就能保證在不同的平臺下 labels 有相同的效果。

  • 緩存紋理以提高性能

新的事件分發機制

    觸摸事件,鍵盤事件,加速器事件和自定義事件等所有事件都由 EventDispatcher 分發。 TouchDispatcher,KeypadDispatcherKeyboardDispatcherAccelerometerDispatcher 已經被移除。

    EventDispatcher 的特性主要有:

  • 事件的分發基於渲染順序

  • 所有的事件都由 EventDispatcher 分發

  • 可以使用 EventDispatcher 來分發自定義事件

  • 可以註冊一個 lambda 表達式作爲回調函數

    更多 EventDispatcher 細節可以參考 this document。

物理引擎集成

    在 v3.0 中,我們把基於 Chipmunk2D 的物理引擎集成到 Cocos2d-x 中,通過這些特性,你可以很容易創建基於物理效果的遊戲,而不必去理解物理引擎。

    更的關於物理引擎集成的細節可以參考 this document。

其他 API 變更

ccTypes.h

    在 ccType.h 中刪除結構命名中的 cc 前綴,將全局函數移至靜態成員函數,將全局常量移至靜態成員常量。

| v2.1 struct names       | v3.0 struct names    |
| ccColor3B               | Color3B              |
| ccColor4B               | Color4B              |
| ccColor4F               | Color4F              |
| ccVertex2F              | Vertex2F             |
| ccVertex3F              | Vertex3F             |
| ccTex2F                 | Tex2F                |
| ccPointSprite           | PointSprite          |
| ccQuad2                 | Quad2                |
| ccQuad3                 | Quad3                |
| ccV2F_C4B_T2F           | V2F_C4B_T2F          |
| ccV2F_C4F_T2F           | V2F_C4F_T2F          |
| ccV3F_C4B_T2F           | V3F_C4B_T2F          |
| ccV2F_C4B_T2F_Triangle  | V2F_C4B_T2F_Triangle |
| ccV2F_C4B_T2F_Quad      | V2F_C4B_T2F_Quad     |
| ccV3F_C4B_T2F_Quad      | V3F_C4B_T2F_Quad     |
| ccV2F_C4F_T2F_Quad      | V2F_C4F_T2F_Quad     |
| ccBlendFunc             | BlendFunc            |
| ccT2F_Quad              | T2F_Quad             |
| ccAnimationFrameData    | AnimationFrameData   |

    全局函數變更示例

//
// in v2.1
ccColor3B color3B = ccc3(0, 0, 0);
ccc3BEqual(color3B, ccc3(1, 1, 1));
ccColor4B color4B = ccc4(0, 0, 0, 0);
ccColor4F color4F = ccc4f(0, 0, 0, 0);
color4F = ccc4FFromccc3B(color3B);
color4F = ccc4FFromccc4B(color4B);
ccc4FEqual(color4F, ccc4F(1, 1, 1, 1));
color4B = ccc4BFromccc4F(color4F);

color3B = ccWHITE;

// in v3.0
Color3B color3B = Color3B(0, 0, 0);
color3B.equals(Color3B(1, 1, 1));
Color4B color4B = Color4B(0, 0, 0, 0);
Color4F color4F = Color4F(0, 0, 0, 0);
color4F = Color4F(color3B);
color4F = Color4F(color4B);
color4F.equals(Color4F(1, 1, 1, 1));
color4B = Color4B(color4F);

color3B = Color3B::WHITE;
//

棄用的函數和全局變量

| v2.1 names    | v3.0 names |
| ccp           | Point |
| ccpNeg        | Point::- |
| ccpAdd        | Point::+ |
| ccpSub        | Point::- |
| ccpMult       | Point::* |
| ccpMidpoint   | Point::getMidpoint |
| ccpDot        | Point::dot |
| ccpCrosss     | Point::cross |
| ccpPerp       | Point::getPerp |
| ccpRPerp      | Point::getRPerp |
| ccpProject    | Point::project |
| ccpRotate     | Point::rotate |
| ccpUnrotate   | Point::unrotate |
| ccpLengthSQ   | Point::getLengthSq() |
| ccpDistanceSQ | Point::getDistanceSq |
| ccpLength     | Point::getLength |
| ccpDistance   | Point::getDistance |
| ccpNormalize  | Point::normalize |
| ccpForAngle   | Point::forAngle |
| ccpToAngle    | Point::getAngle |
| ccpClamp      | Point::getClampPoint |
| ccpFromSize   | Point::Point |
| ccpCompOp     | Point::compOp |
| ccpLerp       | Point::lerp |
| ccpFuzzyEqual | Point::fuzzyEqual |
| ccpCompMult   | Point::Point |
| ccpAngleSigned | Point::getAngle |
| ccpAngle      | Point::getAngle |
| ccpRotateByAngle | Point::rotateByAngle |
| ccpLineInersect | Point::isLineIntersect |
| ccpSegmentIntersect | Point::isSegmentIntersect |
| ccpIntersectPoint | Point::getIntersectPoint |

| CCPointMake   | Point::Point |
| CCSizeMake    | Size::Size |
| CCRectMake    | Rect::Rect |
| PointZero     | Point::ZERO |
| SizeZero      | Size::ZERO |
| RectZero      | Rect::ZERO |

| TiledGrid3DAction::tile | TiledGrid3DAction::getTile |
| TiledGrid3DAction::originalTile | TiledGrid3DAction::getOriginalTile |
| TiledGrid3D::tile | TiledGrid3D::getTile |
| TiledGrid3D::originalTile | TiledGrid3D::getOriginalTile |
| Grid3DAction::vertex | Grid3DAction::getVertex |
| Grid3DAction::originalVertex | Grid3DAction::getOriginalVertex |
| Grid3D::vertex | Grid3D::getVertex |
| Grid3D::originalVertex | Grid3D::getOriginalVertex |

| Configuration::sharedConfiguration | Configuration::getInstance |
| Configuration::purgeConfiguration | Configuration::destroyInstance() |
| Director::sharedDirector() | Director::getInstance() |
| FileUtils::sharedFileUtils | FileUtils::getInstance |
| FileUtils::purgeFileUtils | FileUtils::destroyInstance |
| GLView::sharedOpenGLView | GLView::getInstance |

| ShaderCache::sharedShaderCache | ShaderCache::getInstance |
| ShaderCache::purgeSharedShaderCache | ShaderCache::destroyInstance |
| AnimationCache::sharedAnimationCache | AnimationCache::getInstance |
| AnimationCache::purgeSharedAnimationCache | AnimationCache::destroyInstance |
| SpriteFrameCache::sharedSpriteFrameCache | SpriteFrameCache::getInstance |
| SpriteFrameCache:: purgeSharedSpriteFrameCache | SpriteFrameCache::destroyInstance |

| NotificationCenter::sharedNotificationCenter | NotificationCenter::getInstance |
| NotificationCenter:: purgeNotificationCenter | NotificationCenter::destroyInstance |
| Profiler::sharedProfiler | Profiler::getInstance |
| UserDefault::sharedUserDefault | UserDefault::getInstance |
| UserDefault::purgeSharedUserDefault | UserDefault::destroyInstance |
| Application::sharedApplication | Application::getInstance |

| ccc3()        | Color3B() |
| ccc3BEqual()  | Color3B::equals() |
| ccc4()        | Color4B() |
| ccc4FFromccc3B() | Color4F() |
| ccc4f()       | Color4F() |
| ccc4FFromccc4B() | Color4F() |
| ccc4BFromccc4F() | Color4B() |
| ccc4FEqual()  | Color4F::equals() |
| ccWHITE       | Color3B::WHITE |
| ccYELLOW      | Color3B::YELLOW |
| ccBLUE        | Color3B::BLUE |
| ccGREEN       | Color3B::GREEN |
| ccRED         | Color3B::RED |
| ccMAGENTA     | Color3B::MAGENTA |
| ccBLACK       | Color3B::BLACK |
| ccORANGE      | Color3B::ORANGE |
| ccGRAY        | Color3B::GRAY |
| kBlendFuncDisable | BlendFunc::BLEND_FUNC_DISABLE |

 

 

本文出自 “夏天的風” 博客,請務必保留此出處http://shahdza.blog.51cto.com/2410787/1549850

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章