如果要进行大量数据的写,单个变量进行写的方式,将拖慢行能
而memset和memcpy的好处,可以大量的,通过指针方式的写入
{
HI_U8* pVirAddr = (HI_U8*) HI_MPI_SYS_Mmap(outFrame[i].stFrame.stVFrame.u64PhyAddr[0]+ u32MainYSize, u32MainYSize );
if (pVirAddr != HI_NULL)
{
memset( pVirAddr, 0x80, u32MainYSize / 2);
SX_S32 s32Ret = HI_MPI_SYS_Munmap((HI_VOID*)pVirAddr, u32MainYSize / 2);
if(HI_SUCCESS != s32Ret)
{
printf("@@@@@@@@ 1 pVirAddr unmap fail @@@@@@@@@@\r\n");
}
}
pVirAddr = HI_NULL;
}
比如要复制,写入大量视频数据,只需传入首地址,可以使用memset完成数据的写入,
如下面的这段代码,for循环方式写入,将严重拖慢性能,在高速数据访问的系统上,这将是致命的,所以c语言的好处,可以通过指针的 方式,大量完成快速访问。
for (i = 0, u = 0; i <600; i++, u++)
{
for (j = 0, v = 0; j <800; j++, v++)
{
*(pVirAddr2 + u * dstframe->u32Stride[0] + v ) = *(pVirAddr1 + u * srcframe->u32Stride[0] + v );
//*(pVirAddr2 + u * dstframe->u32Stride[0] + v ) = 255;
}
}
for循环本身相当于延时函数,重复性的代码,将是致命的
下面是使用memcpy的方式,来完成一帧数据的复制,写入。将从一个buf,大量拷贝数据
for( int i = 0; i < pVBuf->u32Height; i++ )
{
memcpy( (SX_U8 *)buf + i*pVBuf->u32Width, pVBufVirt_Y + i*pVBuf->u32Stride[0], pVBuf->u32Width);
}
应该可以改进,去掉for循环
memcpy( (SX_U8 )buf + ipVBuf->u32Width, pVBufVirt_Y , pVBuf->u32Width * pVBuf->u32Height);