Мы пытаемся разработать приложение в реальном времени. В этой программе 4 камеры отправляют 100 раз в секунду массив изображений в метод. В этом методе я должен сделать копию каждого массива. (Используется для ImageProcessing в другом потоке).
Я хотел бы сохранить последние 100 изображений каждой камеры в списке.
Проблема заключается в следующем: как превалировать такую память в списке (новые в конструкторе?).
Я хотел бы использовать что-то вроде ringbuffer с фиксированным размером, выделенным массивом memories и fifo main.
Любая идея как?
Edit1: Пример псевдокода:
// called from writer thread
void receiveImage(const char *data, int length)
{
Image *image = images.nextStorage();
std::copy(data, data + length, image->data);
}
// prealloc
void preallocImages()
{
for (int i = 0; i < 100; i++)
images.preAlloc(new Image(400, 400));
}
// consumer thread
void imageProcessing()
{
Image image = image.WaitAndGetImage();
// ... todo
}
Предположим, что вы создаете класс Image
для хранения данных для изображения, имея буфер буфера, который имеет значение:
std::vector<Image> images(100);
int next = 0;
...
while (whatever)
{
images[next++] = get_image();
next %= images.size();
}
Вы говорите о предопределении памяти: каждый конструктор Image
может владеть задачей предопределения памяти для собственного изображения. Если бы вы могли сделать это с помощью new
или если у вас есть изображения с фиксированным размером, которые не особенно велики, вы можете попробовать массив с пропорциональным размером в классе Image
... таким образом, все данные изображения будут храниться в памяти в памяти - это может быть немного быстрее, чтобы итерации изображений "в порядке". Обратите внимание, что просто выделение виртуальных адресов еще не означает, что имеется физическая резервная память, и этот материал по-прежнему может быть заменен на виртуальную память. Если у вас есть проблемы с доступом к памяти, вы можете подумать о сканировании по памяти для изображения, которое вы ожидаете использовать незадолго до его использования, или с помощью функций ОС, чтобы сообщить ОС о ваших предполагаемых шаблонах использования памяти. Возможно также получить что-то работающее и профилировать его первым ;-).
Для обработки FIFO просто добавьте еще одну переменную, начинающуюся с 0, если она != next
тогда вы можете "обрабатывать" изображение по этому индексу в векторе, а затем увеличивать переменную до тех пор, пока она не настигется next
.