У меня есть два процесса, производитель и потребитель.IPC выполняется с помощью OpenFileMapping / MapViewOfFile на Win32.
Производитель получает видео из другого источника, которое затем передает потребителю, и синхронизация выполняется через два события.
Для производителя:
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
Без всего этого видео в среднем составляет 5 кадров в секунду.Если я добавлю события с обеих сторон, но без CopyMemory, он все равно будет на скорости 5 кадров в секунду, хотя и чуть медленнее.Когда я добавляю операцию 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
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);
}
*1024* О потребителе:
while(WAIT_OBJECT_0 == WaitForSingleObject(dataProducedEvent, INFINITE))
{
SetEvent(dataConsumedEvent);
}
Что ж, похоже, что копирование из буфера DirectShow в общую память былоузкое место в конце концов.Я попытался использовать именованный канал для передачи данных и угадать, что - производительность восстановлена.
Кто-нибудь знает какие-либо причины, по которым это может быть?
Комудобавьте детали, которые я не считал уместными ранее: производитель вводится и подключается к графу DirectShow для получения фреймов.