【发布时间】:2010-08-24 13:32:27
【问题描述】:
我有两个进程,一个生产者和一个消费者。 IPC 在 Win32 上通过 OpenFileMapping/MapViewOfFile 完成。
生产者从另一个来源接收视频,然后将其传递给消费者,并通过两个事件完成同步。
对于制作人:
Receive frame
Copy to shared memory using CopyMemory
Trigger DataProduced event
Wait for DataConsumed event
为了消费者
Indefinitely wait for DataProducedEvent
Copy frame to own memory and send for processing
Signal DataConsumed event
没有这些,视频平均为 5fps。 如果我在两边都添加了事件,但没有 CopyMemory,它仍然在 5fps 左右,虽然有点慢。 当我添加 CopyMemory 操作时,它下降到 2.5-2.8fps。 Memcpy 甚至更慢。
我很难相信一个简单的内存复制会导致这种减速。 有什么补救办法吗?
这是我创建共享内存的代码:
HANDLE fileMap = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, fileMapSize, L"foomap");
void* mapView = MapViewOfFile(fileMap, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, fileMapSize);
大小为 1024 * 1024 * 3
编辑 - 添加实际代码:
关于制作人:
void OnFrameReceived(...)
{
// get buffer
BYTE *buffer = 0;
...
// copy data to shared memory
CopyMemory(((BYTE*)mapView) + 1, buffer, length);
// signal data event
SetEvent(dataProducedEvent);
// wait for it to be signaled back!
WaitForSingleObject(dataConsumedEvent, INFINITE);
}
关于消费者:
while(WAIT_OBJECT_0 == WaitForSingleObject(dataProducedEvent, INFINITE))
{
SetEvent(dataConsumedEvent);
}
好吧,从 DirectShow 缓冲区复制到共享内存似乎毕竟是瓶颈。我尝试使用命名管道来传输数据并猜测是什么 - 性能恢复了。
有人知道这可能是什么原因吗?
添加一个我之前认为不相关的细节:生产者被注入并连接到 DirectShow 图以检索帧。
【问题讨论】:
-
无法调试伪代码。发布您的事件信号/等待代码。
标签: c windows winapi ipc shared-memory