/*---------------------------------------------------------------------------* Project: NintendoWare File: dev_ParticleProfile.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 20629 $ *---------------------------------------------------------------------------*/ #ifndef NW_DEV_PARTICLEPROFILE_H_ #define NW_DEV_PARTICLEPROFILE_H_ #include //! パーティクル専用のプロファイルのマクロ有効にします。 //#define NW_PARTICLE_PROFILE_ENABLED namespace nw { namespace dev { //! NW_DEV_ENABLED と NW_PARTICLE_PROFILE_ENABLED がともに定義されていたらプロファイルマクロを有効にします。 #if defined( NW_DEV_ENABLED ) && defined( NW_PARTICLE_PROFILE_ENABLED ) //--------------------------------------------------------------------------- //! @brief パーティクル専用のProfileManager を管理するクラスです。 //--------------------------------------------------------------------------- class ParticleProfileCenter { private: NW_DISALLOW_COPY_AND_ASSIGN(ParticleProfileCenter); public: //! @brief プロファイルの管理クラスを初期化します。 static void Initialize(int maxReport, os::IAllocator* allocator); //! @brief プロファイルの管理クラスを削除します。 static void Finalize(os::IAllocator* allocator); //! @brief レポートを出力します。 static void DumpCost() { if (!m_Instance) return; m_Instance->m_ProfileManager->DumpReports(); } //! @brief 区間計測レポートを出力します。 static void DumpIntervalCost() { if (!m_Instance) return; m_Instance->m_IntervalProfileManager->DumpReports(); } //! @brief プロファイルをクリアします。 static void Clear() { if (!m_Instance) return; m_Instance->m_ProfileManager->ClearReports(); m_Instance->m_IntervalProfileManager->ClearReports(); } //! @brief インスタンスを取得します。 static ParticleProfileCenter& GetInstance() { NW_NULL_ASSERT(m_Instance); return *m_Instance; } //! @brief プロファイルマネージャインスタンスを取得します。 static nw::dev::ProfileManager* GetProfileManager() { if (!m_Instance) return NULL; return GetInstance().m_ProfileManager; } //! @brief コスト計測を開始します。 static bool Start(const char* name); //! @brief コスト計測を終了します。 static void Stop(); private: s64 GetTime(); ParticleProfileCenter() : m_ProfileManager(NULL) {} static ParticleProfileCenter* m_Instance; nw::dev::ProfileManager* m_ProfileManager; nw::dev::ProfileManager* m_IntervalProfileManager; bool m_IsRuning; nw::dev::ProfileManager::Report m_Report; s64 m_Time; }; #else class ParticleProfileCenter { private: NW_DISALLOW_COPY_AND_ASSIGN(ParticleProfileCenter); public: static void Initialize(int, os::IAllocator*){} static void Finalize(os::IAllocator*){} static void Report(){} static nw::dev::ProfileManager* GetProfileManager(){ return NULL; } private: ParticleProfileCenter(){} }; #endif // defined( NW_DEV_ENABLED ) && defined( NW_PARTICLE_PROFILE_ENABLED ) } // namespace dev } // namespace nw //! NW_DEV_ENABLED と NW_PARTICLE_PROFILE_ENABLED がともに定義されていたらプロファイルマクロを有効にします。 #if defined( NW_DEV_ENABLED ) && defined( NW_PARTICLE_PROFILE_ENABLED ) // パーティクル用のプロファイラ登録マクロです。 // 計測したい区間を START と END で括ってください。 #define NW_PARTICLE_PROFILE_START(name) bool ret = nw::dev::ParticleProfileCenter::Start(name) #define NW_PARTICLE_PROFILE_STOP() if(ret) nw::dev::ParticleProfileCenter::Stop() // パーティクル用の計測用プロファイラ登録マクロです。 #define NW_PARTICLE_PROFILE(name) \ nw::dev::AutoProfile p(name, nw::dev::ParticleProfileCenter::GetProfileManager()) // パーティクル用のプロファイラ初期化マクロです。 #define NW_INITIALIZE_PARTICLE_PROFILE(maxReport, allocator) nw::dev::ParticleProfileCenter::Initialize(maxReport, allocator) // パーティクル用のプロファイラ終了マクロです。 #define NW_FINALIZE_PARTICLE_PROFILE(allocator) nw::dev::ParticleProfileCenter::Finalize(allocator) // パーティクル用のプロファイラログ出力マクロです。 #define NW_REPORT_PARTICLE_INTERVAL_PROFILE() nw::dev::ParticleProfileCenter::DumpIntervalCost() #define NW_REPORT_PARTICLE_PROFILE() nw::dev::ParticleProfileCenter::DumpCost() // パーティクル用の保存したプロファイルをクリアします。 #define NW_CLEAR_PARTICLE_PROFILE() nw::dev::ParticleProfileCenter::Clear() #else #define NW_PARTICLE_PROFILE_START(name) (void)0 #define NW_PARTICLE_PROFILE_STOP() (void)0 #define NW_PARTICLE_PROFILE(name) (void)0 #define NW_INITIALIZE_PARTICLE_PROFILE(maxReport, allocator) (void)0 #define NW_FINALIZE_PARTICLE_PROFILE(allocator) (void)0 #define NW_REPORT_PARTICLE_INTERVAL_PROFILE() (void)0 #define NW_REPORT_PARTICLE_PROFILE() (void)0 #define NW_CLEAR_PARTICLE_PROFILE() (void)0 #endif #endif // NW_DEV_PARTICLEPROFILE_H_