本文共 2594 字,大约阅读时间需要 8 分钟。
在设计播放器1.0时,曾使用vtune和VS自带的性能分析工具测试,对于播放器这样的软件其核心流程分为收流&拼帧、解码、渲染三大块,其中收流&拼帧在大并发模式下不是性能瓶颈。渲染模块使用D3D渲染,渲染操作本身仅占用3%左右的CPU时间。而解码和拷贝操作是非常耗费CPU的。对于ffmpeg解码优化,本文不做赘述,后续详细展开。此处仅讨论内存拷贝优化方案
2、如果是基于消息驱动机制实现的播放器,解码模块与渲染模块是消息驱动,相互间的交互完全通过发消息,取消息队列数据完成。未采用内存池方法,而是每次解码时申请内存,渲染模块消费后释放。
几大优化点:
1)解码前可以new出内存=解码对象Length+YUV占用数据空间+ffmepg解码所需的padding空间。一次申请这样一块连续内存,配合下面详细流程中偏移到YUV地址,将Y\U\V三个picth指针地址记录后交由ffmpeg解码,解码后将解码参数赋值到解码对象中,可以使用 new(pBuf)CVideoFrame()方式转换为CVideoFrame对象指针后赋值。这样改进后解码到最终渲染需new一次内存,拷贝一次(申请的内存拷贝到D3D离屏表面)
2)VLC中还做了优化,D3D离屏表面的内存由于内存池第一个,这样使用这块内存的时候可以省掉一次拷贝。(个人觉得没必要,增加了代码复杂度,且优化效果不明显)
1 modules\codec\avcodec\video.c InitVideoDec get_buffer2 = lavc_GetFrame;
2 modules\codec\avcodec\video.c lavc_GetFrame 3 modules\codec\avcodec\video.c lavc_dr_GetFrame 4 modules\codec\avcodec\video.c ffmpeg_NewPictBuf 5 src\input\decoder.c decoder_NewPicture 6 src\input\decoder.c vout_new_buffer 7 if (p_owner->p_vout == NULL) goto 8 else goto 13 8 src\input\resource.c if (p_owner->p_vout == NULL) input_resource_RequestVout 9 src\input\resource.c RequestVout 10 src\video_output\video_output.c VoutCreate 11 src\video_output\video_output.c vlc_clone(&vout->p->thread, Thread, vout, VLC_THREAD_PRIORITY_OUTPUT) 创建线程 goto 15 12 src\video_output\video_output.c vout_control_WaitEmpty(&vout->p->control); 等待线程创建picture_pool完毕 goto 13 13 src\video_output\video_output.c vout_GetPicture 14 src\misc\picture_pool.c picture_pool_Get 从picture_pool取出一帧pciture_t 15 src\video_output\video_output.c Thread 16 src\video_output\video_output.c ThreadControl 17 src\video_output\video_output.c ThreadStart 18 src\video_output\vout_wrapper.c vout_OpenWrapper goto 24 19 src\video_output\vout_wrapper.c vout_InitWrapper 20 src\misc\picture_pool.c picture_pool_NewFromFormat 21 src\misc\picture_pool.c picture_pool_New 创建picturepool 22 src\misc\picture.c 33次picture_NewFromFormat 23 src\misc\picture.c picture_NewFromResource return 11 to 12 24 src\video_output\display.c vout_NewDisplay 25 src\video_output\display.c DisplayNew 26 src\video_output\display.c vout_display_New 27 src\modules\modules.c module_need 28 src\modules\modules.c vlc_module_load 29 modules\video_output\msw\direct3d.c Open 30 modules\video_output\msw\direct3d.c Direct3DOpen 31 modules\video_output\msw\direct3d.c Direct3DCreateResources 32 modules\video_output\msw\direct3d.c Direct3DCreatePool 33 src\misc\picture.c picture_NewFromResource return 18 to 19