105 lines
3.8 KiB
C++
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次平均
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
|