https://www.ximea.com/support/wiki/usb3/how_to_optimize_software_performance_on_high_frame_rates
How to optimize software performance on high frame rates on USB3.0 cameras?¶
In order to receive all images in case of high frame rate and/or small height of image (ROI) is used - it is necessary to:
- increase value of XI_PRM_BUFFERS_QUEUE_SIZE
- decrease value of XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE
See xiAPI Manual for details.
Simplified implementation example¶
Example of initialization code:
#define HandleResult(res,place) if (res!=XI_OK) {printf("Error after %s (%d)\n",place,res);goto finish;} XI_RETURN stat = XI_OK; stat = xiOpenDevice(0, &xiH); HandleResult(stat,"xiOpenDevice"); // set ROI height int height=200; stat = xiSetParamInt(xiH, XI_PRM_HEIGHT, height); HandleResult(stat,"xiSetParam (height)"); int payload=0; stat = xiGetParamInt(xiH, XI_PRM_IMAGE_PAYLOAD_SIZE, &payload); HandleResult(stat,"xiGetParam (payload)"); // --------------------------------------------------- // select transport buffer size depending on payload int transport_buffer_size_default = 0; int transport_buffer_size_increment = 0; int transport_buffer_size_minimum = 0; // get default transport buffer size - that should be OK on all controllers stat = xiGetParamInt(xiH, XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE, &transport_buffer_size_default); HandleResult(stat,"xiGetParamInt (transport buffer size)"); stat = xiGetParamInt(xiH, XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE XI_PRM_INFO_INCREMENT, &transport_buffer_size_increment); HandleResult(stat,"xiGetParamInt (transport buffer size increment)"); stat = xiGetParamInt(xiH, XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE XI_PRM_INFO_MIN, &transport_buffer_size_minimum); HandleResult(stat,"xiGetParamInt (transport buffer size minimum)"); // check if payload size is less than default transport buffer size if(payload < transport_buffer_size_default + transport_buffer_size_increment) { // use optimized transport buffer size, as nearest increment to payload int transport_buffer_size = payload; if (transport_buffer_size_increment) { // round up to nearest increment int remainder = transport_buffer_size % transport_buffer_size_increment; if (remainder) transport_buffer_size += transport_buffer_size_increment - remainder; } // check the minimum if (transport_buffer_size < transport_buffer_size_minimum) transport_buffer_size = transport_buffer_size_minimum; stat = xiSetParamInt(xiH, XI_PRM_ACQ_TRANSPORT_BUFFER_SIZE, transport_buffer_size); HandleResult(stat,"xiSetParam (transport buffer size)"); } // --------------------------------------------------- // set maximum number of queue int number_of_field_buffers = 0; xiGetParamInt(xiH, XI_PRM_BUFFERS_QUEUE_SIZE XI_PRM_INFO_MAX, &number_of_field_buffers); HandleResult(stat,"xiGetParam (number_of_field_buffers maximum)"); xiSetParamInt(xiH, XI_PRM_BUFFERS_QUEUE_SIZE, number_of_field_buffers); HandleResult(stat,"xiSetParam (number_of_field_buffers)"); xiStartAcquisition(xiH); // getting images in loop