unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Yiming Chen <me@yiming.dev>
To: Alan Third <alan@idiocy.org>
Cc: emacs-devel@gnu.org
Subject: Re: [NS] Emacs 28 (IOSurface) renders much slower than Emacs 27 on macOS Big Sur
Date: Tue, 01 Jun 2021 10:29:01 +0800	[thread overview]
Message-ID: <m1y2bunwr6.fsf@yiming.dev> (raw)
In-Reply-To: <YI8stB7HSyUCCzPU@idiocy.org>

Hi Alan,

Thanks for your reply and sorry for my late response.

I've been using 
https://github.com/emacs-mirror/emacs/commit/6f1e1ba633 for a few 
days,
and switched to 
https://github.com/emacs-mirror/emacs/commit/784ec4b752 today.

I feel the drawing performance improves a lot in 
scratch/ns/surface-stuff branch,
and I can finally see the improvements brought by native-compile.
(since drawing is no longer a bottle-neck, maybe?)

Thanks a lot for your work!

Best,
Yiming


Alan Third <alan@idiocy.org> writes:

> On Sun, May 02, 2021 at 09:40:03PM +0800, Yiming Chen wrote:
>> Hi there!
>> I know that we've switched to a IOSurface based rendering for 
>> nsterm in
>> master branch.
>> Now master renders more precisely than emacs-27 (i.e. less 
>> flickers or
>> blank screens.)
>> But I feel that its rendering performance is much worse due to 
>> the new
>> buffering mechanism backed by IOSurface.
>
> Yup. That's the trade-off.
>
>> I think this poor rendering performance obscures the 
>> improvements
>> brought by native-compile.
>> So I want to fix this performance issue and make Emacs runs on 
>> macOS as
>> fast as on Linux.
>
> I've spent over a year on-and-off on this. Good luck.
>
>> 1. Try to restore the nsterm behavior from Emacs27 (which is 
>> much
>>    simpler than master IMHO), and start again from there
>>
>>    I've reverted the code and made it compile (see
>>    <https://github.com/emacs-mirror/emacs/compare/master...dsdshcym:revert-to-emacs-27-nsterm>)
>>    But Emacs failed to start and raised an error `Font ‘Menlo’ 
>>    is not
>>    defined'
>
> That error must be something unrelated, as the drawing buffer 
> changes
> didn't touch the font code... I've got no suggestions on where 
> to
> start, though. My knowledge of font handling is non-existent.
>
> Actually, a quick look shows that you've enabled the nsfont 
> backend
> which just doesn't work in macOS, so I'd bet that's something to
> investigate.
>
> I notice quite a few other problems... If I'm being honest, 
> master has
> diverged so much from emacs-27 that if I were to do this I'd 
> probably
> do it manually rather than try reverting commits.
>
> And I disagree that master is more complex than emacs-27. The 
> endless
> little work-arounds to try and get the emacs-27 rendering 
> working made
> it a much more brittle setup.
>
>> 2. Use layer-based view for rendering
>>
>>    I found that macvim also faced the similar issue when macOS 
>>    10.14
>>    came out 
>>    (<https://github.com/macvim-dev/macvim/issues/751>).
>>    They used NSImage to implement a double rendering solution
>>    (<https://github.com/macvim-dev/macvim/pull/757/files>), 
>>    which was
>>    also slower than before.
>>    Then they switched from NSImage to layer-based view in
>>    <https://github.com/macvim-dev/macvim/commit/dba6293677e0633917e3054cfddec1293e5ab3fb>.
>>    So I wonder if we can do the same.
>>
>> 3. Switch to CALayer (Core Animation) to use GPU (Metal) 
>> rendering for
>>    even better performance than before
>>
>>    If 2 (layer-based view) is possible, then I hope we can 
>>    leverage
>>    CALayer to make nsterm renders even faster.
>
> So... yes. The IOSurface system is already using layer-based 
> drawing.
> Have a look at updateLayer, for example.
>
> I'm not sure that CALayer really gives you anything in terms of
> performance for this sort of thing. CoreAnimation is all about 
> moving
> different layers about efficiently, afaict, which isn't 
> something we
> need to do in Emacs.
>
> And bear in mind that in order to send an image to the Metal 
> renderer
> you still need to transfer it to the GPU, and Apple recommend 
> using
> IOSurface as it's the most efficient way to do that.
>
> AND Yamamoto Mitsuharu disabled Metal rendering in the Mac port 
> as he
> found the simple IOSurface based layer backing was faster.
>
> AND the Chromium developers decided to go with the simple 
> IOSurface
> based layer backing for performance reasons too.
>
> One place that a big improvement could be found is in disabling 
> double
> buffering and only drawing to one IOSurface, as you don't need 
> to copy
> the contents of the different IOSurfaces to each other. But I 
> found
> that produced unacceptable tearing effects.
>
> But all that said, it could be that copying viewWillDraw from 
> master
> to emacs-27 could solve some of the flickering. In my 
> experimentation
> I don't believe it does, but I've never been very good at 
> inducing the
> "flickering".



  reply	other threads:[~2021-06-01  2:29 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-02 13:40 [NS] Emacs 28 (IOSurface) renders much slower than Emacs 27 on macOS Big Sur Yiming Chen
2021-05-02 22:50 ` Alan Third
2021-06-01  2:29   ` Yiming Chen [this message]
2021-06-03 21:41     ` Alan Third
2021-06-04 12:30       ` Yiming Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m1y2bunwr6.fsf@yiming.dev \
    --to=me@yiming.dev \
    --cc=alan@idiocy.org \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).