求高人优化代码!copy视频数据相关。解决方法
求高人优化代码!copy视频数据相关。
代码是使用别人写的一个类,大致原理是插入一个Filter在系统中,然后在图像绘制时通知用户程序.
代码如下:
//绘制完图象的时候,收到这个消息, isRendered为true的时候,表示绘制成功,否则失败
void CVideoDC::onEndRender(bool isRendered)
{
if(isRendered)
{
unsigned char* linePixel = m_VideoImage.m_Pixels;
unsigned char* pixel = linePixel;
union sPixel_t
{
struct{unsigned char r,g,b,a;};
DWORD color;
};
sPixel_t dcpixel;
for(int y = 0 ; y < m_VideoImage.m_Size.m_Height ; ++y)
{
for(int x = 0 ; x < m_VideoImage.m_Size.m_Width ; ++x)
{
dcpixel.a = 0;
dcpixel.b = pixel[0];
dcpixel.g = pixel[1];
dcpixel.r = pixel[2];
SetPixel(m_hDC,x, m_VideoImage.m_Size.m_Height - y, dcpixel.color);
pixel += 3;
}
linePixel += m_VideoImage.m_Size.m_Pitch;
}
}
}
以上这段代码是把图像绘制到我自己的DC上(是一个内存dc而不是窗体dc,窗体dc更慢),运行时只有10多帧每秒,并且cpu占到了50%(双核的).
把这段代码注释,cpu立刻就降了下来.可见这里的效率有问题.
求高人帮忙优化.
------解决方案--------------------
不能用SetPixel
直接用CreateDIBitmap创建位图,然后BitBlt
------解决方案--------------------
抛砖引玉了,1. 考虑展开循环,2.使用mmx指令优化
------解决方案--------------------
for(int x = 0 ; x < RTRect.mWidth ; ++x)
{
pDstLine[3 * x + 0] = pSrcLine[3 * x + 0];
pDstLine[3 * x + 1] = pSrcLine[3 * x + 1];
pDstLine[3 * x + 2] = pSrcLine[3 * x + 2];
}
=>
memcpy(pDastLine, pSrcLine, RTRect.mWidth * 3);
------解决方案--------------------
使用的filter,可以指定媒体类型为需要的对应RGB或yuv格式,这样避免转换,直接内存中就是bmp等格式,copy出来就可以
------解决方案--------------------
承接性能优化外包
代码是使用别人写的一个类,大致原理是插入一个Filter在系统中,然后在图像绘制时通知用户程序.
代码如下:
//绘制完图象的时候,收到这个消息, isRendered为true的时候,表示绘制成功,否则失败
void CVideoDC::onEndRender(bool isRendered)
{
if(isRendered)
{
unsigned char* linePixel = m_VideoImage.m_Pixels;
unsigned char* pixel = linePixel;
union sPixel_t
{
struct{unsigned char r,g,b,a;};
DWORD color;
};
sPixel_t dcpixel;
for(int y = 0 ; y < m_VideoImage.m_Size.m_Height ; ++y)
{
for(int x = 0 ; x < m_VideoImage.m_Size.m_Width ; ++x)
{
dcpixel.a = 0;
dcpixel.b = pixel[0];
dcpixel.g = pixel[1];
dcpixel.r = pixel[2];
SetPixel(m_hDC,x, m_VideoImage.m_Size.m_Height - y, dcpixel.color);
pixel += 3;
}
linePixel += m_VideoImage.m_Size.m_Pitch;
}
}
}
以上这段代码是把图像绘制到我自己的DC上(是一个内存dc而不是窗体dc,窗体dc更慢),运行时只有10多帧每秒,并且cpu占到了50%(双核的).
把这段代码注释,cpu立刻就降了下来.可见这里的效率有问题.
求高人帮忙优化.
------解决方案--------------------
不能用SetPixel
直接用CreateDIBitmap创建位图,然后BitBlt
------解决方案--------------------
抛砖引玉了,1. 考虑展开循环,2.使用mmx指令优化
------解决方案--------------------
for(int x = 0 ; x < RTRect.mWidth ; ++x)
{
pDstLine[3 * x + 0] = pSrcLine[3 * x + 0];
pDstLine[3 * x + 1] = pSrcLine[3 * x + 1];
pDstLine[3 * x + 2] = pSrcLine[3 * x + 2];
}
=>
memcpy(pDastLine, pSrcLine, RTRect.mWidth * 3);
------解决方案--------------------
使用的filter,可以指定媒体类型为需要的对应RGB或yuv格式,这样避免转换,直接内存中就是bmp等格式,copy出来就可以
------解决方案--------------------
承接性能优化外包