emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Scrolling commands and skipping redisplay, was: Re: emacs rendering


From: Dmitry Gutov
Subject: Re: Scrolling commands and skipping redisplay, was: Re: emacs rendering comparisson between emacs23 and emacs26.3
Date: Tue, 21 Apr 2020 04:27:19 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.4.1

On 20.04.2020 18:16, Eli Zaretskii wrote:

As we've determined, certain commands force redisplay to be performed
anyway (though partially).

That's not redisplay, that's JIT fontification that happens as side
effect of redisplay.  It can _also_ happen as side effect of other
commands.  But that's not redisplay.

A certain amount of work that's also part of redisplay. IIRC posn-at-point also "simulates redisplay". Not sure if scrolling commands use it, but others do.

I'm saying this because my current impression is still that redisplay is skipped sometimes (when Emacs is busy) for performance reasons. And the cases above are when they might apply to a lesser extent.

If performing it in full in those cases will take just a little more CPU
time, the result might be Emacs that looks more responsive under load,
and just as fast.

If you can find a way of reusing that information afterwards (more
than redisplay itself already does), yes.  But AFAIU you are talking
about a thorough redesign of the Emacs display engine.

Hopefully not.

It already
attempts to reuse every piece of display that can be kept.  For
example, if you type C-n on the bottom-most screen line, and you have
scroll-conservatively set, the display engine will redraw exactly one
screen line, and all the rest will be scrolled (via a direct Xlib
call) on the glass, without regenerating the glyphs.

That's an interesting tidbit. But it seems to also say that redisplay for C-n is usually quite fast. And maybe we don't gain much by skipping it in that case.

It might be possible to construct some "cache key" that would allow us
to check whether the remainder of the command changed something that
would affect display. And if it didn't, use the last saved result of
move_it_*.

You will see in redisplay_window and its subroutines a lot of code
that attempts to do exactly that: figure out what has changed and what
hasn't.  You are in effect saying that this must be radically
improved, in which case I'd happily agree, but please believe me that
it is not a trivial job, certainly not if you want to stay within the
current design of the display engine.  You will probably need to
design and implement various new fields of the window and buffer
objects that will cache more data about the previous state of buffer
and display than what they already do, make sure these caches are
reset when no longer valid, then build new redisplay optimizations
based on those, find the conditions where the optimizations can and
cannot be used, etc.

So I wouldn't be correct to say that the display is only dependent on the current window configuration (shown buffers, window sizes, window scroll positions), buffer text which can be checked via buffer-modified-tick and the overlays which... might have a similar "counter" added?

But mode-lines and header-lines aren't amenable to caching, right? That complicates things.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]