bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#21028: Slow font rendering in emacs


From: Ralf Jung
Subject: bug#21028: Slow font rendering in emacs
Date: Tue, 14 Mar 2017 19:41:15 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0

Hi,

>> Here's the setup which makes things behave badly:
>>
>> (dolist (ft (fontset-list))
>>   ; Main font
>>   (set-fontset-font ft 'unicode (font-spec :name "Monospace" :size 11.0))
>>   ; Fallback font
>>   (set-fontset-font ft 'unicode (font-spec :name "DejaVu Sans Mono"
>> :size 11.0) nil 'append)
>> )
>>
>> And here's the one I use instead, which behaves much better:
>>
>> (dolist (ft (fontset-list))
>>   ; Main font
>>   (set-fontset-font ft 'unicode (font-spec :name "Monospace" :size 11.0))
>>   ; Fallback font
>>   (set-fontset-font ft nil (font-spec :name "DejaVu Sans Mono" :size 11.0))
>> )
>>
>> (For the record, my "Monospace" font is "Fira Sans Mono".)
> 
> See, this setup makes very little sense.  It sets up no less than 2
> monospaced fonts for the entire range of Unicode codepoints, when both
> of these fonts support only Latin, Greek, and Cyrillic blocks.

Well, maybe it makes little sense to you -- however, this requires
expert knowledge about unicode blocks.  I don't have that knowledge, and
I think it is a bug if configuring a straight-forward fallback chain of
fonts requires such knowledge.  *Not* knowing these details about which
font supports what, I'd say my setup makes a lot of sense.
Well, actually, the following would make even more sense:

(set-fontset-font "fontset-default" 'unicode (font-spec :name
"Monospace" :size 11.0))
(set-fontset-font "fontset-default" 'unicode (font-spec :name "DejaVu
Sans Mono" :size 11.0) nil 'append)

I think back then I didn't yet know about 'append, so I used the nil
range for the fallback font (the documentation even said something
related to fallback for the nil range) and then I had to do this for all
fontsets for it to have any effect...
Anyway, I just tried the above, and the result is that things are just
as slow as with my previous "bad" setup.  And this time, I honestly
can't think of a clearer / more sensible way to tell emacs that these
are the fonts I (mainly) want to use for unicode characters.

>  What's
> more, this is done in all the fontsets, so Emacs will waste many
> cycles on futile search through these fonts, multiple times!

So the slowdown happens even if I do this in just one fontset.
How can searching two fonts take so much time?  95% of the characters in
my document are present in Fira Sans, and only about 0.1% of the
characters (I am guessing here, I suspect actually it's even less) are
present in neither DejaVu nor Fira Sans.  So having these two fonts
first should result in very quick, successful lookups.

> Try this instead:
> 
>   (set-fontset-font "fontset-default" 'greek
>                     (font-spec :name "DejaVu Sans Mono"
>                   :size 11.0 :registry "iso10646-1") nil 'prepend)
>   (set-fontset-font "fontset-default" 'cyrillic
>                     (font-spec :name "DejaVu Sans Mono"
>                   :size 11.0 :registry "iso10646-1") nil 'prepend)
>   (set-fontset-font "fontset-default" 'latin
>                     (font-spec :name "DejaVu Sans Mono"
>                   :size 11.0 :registry "iso10646-1") nil 'prepend)
>   (set-fontset-font "fontset-default" 'greek
>                     (font-spec :name "Monospace"
>                   :size 11.0 :registry "iso10646-1") nil 'prepend)
>   (set-fontset-font "fontset-default" 'cyrillic
>                     (font-spec :name "Monospace"
>                   :size 11.0 :registry "iso10646-1") nil 'prepend)
>   (set-fontset-font "fontset-default" 'latin
>                     (font-spec :name "Monospace"
>                   :size 11.0 :registry "iso10646-1") nil 'prepend)
>   (set-fontset-font t nil (font-spec :name "Symbola"
>                                      :size 11.0 :registry "iso10646-1")
>                           nil 'append)

With this configuration, emacs picks STIX to render ∃.  It also picks
"DejaVu Math TeX Gyre" for ↦.  This breaks the monospace grid.  Both of
these characters are supported by DejaVu Sans Mono.

You say these fonts support only Latin, Cyrillic and Greek -- but for
example Fira Sans Mono supports → and … and ↑, and DejaVu Mono supports
∃ and ↦ and ▷.  Are these all in one of these ranges?

> (I'd also drop the :size part, but maybe you have a good reason for
> that.)

Well, I want to use a smaller font size than the default.  If I use the
"normal" way to do that through the "Set Default Font" UI, the fonts of
most characters changed, but when some fallback font was picked, it used
the default size again so the characters were way too big.  I fixed this
by adding the size to every single fontspec.
So, no, no good reason. I was just desperate.

> I suggest to look at fontset.el in the Emacs sources for inspiration
> on how to set up the fontset correctly.

Frankly, I do not plan to figure out which of my fonts support which
unicode block, nor do I want to spend hours manually selecting the right
font for each individual character.  I believe that this is something
the machine can figure out for me.  With more than two billion
instructions per second, it should be capable of querying two (!) fonts
for every one of the maybe 1000 characters it has to display at any
given time.

> Or ask on emacs-devel.

Well, yes, I admit I should/could have done that.  After spending
something like 2 or 3 hours on this issue, I was frustrated and didn't
find the motivation any more to describe in detail what I tried and what
went wrong.

> If the manual configuration forces Emacs to unnecessarily search fonts
> for characters that aren't there, then it could get unreasonably slow.
> We are giving the users here enough rope to hang themselves, in the
> hope that they won't try doing that too hard...

I had no intention to hang myself, but may have accidentally strangled
myself in the 25 ropes that emacs gave me to configure fonts -- where
all I wanted was for things to look just like they look in any other
editor...

Kind regards,
Ralf





reply via email to

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