Уэстон Уэйленд - улучшение скриншота (блоки wl_display_roundtrip более секунды) - PullRequest
2 голосов
/ 28 октября 2019

Я использую weston на устройстве armv7. Я использую модуль скриншотов Weston, чтобы время от времени делать скриншоты на нем, но я заметил, что при захвате скриншота все отображаемое изображение замораживается более чем на секунду, что вызывает уродливое дрожание на экране. screen.

Я проверил код screenshot.c в исходном коде weston и скомпилировал его с некоторыми простыми измерениями производительности (время сейчас - время после) и обнаружил, что только одно место во всем коде вызывает это дрожание: цикл while, ожидающий wl_display_roundtrip:

wl_list_for_each(output, &output_list, link) {
        output->buffer = create_shm_buffer(output->width, output->height, &output->data);
        weston_screenshooter_shoot(screenshooter,
                       output->output,
                       output->buffer);
        buffer_copy_done = 0;
        ms2 = ctimestamp();
        while (!buffer_copy_done)
            wl_display_roundtrip(display);
        fprintf(stderr, "while roundtrip took %llu ms\n", ctimestamp()-ms2);
    }
    fprintf(stderr, "foreach took %llu ms\n", ctimestamp()-oldMS);

Для выполнения каждого блока потребовалось 901 мс, цикл while - 896 мс, поэтому большая часть времени процессора затрачивается на ожидание обхода.

Можно ли как-нибудь оптимизировать это, чтобы избавиться от дрожания на экране? Безопасен ли вызов wl_display_roundtrip в другом потоке? Или есть какой-нибудь асинхронный способ сделать это?

...