123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
- // SPDX-License-Identifier: MIT
- #pragma once
- #include <Jolt/Core/TickCounter.h>
- #include <Jolt/Physics/Collision/Shape/Shape.h>
- JPH_SUPPRESS_WARNING_PUSH
- JPH_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic")
- // Shorthand function to ifdef out code if narrow phase stats tracking is off
- #ifdef JPH_TRACK_NARROWPHASE_STATS
- #define JPH_IF_TRACK_NARROWPHASE_STATS(...) __VA_ARGS__
- #else
- #define JPH_IF_TRACK_NARROWPHASE_STATS(...)
- #endif // JPH_TRACK_NARROWPHASE_STATS
- JPH_SUPPRESS_WARNING_POP
- #ifdef JPH_TRACK_NARROWPHASE_STATS
- JPH_NAMESPACE_BEGIN
- /// Structure that tracks narrow phase timing information for a particular combination of shapes
- class NarrowPhaseStat
- {
- public:
- /// Trace an individual stat in CSV form.
- void ReportStats(const char *inName, EShapeSubType inType1, EShapeSubType inType2) const;
- /// Trace the collected broadphase stats in CSV form.
- /// This report can be used to judge and tweak the efficiency of the broadphase.
- static void sReportStats();
- atomic<uint64> mNumQueries = 0;
- atomic<uint64> mHitsReported = 0;
- atomic<uint64> mTotalTicks = 0;
- atomic<uint64> mChildTicks = 0;
- static NarrowPhaseStat sCollideShape[NumSubShapeTypes][NumSubShapeTypes];
- static NarrowPhaseStat sCastShape[NumSubShapeTypes][NumSubShapeTypes];
- };
- /// Object that tracks the start and end of a narrow phase operation
- class TrackNarrowPhaseStat
- {
- public:
- TrackNarrowPhaseStat(NarrowPhaseStat &inStat) :
- mStat(inStat),
- mParent(sRoot),
- mStart(GetProcessorTickCount())
- {
- // Make this the new root of the chain
- sRoot = this;
- }
- ~TrackNarrowPhaseStat()
- {
- uint64 delta_ticks = GetProcessorTickCount() - mStart;
- // Notify parent of time spent in child
- if (mParent != nullptr)
- mParent->mStat.mChildTicks += delta_ticks;
- // Increment stats at this level
- mStat.mNumQueries++;
- mStat.mTotalTicks += delta_ticks;
- // Restore root pointer
- JPH_ASSERT(sRoot == this);
- sRoot = mParent;
- }
- NarrowPhaseStat & mStat;
- TrackNarrowPhaseStat * mParent;
- uint64 mStart;
- static thread_local TrackNarrowPhaseStat *sRoot;
- };
- /// Object that tracks the start and end of a hit being processed by a collision collector
- class TrackNarrowPhaseCollector
- {
- public:
- TrackNarrowPhaseCollector() :
- mStart(GetProcessorTickCount())
- {
- }
- ~TrackNarrowPhaseCollector()
- {
- // Mark time spent in collector as 'child' time for the parent
- uint64 delta_ticks = GetProcessorTickCount() - mStart;
- if (TrackNarrowPhaseStat::sRoot != nullptr)
- TrackNarrowPhaseStat::sRoot->mStat.mChildTicks += delta_ticks;
- // Notify all parents of a hit
- for (TrackNarrowPhaseStat *track = TrackNarrowPhaseStat::sRoot; track != nullptr; track = track->mParent)
- track->mStat.mHitsReported++;
- }
- private:
- uint64 mStart;
- };
- JPH_NAMESPACE_END
- #endif // JPH_TRACK_NARROWPHASE_STATS
|