Cocos 2 d-x C++Node LocalZorder$Arrivalを使用したより効率的なソート
7988 ワード
文書ディレクトリソースコード 原理 マクロ定義 CC_LITTLE_ENDIAN CC_64BITS
ソースコード
ノードの定義には、次のようなものがあります.
参照_localZorder$Arrivalの場所は1ヶ所しかありません:
げんり
相対_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比較、原因不明、解答を求めます.
ソースコード
ノードの定義には、次のようなものがあります.
#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比較、原因不明、解答を求めます.