Files
Renderive/YSGraphic_Core/base/PerformanceShower_p.h
T
2026-06-16 13:33:27 +08:00

105 lines
3.8 KiB
C++

#pragma once
#include "../RenderAble.h"
namespace YSG {
struct PerformanceLine {
PerformanceLine() = default;
explicit PerformanceLine(const QString& data) {
mData = data;
int argIndex = 1;
while(data.contains("%" + QString::number(argIndex))) {
argIndex++;
}
mPlaceHolderNum = argIndex - 1;
mValues.resize(mPlaceHolderNum);
}
QString mData;
int mPlaceHolderNum{};
QVector<double> mValues;
QString toString() {
QString ret = mData;
int argIndex = 1;
for (const double& value : mValues) {
ret =ret.replace("%"+QString::number(argIndex), QString::number(value, 'f', 2));
argIndex++;
}
return ret;
}
};
struct CounterLine {
QString mName;
std::chrono::system_clock::time_point mTotalStart;
int mCountTimes = 0;
[[nodiscard]] double getRate() const {
double useTime = std::chrono::duration<double>(std::chrono::system_clock::now() - mTotalStart).count();
return mCountTimes / useTime;
}
[[nodiscard]] QString toString() const {
double useTime = std::chrono::duration<double>(std::chrono::system_clock::now() - mTotalStart).count();
// return QString("%1 :%2 (次/s) 当前次数%3,当前时间 %4")
// .arg(mName, QString::number(mCountTimes / useTime, 'f', 2))
// .arg(mCountTimes)
// .arg(QString::number(useTime, 'f', 2));
return QString("%1 :%2 (次/s)")
.arg(mName, QString::number(mCountTimes / useTime, 'f', 2));
}
};
class PerformanceShower : public QWidget {
Q_OBJECT
public:
explicit PerformanceShower(QWidget *parent = nullptr);
QFont mFont;
int mTopMargin = 4, mLeftMargin = 4, mRightMargin = 28, mBottomMargin = 8;
int mOldSize = -1;
QVector<QString> mAllInfo;
Q_INVOKABLE void firstResize(int w, int h);
void refresh();
QVector<QString> all();
SpinLock mMutex;
QMap<QString, PerformanceLine> mInfoMap;
QMap<QString, CounterLine> mCounter;
QVector<QString> mFixedInfo;
QMap<QString, QString> mInfos;
void refreshCounter();
void counterIncrease(const QString& counterName);
protected:
void paintEvent(QPaintEvent *event) override;
bool mMoving = false;
QPoint mStartPos, mStartGlobalPos;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
};
class Cacl {
public:
std::chrono::system_clock::time_point mStart;
QString mName;
PerformanceShower *mPerformanceShower{};
Cacl(const QString& name, PerformanceShower* performanceShower) {
if(!performanceShower) return;
mStart = std::chrono::system_clock::now();
mName = name;
mPerformanceShower = performanceShower;
}
~Cacl() {
if(!mPerformanceShower) return;
double useTime = std::chrono::duration<double>(std::chrono::system_clock::now() - mStart).count() * 1000;
if(!mPerformanceShower->mInfoMap.contains(mName)) {
mPerformanceShower->mInfoMap[mName] = PerformanceLine(mName);
}
PerformanceLine& data = mPerformanceShower->mInfoMap[mName];
data.mValues[0] = useTime;
if(data.mValues.size() > 1) {
data.mValues[1] = data.mValues[1] * 0.9 + useTime * 0.1; //约等于近10次平均
}
}
};
}