때로는 GUI가 느리게 반응하거나 전혀 반응하지 않거나 충돌하는 것처럼 보이지만 커서는 계속 반응합니다. 마우스 포인터는 어떻게 작동하나요?

때로는 GUI가 느리게 반응하거나 전혀 반응하지 않거나 충돌하는 것처럼 보이지만 커서는 계속 반응합니다. 마우스 포인터는 어떻게 작동하나요?

X.org X Windows 시스템에서 마우스 커서는 어떻게 구현됩니까? 구체적으로 이러한 오류 조건을 어떻게 이해해야 합니까?

1) 때때로 전체 GUI가 느려지거나, 느려지거나, 멈추는 것을 본 기억이 납니다. 그러나 마우스 커서는 여전히 매우 빠르게 반응합니다. 예를 들어, 메모리를 너무 많이 사용하여 "쓰레기"가 시작되는 경우 이런 일이 발생할 수 있습니다. (시스템은 지속적으로 디스크로 교체되고 다시 디스크로 교체됩니다.)

2) 다른 경우에는 Linux 그래픽 드라이버가 충돌하는 경우가 많습니다. 화면이 정지되었거나 손상되었거나 그 사이에 있을 수 있습니다. 그러나 때때로 정지되거나 손상된 디스플레이에서 마우스 커서가 반응을 유지하는 경우가 있습니다.

손상된 마우스 커서로 인해 발생할 수 있는 몇 가지 문제(및 해결 방법)에 대한 팁도 있습니다.

나)텍스트 모드로 들어갔다가 그래픽 모드로 돌아가면 마우스가 사라지는 문제가 해결되는 이유는 무엇입니까?
둘)그래픽이 어두워지지만 마우스 커서가 어두워지지 않습니다.

답변1

여기에는 최소한 두 가지 세부 정보가 있습니다.

  1. 하드웨어 커서
  2. 커서 업데이트는 의도적으로 우선순위가 지정됩니다.

1. 하드웨어 커서

첫 번째 세부 사항은 더 잘 알려져 있습니다. Xorg의 옵션 문서에서 찾을 수 있습니다 HWCursor.

당신의 그래픽아마도하드웨어 커서를 사용하십시오. 하드웨어가 픽셀을 디스플레이로 스캔할 때 메인 프레임 버퍼 위에 마우스 커서를 오버레이합니다.

  • 그래픽 드라이버의 버그로 인해 하드웨어 커서가 손상되지 않고 프레임 버퍼를 잘못 구성할 수 있습니다.
  • 또는 잘못 구성된 하드웨어 커서가 손상될 수 있습니다. 그러나 디스플레이의 나머지 부분이 깨진 것처럼 보이는 동안에도 깨진 커서가 움직이고 반응하는 것을 볼 수 있습니다.
  • 또는 프레임 버퍼가 양호할 때 커서가 잘못 구성될 수 있습니다. "에서와 같이마우스가 없습니다."사례.

1.1 소프트웨어 커서

하드웨어 커서는 매우 유용하지만 소프트웨어 커서가 더 잘 작동하도록 만드는 기술이 있습니다.

https://www.x.org/wiki/Development/Documentation/InputEventProcessing/

소프트웨어에서 수행된 경우 커서는 백버퍼링되어야 합니다. 이동할 때마다 이전 이미지를 복원하고 대상 위치에 창을 저장하고 커서를 스트림에 렌더링합니다.

xorg-server-1.20.5/mi/midispcur.c- miDCSaveUnderCursor() / miDCRestoreUnderCursor()

2. 의도적으로 커서 업데이트의 우선순위를 정합니다.

공평하게 말하면 커서는 비교적 간단합니다. 게다가 꾸준히 사용되고 있습니다. 이는 메모리가 부족해지기 시작할 때 커서 관련 메모리가 교체될 가능성이 적다는 것을 의미합니다. 그러나 한 가지 더 자세한 내용이 있습니다.

https://who-t.blogspot.com/2016/09/input-threads-in-x-server.html

이전에는 입력 드라이버에 X 서버에 이벤트를 전달하는 방법에 대해 신호 처리기 내에서 이벤트를 폴링하거나 전달하는 두 가지 옵션이 있었습니다. 폴링은 단순히 모든 입력 장치의 파일 설명자를 서버의 기본 루프에서 처리되는 select(2) 루프에 추가합니다. 여기서 단점은 서버가 무언가를 렌더링하는 중이라면 렌더링이 완료될 때까지 입력이 지연된다는 것입니다. 역사적으로 폴링은 키 입력이 지연되는 시기가 중요하지 않기 때문에 키보드 드라이버에서 주로 사용되었습니다. 둘 다 클라이언트가 어쨌든 렌더링해야 하기 때문이고(바쁠 때는 렌더링할 수 없음) 아마도 우리가 입력 지연에 너무 익숙하기 때문일 것입니다.

신호 처리기 접근 방식은 각 입력 장치 fd에 대해 SIGIO 처리기를 설치하고 입력이 발생할 때 해당 처리기를 호출하여 지연을 방지합니다. 이는 서버가 현재 무엇을 하고 있는지에 관계없이 신호 처리기가 완료될 때까지 프로세스를 효과적으로 중단합니다. 좋은 해결책즉각적인 가시적 커서 움직임 제공 (그래서 evdev, synaptics, wacom 및 현재 폐기된 대부분의 레거시 드라이버에서 사용됩니다)

[...]

드라이버는 신호 처리기 동안 이벤트를 큐에 푸시하고 서버는 메인 루프에서 이벤트를 읽고 처리합니다. 사용량이 많은 서버에서는 화면에서 포인터 이동이 수행된 후 몇 초가 걸릴 수 있지만 여전히 반응하는 느낌이 듭니다.

[...]

libinput이 등장하기 전까지 우리는 여전히 "만족"했습니다. libinput은 완전한 입력 스택이며 신호 처리기에서 작동할 것으로 기대하는 것은 낙관적, 마조히스트적, 가학적인 것 사이의 어딘가에 있습니다. xf86-input-libinput 드라이버는 신호 처리기를 사용하지 않습니다. 그 부작용은 서버가 렌더링 중일 때 libinput이 있는 데스크탑이 응답하지 않는 느낌을 받는다는 것입니다.

Keith Packard가 개입하여 서버를 신호 처리기에서 입력 스레드 사용으로 전환했습니다. 더 구체적으로 말하자면, 메인 스레드 위에 입력 스레드가 있는 것입니다. 이 스레드는 모든 입력 장치의 파일 설명자를 제어하고 해당 이벤트를 지속적으로 읽습니다. 그렇지 않은 경우 이전에 신호 처리기가 했던 것과 동일한 기능을 제공합니다. 즉, 시각적 포인터 이동 및 이벤트 큐에 이벤트를 푸시하여 나중에 기본 스레드에서 처리할 수 있도록 합니다. 그러나 물론 스레드로 전환하면 문제가 발생합니다. [...] 몇 가지 흥미로운 경쟁 조건이 계속 발생합니다. 하지만 현재로서는 대부분의 문제가 해결되었다고 생각합니다.

관련 정보