Фон
В настоящее время я работаю над небольшим приложением, которое захватывает потоки карт RGB и глубины с устройства Microsoft Kinect и сохраняет их на диске для последующего анализа.Когда я запускаю программу, она выводит каждый кадр на диск как отдельный образ.
Частота кадров Kinect составляет 30 кадров в секунду, но есть два источника, поэтому сделайте это (приблизительно) 60 кадров в секунду.Если я наивно пытаюсь просто сохранить каждый кадр, когда он прибудет, я получу пропущенные кадры, как демонстрирует связанное приложение freenect / record.c .
Я переписал приложение, чтобы использовать один потокон берет кадры с устройства и помещает их в конец списка с двумя окончаниями (std::deque
).Затем есть два потока, каждый из которых выталкивает кадры из передней части списка с двойным окончанием и сохраняет кадры на диск.Когда запись выключена, в списке остается потенциально большое количество кадров, которые еще нужно записать, поэтому перед выходом мы даем двум потокам сохранения выполнить свою работу до конца.
Теперь фактическийпроблема
Хотя проблема пропущенных кадров решена, запись в файловую систему все еще довольно медленная.Есть ли хороший способ ускорить создание файла на диске?В настоящее время функция dump_frame
выглядит следующим образом:
static void
dump_frame(struct frame* frame)
{
FILE* fp;
char filename[512]; /* plenty of space! */
sprintf(filename, "d-%f-%u.pgm", get_time, frame->timestamp);
fp = fopen(filename, "w");
fprintf(fp, "P5 %d %d 65535\n", frame->width, frame->height);
fwrite(frame->data, frame->size, 1, fp);
fclose(fp);
}
Я использую Fedora 14 x64, поэтому решение должно касаться только Linux как операционной системы.