2012-02-09 2 views
1

필터의 바이트 버퍼를 C# 프로그램에서 제공된 버퍼에 복사하면 버퍼에는 현재 프레임의 비트 맵이 포함되어 있으므로 크기에 따라 다릅니다 비디오 너비 및 높이.C++에서 메모리 중소 청크를 복사하는 가장 빠른 방법

작은 비디오는 비디오 프레임을 매우 빠르게 검색하지만, 큰 비디오는 시간이 많이 걸립니다. 나는 내가 생각하기에 가장 간단한 방법을하고있다. (이것이 내가 옳다고 생각하는 것이 아니기 때문에 내가 묻는 것이다.)

이것이 메모리를 복사하는 가장 빠른 방법인지 알려주시겠습니까? 감사합니다

C++ 코드 :

STDMETHODIMP CSampleGrabber::GetBuffer(byte* pVideoBuffer) 
{  
    int p=0; 

    while (p< nBufSize) { 
     pVideoBuffer[p]=pBufferData[p]; 
     p++; 
    } 
} 
+1

사용 방어 적이기 또는 표준 : : 사본. – ronag

+0

@ronag이 답변을해야합니다 :) – Matten

+3

당신은 많이 그 시간을 만나지 않을거야, 당신이 어떻게 _eliminate_ 사본을 알아낼 필요가 있다고 생각. –

답변

2

당신은 왜 안 std::copy를 사용하여 C++를 사용하고 있기 때문에?

std::copy(pBufferData, pBufferData + nBufSize, pVideoBuffer); 

복사 memcopy 또는 memmove 어떤 차례로 빠른 컴퓨터 코드 명령을 사용합니다 사용해야합니다.

4

표준 라이브러리에서 사용 std::copy, 또는 당신이 memcpy을 사용할 수 있습니다, 그러나 std::copy 최대한 빨리 memcpy로 될 것입니다. std::copy 또는 memcpy를 사용

std::copy(pVideoBuffer, pVideoBuffer+nBufSize, pBufferData); 
1

그들이 할 수있는 빠른 될 것입니다.

비디오 프레임을 처리하려면 가능한 복사 및 메모리 할당을 피하십시오. 이를 위해 다음과 같은 접근 방식을 취할 것입니다.

  1. 비디오 처리 파이프 라인의 깊이와 동일한 비디오 프레임 풀을 할당하십시오.
  2. SampleGrabber 콜백에서 ONCE을 복사하고 더 이상의 복사본을 피하십시오.
  3. 비디오 프레임 처리를 별도의 스레드에 배치하여 성능을 향상 시키십시오.

어떤 종류의 비디오 디코딩을 수행하는 경우 매우 높은 프레임 속도로 실행하거나 메모리가 제한된 시스템에서 매우 큰 비디오 (2K 또는 4K)를 처리하지 않는 한 메모리 대역폭이 중요한 문제가되어서는 안됩니다 .

병렬화 된 메모리 복사본이 정말로 필요한 경우 Intel의 Thread Building Blocks을 사용하여 조사하여 병렬 처리 된 작업을 만들어 블록 단위로 비디오 프레임을 복사 할 수 있습니다. 하지만 비디오가 거대하지 않은 한 직선적 인 memcpy 이상의 성능 향상은 없을 수도 있습니다.

0

C 옵션 : 방어 적이기/memmove를

는 "방어 적이기는 memmove를보다 더 효율적입니다." 일반적으로 USEM은 반드시해야만하는 경우에만 memmove하십시오. 소스 및 대상 영역이 오버 랩핑 될 가능성이 매우 낮은 경우이를 사용하십시오.

사용 참조 : https://www.youtube.com/watch?v=Yr1YnOVG-4g 박사 제리 가인, (스탠포드 소개 시스템 강의 - 7) 시간 : 표준 라이브러리에서 36:00

관련 문제