Revert "fluency delay based on involved workers counter"

This reverts commit 9f16de13fe.
This commit is contained in:
Devaev Maxim
2019-06-02 21:06:30 +03:00
parent 9f16de13fe
commit 9355055a7f

View File

@@ -75,8 +75,6 @@ struct _worker_t {
};
struct _workers_pool_t {
atomic_bool workers_stop;
unsigned n_workers;
struct _worker_t *workers;
struct _worker_t *oldest_worker;
@@ -86,11 +84,9 @@ struct _workers_pool_t {
unsigned free_workers;
pthread_cond_t free_workers_cond;
long double desired_frames_interval;
atomic_bool workers_stop;
unsigned involved_workers;
unsigned involved_workers_max_number;
long long involved_workers_second;
long double desired_frames_interval;
};
@@ -361,20 +357,18 @@ static struct _workers_pool_t *_workers_pool_init(struct stream_t *stream) {
A_CALLOC(pool, 1);
atomic_init(&pool->workers_stop, false);
pool->n_workers = stream->dev->run->n_workers;
A_CALLOC(pool->workers, pool->n_workers);
A_MUTEX_INIT(&pool->free_workers_mutex);
A_COND_INIT(&pool->free_workers_cond);
atomic_init(&pool->workers_stop, false);
if (stream->dev->desired_fps > 0) {
pool->desired_frames_interval = (long double)1 / stream->dev->desired_fps;
}
pool->involved_workers = 1;
for (unsigned number = 0; number < pool->n_workers; ++number) {
# define WORKER(_next) pool->workers[number]._next
@@ -524,8 +518,6 @@ static struct _worker_t *_workers_pool_wait(struct _workers_pool_t *pool) {
}
static void _workers_pool_assign(struct _workers_pool_t *pool, struct _worker_t *ready_worker, unsigned buf_index) {
long long now_second = floor_ms(get_now_monotonic());
if (pool->oldest_worker == NULL) {
pool->oldest_worker = ready_worker;
pool->latest_worker = pool->oldest_worker;
@@ -552,21 +544,6 @@ static void _workers_pool_assign(struct _workers_pool_t *pool, struct _worker_t
pool->free_workers -= 1;
A_MUTEX_UNLOCK(&pool->free_workers_mutex);
// involved_workers - это количество задействованных воркеров. Оно может быть меньше n_workers,
// если требуемый fps может быть обеспечен таковым числом. Например, на новом Core i7 с четырьмя
// ядрами, это число будет равняться двум, поскольку два воркера вполне успевают обрабатывать
// 30fps со встроенной камеры. Это числоиспользуется для рассчета задержки межву воркерами
// в функции _workers_pool_get_fluency_delay(). Поскольку алгоритм распределения воркеров работет
// так, что всегда ищет самый первый незанятый форвер по номеру, можно считать, что максимальное
// количество занятых воркеров равно максимальному задействованному номеру.
if (now_second != pool->involved_workers_second) {
pool->involved_workers = pool->involved_workers_max_number + 1;
pool->involved_workers_max_number = 0;
pool->involved_workers_second = now_second;
LOG_PERF("Involved workers = %u", pool->involved_workers);
}
pool->involved_workers_max_number = max_u(pool->involved_workers_max_number, ready_worker->number);
LOG_DEBUG("Assigned new frame in buffer %u to worker %u", buf_index, ready_worker->number);
}
@@ -588,9 +565,9 @@ static long double _workers_pool_get_fluency_delay(struct _workers_pool_t *pool)
# undef WORKER
}
avg_comp_time = sum_comp_time / pool->involved_workers; // Среднее время работы воркеров
avg_comp_time = sum_comp_time / pool->n_workers; // Среднее время работы воркеров
min_delay = avg_comp_time / pool->involved_workers; // Среднее время работы размазывается на N воркеров
min_delay = avg_comp_time / pool->n_workers; // Среднее время работы размазывается на N воркеров
if (pool->desired_frames_interval > 0 && min_delay > 0) {
// Искусственное время задержки на основе желаемого FPS, если включен --desired-fps