为啥从GraphicBuffer里memcpy拷贝数据效率特别低

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥从GraphicBuffer里memcpy拷贝数据效率特别低相关的知识,希望对你有一定的参考价值。

参考技术A 貌似从Graphic Buffer里直接读数据到memory里确实比较忙,具体原因有很多,感兴趣的可以参考我在stackoverflow上的这个帖子,有人进行了详细的解释。http://stackoverflow.com/questions/22383533/memcpy-from-graphic-buffer-is-slow-in-android
再来说说目前的解决方案,也是刚开始做android底层,对整个video play的机制了解的不是很透彻,参考了其他开源的播放器以后,其实是可以用硬件解码并且将解码数据放在memory里的(因为按照Android源码的播放流畅,硬件解码以后的数据是默认在Graphic Buffer中的),从memory里取数据就快很多了。
参考技术B 1. 获取GraphicBuffer指针
2. 调用lock函数来获取映射的内存指针
3. 调用memcpy来拷贝数据到自己申请的buffer
4. 处理完以后再写入映射的内存地址
5. unlock操作结束本回答被提问者和网友采纳

memcpy() memset() 内存拷贝函数 /初始化

memcpy   

memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中。

void *memcpy(void *dest, const void *src, size_t n);

参数都是指针

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

 

memcmp是比较内存区域buf1和buf2的前count个字节。该函数是按字节比较的。

当buf1<buf2时,返回值小于0

当buf1==buf2时,返回值=0

当buf1>buf2时,返回值大于0

 

 

memset

https://baike.baidu.com/item/memset/4747579?fr=aladdin

memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。

void *memset(void *s, int ch, size_t n);

函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法 [1]  。

memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度.

 

 

以上是关于为啥从GraphicBuffer里memcpy拷贝数据效率特别低的主要内容,如果未能解决你的问题,请参考以下文章

实现memcpy

memcpy() memset() 内存拷贝函数 /初始化

c语言内存拷贝 memcpy()函数

memcpy memmove 函数

C语言串拷贝(strcpy)和内存拷贝(memcpy)函数有啥不同?

strcpy&memcpy理解