测试代码如下:
typedef struct Point
{
double x;
double y;
} Point;
typedef struct PointRect
{
Point ptLeftTop;
Point ptRightTop;
Point ptLeftBottom;
Point ptRightBottom;
} PointRect;
typedef struct VIDEO_PROPERTY
{
float fAlpha;
float fBrightness;
float fContrast;
float fSaturation;
float fFeather;
float fBlur;
float fCircleCorner;
float fLeftClip;
float fRightClip;
float fUpClip;
float fDownClip;
} VIDEO_PROPERTY;
typedef struct AUDIO_PROPERTY
{
int iVolume;
} AUDIO_PROPERTY;
typedef struct VIDEO_EFFECT
{
VIDEO_PROPERTY prop;
PointRect SrcRect;
PointRect DstRect;
int lWidth;
int lHeight;
BOOL bEnableVideoAlpha;
BOOL bEnable16_235To0_255;
BOOL bEnableVideoRatio;
BOOL bEnableTransparent;
float fVideoAspectRatio;
UINT iVideoBackColor;
BOOL bEnableMatte;
UINT iMatteColor;
float fMatteRange;
BOOL bEnableCover;
BOOL bCoverReverse;
void *pCoverTexture;
BOOL bEnableMap;
void *pMapTexture;
BOOL bEnableVertexMap;
void *pMapVertexTexture;
BOOL bHdrToSdr;
BOOL bHorMirror;
BOOL bVerMirror;
BOOL bClipStretch;
BOOL bFourSample;
} VIDEO_EFFECT;
typedef struct tagEffectParamInfo
{
//std::string strName; //特效变量名称
std::string strType; //特效变量类型
//std::string strValue; //特效变量值
std::any value; //特效变量值
}EffectParamInfo;
typedef struct tagSpecialEffect
{
std::string effectName; //特效类型
std::string techName; //执行的特效
//std::map<std::string, EffectParamInfo> effectParams; //特效变量
std::map<int, EffectParamInfo> effectParams; //特效变量
}SpecialEffect;
std::string f2string(float f)
{
if (f==1.0f)
return "0.0";
else if (f==0.0f)
return "1.0";
else
return to_string(f);
}
bool VideoEffectToSpecialEffect(VIDEO_EFFECT *pVideoEffect, SpecialEffect *pSpecialEffect)
{
if (!pVideoEffect || !pSpecialEffect)
return false;
EffectParamInfo info;
#if 1
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fAlpha;
pSpecialEffect->effectParams[1] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fBrightness;
pSpecialEffect->effectParams[2] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fContrast;
pSpecialEffect->effectParams[3] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fSaturation;
pSpecialEffect->effectParams[4] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fFeather;
pSpecialEffect->effectParams[5] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fBlur;
pSpecialEffect->effectParams[6] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fCircleCorner;
pSpecialEffect->effectParams[7] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fLeftClip;
pSpecialEffect->effectParams[8] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fRightClip;
pSpecialEffect->effectParams[9] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fUpClip;
pSpecialEffect->effectParams[10] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fDownClip;
pSpecialEffect->effectParams[11] = info;
info.strType = "INT"; info.value = pVideoEffect->lWidth;
pSpecialEffect->effectParams[12] = info;
info.strType = "INT"; info.value = pVideoEffect->lHeight;
pSpecialEffect->effectParams[13] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableVideoAlpha;
pSpecialEffect->effectParams[14] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnable16_235To0_255;
pSpecialEffect->effectParams[15] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableVideoRatio;
pSpecialEffect->effectParams[16] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableTransparent;
pSpecialEffect->effectParams[17] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->fVideoAspectRatio;
pSpecialEffect->effectParams[18] = info;
info.strType = "INT"; info.value = pVideoEffect->iVideoBackColor;
pSpecialEffect->effectParams[19] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableMatte;
pSpecialEffect->effectParams[20] = info;
info.strType = "INT"; info.value = pVideoEffect->iMatteColor;
pSpecialEffect->effectParams[21] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->fMatteRange;
pSpecialEffect->effectParams[22] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableCover;
pSpecialEffect->effectParams[23] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bCoverReverse;
pSpecialEffect->effectParams[24] = info;
info.strType = "ADDR"; info.value = pVideoEffect->pCoverTexture;
pSpecialEffect->effectParams[25] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableMap;
pSpecialEffect->effectParams[26] = info;
info.strType = "ADDR"; info.value = pVideoEffect->pMapTexture;
pSpecialEffect->effectParams[27] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableVertexMap;
pSpecialEffect->effectParams[28] = info;
info.strType = "ADDR"; info.value = pVideoEffect->pMapVertexTexture;
pSpecialEffect->effectParams[29] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bHdrToSdr;
pSpecialEffect->effectParams[30] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bHorMirror;
pSpecialEffect->effectParams[31] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bVerMirror;
pSpecialEffect->effectParams[32] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bClipStretch;
pSpecialEffect->effectParams[33] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bFourSample;
pSpecialEffect->effectParams[34] = info;
/*info.strType = "FLOAT"; info.value = pVideoEffect->prop.fAlpha;
pSpecialEffect->effectParams["fAlpha"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fBrightness;
pSpecialEffect->effectParams["fBrightness"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fContrast;
pSpecialEffect->effectParams["fContrast"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fSaturation;
pSpecialEffect->effectParams["fSaturation"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fFeather;
pSpecialEffect->effectParams["fFeather"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fBlur;
pSpecialEffect->effectParams["fBlur"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fCircleCorner;
pSpecialEffect->effectParams["fCircleCorner"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fLeftClip;
pSpecialEffect->effectParams["fLeftClip"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fRightClip;
pSpecialEffect->effectParams["fRightClip"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fUpClip;
pSpecialEffect->effectParams["fUpClip"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->prop.fDownClip;
pSpecialEffect->effectParams["fDownClip"] = info;
info.strType = "INT"; info.value = pVideoEffect->lWidth;
pSpecialEffect->effectParams["lWidth"] = info;
info.strType = "INT"; info.value = pVideoEffect->lHeight;
pSpecialEffect->effectParams["lHeight"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableVideoAlpha ;
pSpecialEffect->effectParams["bEnableVideoAlpha"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnable16_235To0_255 ;
pSpecialEffect->effectParams["bEnable16_235To0_255"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableVideoRatio ;
pSpecialEffect->effectParams["bEnableVideoRatio"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableTransparent;
pSpecialEffect->effectParams["bEnableTransparent"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->fVideoAspectRatio;
pSpecialEffect->effectParams["fVideoAspectRatio"] = info;
info.strType = "INT"; info.value = pVideoEffect->iVideoBackColor;
pSpecialEffect->effectParams["iVideoBackColor"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableMatte;
pSpecialEffect->effectParams["bEnableMatte"] = info;
info.strType = "INT"; info.value = pVideoEffect->iMatteColor;
pSpecialEffect->effectParams["iMatteColor"] = info;
info.strType = "FLOAT"; info.value = pVideoEffect->fMatteRange;
pSpecialEffect->effectParams["fMatteRange"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableCover;
pSpecialEffect->effectParams["bEnableCover"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bCoverReverse;
pSpecialEffect->effectParams["bCoverReverse"] = info;
info.strType = "ADDR"; info.value = pVideoEffect->pCoverTexture;
pSpecialEffect->effectParams["pCoverTexture"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableMap;
pSpecialEffect->effectParams["bEnableMap"] = info;
info.strType = "ADDR"; info.value = pVideoEffect->pMapTexture;
pSpecialEffect->effectParams["pMapTexture"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bEnableVertexMap;
pSpecialEffect->effectParams["bEnableVertexMap"] = info;
info.strType = "ADDR"; info.value = pVideoEffect->pMapVertexTexture;
pSpecialEffect->effectParams["pMapVertexTexture"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bHdrToSdr;
pSpecialEffect->effectParams["bHdrToSdr"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bHorMirror;
pSpecialEffect->effectParams["bHorMirror"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bVerMirror;
pSpecialEffect->effectParams["bVerMirror"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bClipStretch;
pSpecialEffect->effectParams["bClipStretch"] = info;
info.strType = "BOOL"; info.value = pVideoEffect->bFourSample;
pSpecialEffect->effectParams["bFourSample"] = info;*/
#else
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fAlpha);
pSpecialEffect->effectParams["fAlpha"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fBrightness);
pSpecialEffect->effectParams["fBrightness"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fContrast);
pSpecialEffect->effectParams["fContrast"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fSaturation);
pSpecialEffect->effectParams["fSaturation"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fFeather);
pSpecialEffect->effectParams["fFeather"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fBlur);
pSpecialEffect->effectParams["fBlur"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fCircleCorner);
pSpecialEffect->effectParams["fCircleCorner"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fLeftClip);
pSpecialEffect->effectParams["fLeftClip"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fRightClip);
pSpecialEffect->effectParams["fRightClip"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fUpClip);
pSpecialEffect->effectParams["fUpClip"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fDownClip);
pSpecialEffect->effectParams["fDownClip"] = info;
info.strType = "INT"; info.strValue = f2string(pVideoEffect->lWidth);
pSpecialEffect->effectParams["lWidth"] = info;
info.strType = "INT"; info.strValue = f2string(pVideoEffect->lHeight);
pSpecialEffect->effectParams["lHeight"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableVideoAlpha ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bEnableVideoAlpha"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bEnable16_235To0_255 ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bEnable16_235To0_255"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableVideoRatio ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bEnableVideoRatio"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableTransparent ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bEnableTransparent"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->fVideoAspectRatio);
pSpecialEffect->effectParams["fVideoAspectRatio"] = info;
info.strType = "INT"; info.strValue = f2string(pVideoEffect->iVideoBackColor);
pSpecialEffect->effectParams["iVideoBackColor"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableMatte ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bEnableMatte"] = info;
info.strType = "INT"; info.strValue = f2string(pVideoEffect->iMatteColor);
pSpecialEffect->effectParams["iMatteColor"] = info;
info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->fMatteRange);
pSpecialEffect->effectParams["fMatteRange"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableCover ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bEnableCover"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bCoverReverse ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bCoverReverse"] = info;
info.strType = "ADDR"; info.strValue = f2string((__int64)pVideoEffect->pCoverTexture);
pSpecialEffect->effectParams["pCoverTexture"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableMap ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bEnableMap"] = info;
info.strType = "ADDR"; info.strValue = f2string((__int64)pVideoEffect->pMapTexture);
pSpecialEffect->effectParams["pMapTexture"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableVertexMap ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bEnableVertexMap"] = info;
info.strType = "ADDR"; info.strValue = f2string((__int64)pVideoEffect->pMapVertexTexture);
pSpecialEffect->effectParams["pMapVertexTexture"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bHdrToSdr ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bHdrToSdr"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bHorMirror ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bHorMirror"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bVerMirror ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bVerMirror"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bClipStretch ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bClipStretch"] = info;
info.strType = "BOOL"; info.strValue = pVideoEffect->bFourSample ? "TRUE" : "FALSE";
pSpecialEffect->effectParams["bFourSample"] = info;
#endif
return true;
}
UINT GetBooLSpecialEffect(SpecialEffect *pSpecialEffect)
{
auto it = pSpecialEffect->effectParams.find(21);
if(it != pSpecialEffect->effectParams.end())
{
if (it->second.strType == "INT")
{
return std::any_cast<UINT>(it->second.value);
}
}
}
int main(int argc, char* argv[])
{
SpecialEffect specialEffect;
specialEffect.effectName = "main";
specialEffect.techName = "auto";
VIDEO_EFFECT effect = { 0 };
effect.prop.fAlpha = 1.0f;
effect.iMatteColor = 1;
int time1 = timeGetTime();
for (int i = 0; i < 10000; i++)
{
VideoEffectToSpecialEffect(&effect, &specialEffect);
}
int time2 = timeGetTime();
UINT t = 0;
for (int i = 0; i < 10000; i++)
{
t += GetBooLSpecialEffect(&specialEffect);
int time3 = timeGetTime();
printf("t:%d\n", t);
printf("\n 总时间:%d %d %d", time3 - time1,time2-time1,time3-time2);
scanf_s("");
return 0;
}
测试结果:
前提条件:执行10000次函数调用。
1.map主要的性能消耗是在构造map的时候,查找map 基本不耗性能。
2.如果map的key用string类型,执行10000次VideoEffectToSpecialEffect函数,但是每次只是修改specialEffect的值,耗时45ms左右。
3.如果map的key用string类型,执行10000次VideoEffectToSpecialEffect函数,但是每次只是都创建specialEffect变量,耗时110ms左右.
4.由2和3得出结论,执行10000次创建specialEffect变量,将耗时60多ms.
5.如果将map的key改为int类型。执行10000次VideoEffectToSpecialEffect函数,但是每次只是修改specialEffect的值,耗时15ms左右.
6.如果将map的key改为int类型,执行10000次VideoEffectToSpecialEffect函数,但是每次只是都创建specialEffect变量,耗时75ms左右.
7.由5和6得出结论,执行10000次创建specialEffect变量,将耗时60多ms. 将key改为int,执行10000次将节省30ms.
8.将VideoEffectToSpecialEffect函数字符串转换改成std::any类型将节省15毫秒。