AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 526596
Accepted
sourcejedi
sourcejedi
Asked: 2019-06-25 03:08:52 +0800 CST2019-06-25 03:08:52 +0800 CST 2019-06-25 03:08:52 +0800 CST

Às vezes, a GUI responde lentamente - ou não responde - ou parece travar - mas o cursor ainda responde rapidamente. Como funciona o ponteiro do mouse?

  • 772

Como o cursor do mouse é implementado no sistema X.org X Windows? Especificamente, como devemos entender esses casos de erro:

1) Lembro-me às vezes de ver a GUI inteira ficar lenta e gaguejar ou parar. Mas o cursor do mouse ainda respondeu muito rapidamente. Por exemplo, isso pode acontecer se você usar muita memória e iniciar o "thrashing". (O sistema está continuamente trocando para o disco e voltando).

2) Outras vezes, os drivers gráficos do Linux costumavam travar. A tela pode estar congelada, corrompida ou algo intermediário. Mas às vezes o cursor do mouse ainda respondia sem problemas, em cima da tela congelada ou corrompida.

Também há dicas de alguns dos problemas (e soluções alternativas) que podem ocorrer com a corrupção do cursor do mouse:

i) Por que entrar no modo de texto e depois voltar ao modo gráfico corrige o desaparecimento do mouse?
ii) Gráficos escurecem, mas cursor do mouse não escurece

xorg x11
  • 1 1 respostas
  • 202 Views

1 respostas

  • Voted
  1. Best Answer
    sourcejedi
    2019-06-25T03:08:52+08:002019-06-25T03:08:52+08:00

    Há pelo menos dois detalhes separados aqui:

    1. Cursor de hardware
    2. As atualizações do cursor são deliberadamente priorizadas

    1. Cursor de hardware

    O primeiro detalhe é mais conhecido. Você pode encontrá-lo mencionado na documentação: a HWCursoropção no Xorg.

    Seus gráficos provavelmente usam um cursor de hardware. À medida que o hardware varre os pixels para a tela, ele sobrepõe o cursor do mouse sobre o framebuffer principal.

    • Um bug no driver gráfico pode configurar incorretamente o framebuffer, sem quebrar o cursor do hardware.
    • Ou um cursor de hardware mal configurado pode parecer corrompido. Mas você ainda pode ver o cursor corrompido se mover e responder, enquanto o restante da tela parece quebrado.
    • Ou o cursor pode ser configurado incorretamente enquanto o framebuffer está OK. Como no caso do " desaparecimento do mouse ".

    1.1 Cursor de software

    Observe que, embora os cursores de hardware sejam muito úteis, também existem técnicas para fazer com que os cursores de software funcionem melhor.

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

    Se for feito em software, o cursor deve ser armazenado em buffer. Toda vez que ele se move, restauramos a imagem anterior, salvamos a janela na posição de destino e renderizamos o cursor no fluxo.

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

    2. As atualizações do cursor são deliberadamente priorizadas

    Para ser justo, o cursor é relativamente simples. Além disso, está em uso constante. Isso significa que é improvável que a memória específica do cursor seja trocada quando você começa a ficar sem memória. Mas há também outro detalhe:

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

    Anteriormente, havia duas opções de como um driver de entrada passaria eventos para o servidor X: polling ou de dentro do manipulador de sinal. O polling simplesmente adiciona os descritores de arquivo de todos os dispositivos de entrada a um loop select(2) que é processado no mainloop do servidor. A desvantagem aqui é que, se o servidor estiver ocupado renderizando algo, sua entrada será atrasada até que a renderização seja concluída. Historicamente, o polling era usado principalmente pelo driver do teclado porque não importa muito quando as teclas são atrasadas. Tanto porque você precisa que o cliente os renderize de qualquer maneira (o que não pode quando está ocupado) e possivelmente também porque estamos tão acostumados a atrasos de digitação.

    A abordagem do manipulador de sinal contornou os atrasos instalando um manipulador SIGIO para cada dispositivo de entrada fd e chamando-o quando ocorresse qualquer entrada. Isso interrompe efetivamente o processo até que o manipulador de sinal seja concluído, independentemente do que o servidor está ocupado no momento. Uma ótima solução para fornecer movimento visível imediato do cursor (portanto, é usado por evdev, synaptics, wacom e a maioria dos drivers legados agora aposentados)

    [...]

    Os drivers enviam eventos para a fila durante o manipulador de sinais, no loop principal o servidor os lê e os processa. Em um servidor ocupado, isso pode levar vários segundos após o movimento do ponteiro ter sido executado na tela, mas, ei, ele ainda parece responsivo.

    [...]

    Nós ainda estávamos "felizes" com isso até que o libinput apareceu. libinput é uma pilha de entrada completa e esperar que funcione dentro de um manipulador de sinal é algo entre otimista, masoquista e sádico. O driver xf86-input-libinput não usa o manipulador de sinal e o efeito colateral disso é que um desktop com libinput não parecia tão responsivo quando o servidor estava ocupado renderizando.

    Keith Packard interveio e mudou o servidor do manipulador de sinal para o uso de threads de entrada. Ou mais especificamente: um thread de entrada no topo do thread principal. Esse thread controla todos os descritores de arquivo do dispositivo de entrada e lê continuamente os eventos deles. Caso contrário, ele fornece a mesma funcionalidade que o manipulador de sinais fazia antes: movimento de ponteiro visível e envio de eventos na fila de eventos para o thread principal processá-los posteriormente. Mas é claro que, uma vez que você muda para tópicos, os problemas têm 2 agora. [...] algumas condições de corrida interessantes continuaram acontecendo. Mas a partir de hoje, achamos que a maioria deles está resolvida.

    • 2

relate perguntas

  • erro de falta de dois pontos xrdb

  • Tornar as coisas maiores sem alterar a resolução? [AMIGO]

  • Como desativar a aceleração de hardware no Linux?

  • O encaminhamento SSH X11 funciona apenas ao usar

  • Qual é a diferença entre as regras base e evdev xkb?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve