X11 в C ++ - XGetWindowAttributes () слишком медленный - PullRequest
1 голос
/ 02 марта 2020

Проблема:

Я создал небольшую программу, отображающую графику c, используя X11 / Xlib для Linux системы .

Он должен знать размер окна, поэтому я сделал это с XGetWindowAttributes()
, но после теста som я обнаружил, что оно немного слишком медленно на мой вкус (см. Тест) , Это не большое замедление , но программа без него намного быстрее, чем одна функция!

Кроме того, в некоторых конфигурациях кода медлительность вызывает случайное мерцание.

Что бы я хотел сделать:

Я был бы очень рад, если бы был способ узнать размер окна и использовать меньше процессорного времени .

Если это невозможно, не стесняйтесь сказать, в любом случае, это ответит на вопрос!

Контрольный показатель:

Это сделано путем добавления небольшого хронометра в программе он находит время, потраченное на некоторые части программы. Каждый цикл составляет в общей сложности 60 программных циклов, что приводит к ~ одной секунде.

Вот очень упрощенный код теста:

#include ManyLibraries

main( ) {

    uint64_t Time1, Time2, Time3; // Vars for time measure

    uint64_t Delay1, Delay2; // Vars for time storing

    uint8_t Cycles;

    bool XGWAEnable = true; // In truth, the user can choose

    for(Cycles = 0; Cycles < 60; Cycles ++) {

        Time1 = GetCurrentMilliTime();

        if(XGWAEnable) {
            UpdateWindowSize(); // Function that use XGWA to get window size
        }

        Time2 = GetCurrentMilliTime();

        ObjectSimulation(); // Moves the objects (few squares)
        Render();           // Draws the squares

        Time3 = GetCurrentMilliTime();

        Delay1 = Time2 - Time1;
        Delay2 = Time3 - Time2;

        WaitFrame(); // Waits for a screen refresh
    }

    std::cout << Delay1 << ' ' << Delay2 << ' ' << Delay1 + Delay2;

    return 0;
}

Бенчмарк протестирован на моем ноутбуке в Ubuntu 18.04.

        | XGWA enabled? | Cycles    | XGWA  | Code rest | Total code    |
Run 1   | true          | 60        | 32 ms | 8 ms      | 40 ms         |
Run 2   | false         | 60        | 0 ms  | 6 ms      | 6 ms          |
Run 3   | true          | 60        | 31 ms | 7 ms      | 38 ms         |
Run 4   | false         | 60        | 0 ms  | 7 ms      | 7 ms          |
Run 5   | true          | 60        | 32 ms | 8 ms      | 40 ms         |
Run 6   | false         | 60        | 0 ms  | 7 ms      | 7 ms          |
Run 7   | true          | 60        | 30 ms | 7 ms      | 37 ms         |
Run 8   | false         | 60        | 0 ms  | 8 ms      | 8 ms          |

Моя программа не так точна, но я думаю, вы поняли.
И, кстати, XGWA означает XGetWindowAttributes()

...