Cocos 2 d-x C++Node LocalZorder$Arrivalを使用したより効率的なソート


文書ディレクトリ
  • ソースコード
  • 原理
  • マクロ定義
  • CC_LITTLE_ENDIAN
  • CC_64BITS

  • ソースコード
    ノードの定義には、次のようなものがあります.
    #if CC_LITTLE_ENDIAN
        union {
            struct {
                std::uint32_t _orderOfArrival;
                std::int32_t _localZOrder;
            };
            std::int64_t _localZOrder$Arrival;
        };
    #else
        union {
            struct {
                std::int32_t _localZOrder;
                std::uint32_t _orderOfArrival;
            };
            std::int64_t _localZOrder$Arrival;
        };
    #endif
    

    参照_localZorder$Arrivalの場所は1ヶ所しかありません:
    template<typename _T> inline
    static void sortNodes(cocos2d::Vector<_T*>& nodes)
    {
        static_assert(std::is_base_of<Node, _T>::value, "Node::sortNodes: Only accept derived of Node!");
    #if CC_64BITS
        std::sort(std::begin(nodes), std::end(nodes), [](_T* n1, _T* n2) {
            //      _localZOrder$Arrival  ,      _localZOrder   _orderOfArrival
            return (n1->_localZOrder$Arrival < n2->_localZOrder$Arrival);
        });
    #else
        std::sort(std::begin(nodes), std::end(nodes), [](_T* n1, _T* n2) {
            return (n1->_localZOrder == n2->_localZOrder && n1->_orderOfArrival < n2->_orderOfArrival) || n1->_localZOrder < n2->_localZOrder;
        });
    #endif
    }
    

    げんり
    相対_localZorder$Arrival変数について、localZorderが格納する場所は上位にあり、orderOfArrivalが格納する位置は下位であるため、あるノードの_localZorderが他のノードより大きい場合、localZorder$Arrivalの値も必ず別のノードより大きい.とき_localZorderの値が等しい場合は、下位_orderOfArrival比較.
    仮定_localZorder$Arrivalが8位、localZorderが上位4位、orderOfArrivalが下位4位:
    _localZOrder$Arrival:0000 0000
    このときnode 1の_localZorderは0001,orderOfArrivalが1111の場合node 1の_localZorder$Arrival値31,node 2の_localZorderは0010,orderOfArrivalは0000、node 2の_localZorder$Arrival値32、すなわち_orderOfArrivalがどんなに大きくても、影響はありません.localZorderのサイズ比較.使用_localZorder$Arrival比較の場合、比較順序は常に先に比較_localZorder,等しい再比較_orderOfArrivalですが、この場合は1回の取数と1回の論理演算を行うだけで、わずかにパフォーマンスが向上します.
    マクロ定義
    CC_LITTLE_ENDIAN
    異なるオペレーティングシステムでは、データがメモリに格納されている上位レベルが必ずしも同じではない(具体的には、サイズエンドモードを参照する)ため、リトルエンドモードであるか否かを判断することで、優先順位が_localZorder比較.
    CC_64BITS
    64ビットシステムの実行時のみ使用_localZorder$Arrival比較、原因不明、解答を求めます.