[RESEND] Re: slow, sluggish drawing with pencil & calligraphy tool solved
----- Forwarded message from Mail Delivery Subsystem <MAILER-DAEMON@...62...> -----
Date: Sat, 3 Mar 2018 18:23:21 -0800 From: Mail Delivery Subsystem <MAILER-DAEMON@...62...> To: bryce@...961... Subject: Returned mail: see transcript for details
The original message was received at Fri, 2 Mar 2018 13:44:02 -0800 from static-50-53-76-183.bvtn.or.frontiernet.net [50.53.76.183]
----- The following addresses had permanent fatal errors ----- inkscape-devel@lists.sourceforge.net (reason: 550 unknown user)
----- Transcript of session follows ----- ... while talking to mx.sourceforge.net.:
DATA
<<< 550 unknown user 550 5.1.1 inkscape-devel@lists.sourceforge.net... User unknown <<< 503-All RCPT commands were rejected with this error: <<< 503-unknown user <<< 503 Valid RCPT command must precede DATA
Reporting-MTA: dns; vinyl.outflux.net Arrival-Date: Fri, 2 Mar 2018 13:44:02 -0800
Final-Recipient: RFC822; inkscape-devel@lists.sourceforge.net Action: failed Status: 5.1.1 Remote-MTA: DNS; mx.sourceforge.net Diagnostic-Code: SMTP; 550 unknown user Last-Attempt-Date: Sat, 3 Mar 2018 18:23:21 -0800
Date: Fri, 2 Mar 2018 13:43:52 -0800 From: Bryce Harrington <bryce@...961...> To: Yale Zhang <yzhang1985@...400...> Cc: Eduard Braun <eduard.braun2@...173...>, inkscape-devel@lists.sourceforge.net Subject: Re: [Inkscape-devel] slow, sluggish drawing with pencil & calligraphy tool solved
Hi Yale,
Thanks for working on this problem, it seems to be one of our top blockers for the 0.93 release at the moment, so your work is very much appreciated.
Can you update me on how things are going right now? Are there particular things you're stuck on? I probably don't know enough to offer advice myself but maybe can suggest someone that can.
If the issue looks like it can't be solved quickly, perhaps for testing purposes it might help to add one or two environment variables to turn on/off pieces of the UI or codebase that are causing problems. So if someone testing the renderer can do without the toolbar, they can disable it at runtime? Something like that?
In the coming weeks I'd like to produce a testing build of Inkscape, so if there are some (ugly) ways to enable testers to work around the performance bug that would help.
Bryce
On Fri, Feb 16, 2018 at 02:51:43AM -0800, Yale Zhang wrote:
Thanks, I couldn't find it because I was expecting the status bar to be drawn by Cairo. I tried to increase the priority of UPDATE_PRIORITY & SP_UPDATE_SELECTION_PRIORITY, but couldn't do so without causing the ruler & status bar updates to starve. I conclude that UPDATE_PRIORITY cannot have any higher priority than GDK_PRIORITY_REDRAW. Even when those priorities are the same, the status bar will always get drawn before canvas because SPDesktopWidget:: setCoordinateStatus() is called before SPCanvas::addIdle().
I've pushed my changes (I did some git resets instead of revert so it's diverged). Hopefully now, you can approve? Sorry about the back and forth over the rulers & status bar not updating. Shouldn't have been greedy about reducing latency by 2ms by setting UPDATE_PRIORITY = GDK_PRIORITY_EVENTS :)
On Thu, Feb 15, 2018 at 3:58 PM, Eduard Braun <eduard.braun2@...173...> wrote:
Am 15.02.2018 um 12:23 schrieb Yale Zhang:
I've updated my custom cross compiler to use MSYS2 packages and finally saw the lack of rule/status bar updates. Unfortunately, it had nothing to do with using MSYS2. I just didn't look hard enough earlier :( The earlier versions (including the binaries) did suffer the problem but only when dragging large rectangles. Plus I had _INKSCAPE_DISABLE_CACHE=1, making the problem less noticeable.
So now I know what's wrong. The ruler update priority is G_PRIORITY_LOW = 300, while UPDATE_PRIORITY in SPCanvas::addIdle() is GDK_PRIORITY_EVENTS = 0, so it's no mystery who loses.
Changing UPDATE_PRIORITY back to GDK_PRIORITY_REDRAW + 10 fixes the problem. But the ~10ms less latency for immediate drawing (#3) now is reduced because a ~2ms delay is added between SPCanvas::addIdle() and SPCanvas::paint().
Of course, this is perfectly usable, but I have an itch to further improve. That 2ms latency is gone if I disable the status bar, so I'd like to do the status bar updates after SPCanvas::paint().
But I can't find where the status bar is being drawn. Do you? And also, what is SP_DOCUMENT_UPDATE_PRIORITY and SP_DOCUMENT_ROUTING_PRIORITY in document.cpp? I don't know if those need to be rebalanced.
The coordinates are updated by calling "SPDesktop::set_coordinate_status" in "desktop.cpp" (which calls "SPDesktopWidget::setCoordinateStatus" in "desktop-widget.cpp").
-yale
On Wed, Feb 14, 2018 at 2:30 AM, Eduard Braun <eduard.braun2@...173...> wrote:
Am 14.02.2018 um 11:09 schrieb Yale Zhang:
Good, we're getting closer to the same page. Can you please tell me which of my commits did you include in your testing? If dragging is still lagging, it sounds like you didn't take change #2 (priorities). You complained it didn't help or made things worse, but it should be quite the opposite.
As I wrote: I checked out 0bde236 and built the resulting code. It should therefore have contained all you latest (public) changes.
Let me get the MSYS2 headers & libs and do a build to rule out any library issues.
This would certainly help... Even though you keep telling me the stock builds *should* behave differently with your changes - they don't. If you're able to test yourself we'll probably safe ourselves some back and forth as seeing is believing. ;-)
"warn me next time it's not relocatable" - I think all you have to do to relocate was regenerate immodules.cache & loaders.cache. I wonder how the release packages of Inkscape & Gimp avoid this problem.
Ah, if they contain absolute paths that might have been it. As for the release packages: they contain relative paths in imloaders.cache (MSYS2 contains a relocation patch for gdk-pixbuf2). Earlier versions (built wit devlibs) included the loaders in libgdk_pixbuf-2.0-0.dll to work around this (it's a built option)
Yes, my version should be quite fast, but it has little to do with the GDK optimizations. You should see the same benefits with vanilla GTK (GTK_CSD=1). For the optimized version, there should be no performance difference for GTK_CSD because I force the rendering code path to what GTK_CSD=0 uses, plus some optimizations.
"I'm not able to resize the Window" Sorry, I forgot to mention it has my optimized, but work in progress libgdk-3-0.dll. Please roll back to the stock version (libgdk-3-0.dll.orig). The optimized one keeps a persistent Cairo Win32 surface for window updates, but resizing isn't handled.
On Tue, Feb 13, 2018 at 6:27 PM, Eduard Braun <eduard.braun2@...173...> wrote:
I was now able to build 0bde236
- With the status bar visible I'm getting super fast redraws of the
status bar with some occasional redraws of the rulers but everything else is locked when moving a rect.
- With the status bar hidden I'm getting more redraws now and also
infrequent redraws of the whole UI, however moving the rect is still extremely sluggish.
- With the status bar and rulers hidden moving the rect has a usable
redraw speed, rest of the UI (now only values in select toolbar I guess) update infrequently.
Comparing with your build linked before (warn me next time it's not relocatable, I had to move it to C:\Users\Yale\inkscape.gmesh ;-) ) there are some grave differences:
- Redraw is in fact much faster with your version - are these the
gdk changes? Or are we really on to something fundamental? This is also true for GTK_CSD=0!
- Also the rest of the UI is updated much more frequently, even with
the status bar visible
- In your version I'm not able to resize the Window (or rather I can
but the parts that were not shown initially are not redrawn and only show some graphical garbage. Is this related to you gdk changes?
Am 12.02.2018 um 13:57 schrieb Eduard Braun:
Am 12.02.2018 um 13:12 schrieb Yale Zhang:
Eduard, please pull change #2 (fix priority inversion) before the immediate rendering changes. Without it, the lack of status bar & ruler updates are expected.
I think we're running in circles here... Most of my comments (as well as yours regarding direct drawing) referred to #3. The only issue I had with #2 was that Rulers seem still to be updated with a high priority and prevented the canvas to redraw (in stock MSYS2 builds and therefore with CSD=0).
Yes, I am using CSD=1 in my testing (for both optimized & original GTK). But CSD isn't the actual reason for performance difference. It's because of the rendering code path CSD=1 uses (draw to CPU memory buffer, then send to UpdateLayeredWindow()), vs CSD=0 (draw directly to GDI device context - surprisingly this is slower until my optimizations).
Please note that CSD=0/1 in our stock MSYS2 builds makes a *huge* difference. If that is really not the case for your custom builds we might want to start looking into that, too. Maybe we're facing at a more fundamental difference. As MSYS2 is the official way to get GTK+ for Windows nowadays such a difference might be very relevant for many projects.
Are your cross-compiled libraries using mingw-w64? Which OS are you using btw? (I'm usually testing on Windows 10 - I'd not be surprised if there's some major difference compared to e.g. Windows 7 wrt to the low level drawing functions).
I'm very interested in testing your GDK-modifications and see how they behave with the MSYS2 builds, so if you could drop a patch somewhere that would be much appreciated!
I did get an error from the CI build after the multithreaded rendering feature. It doesn't even get past CMake configure stage, so not very useful. That's because the build server doesn't have the Boost libs (which I use, not just the headers).
I think you looked at the Linux build - Windows CI is "external" via AppVeyor and has the required Boost libraries. It's just not working in your branch right now because an upstream update broke updating but I pushed a workaround for this already in the master branch [1] (that's why I suggested to rebase)
[1] https://gitlab.com/inkscape/inkscape/commit/85d7fa343f477d8f aae6cbde90ae7a243115fa37 (I messed up the rebase so it's authored by Tav, sorry for that)
On Mon, Feb 12, 2018 at 2:41 AM, Eduard Braun <eduard.braun2@...173...> wrote:
Am 12.02.2018 um 10:15 schrieb Yale Zhang:
"As noted before, when rulers are shown there still is no redraw with this change" It works for me on Windows with rulers. Could it be some out of date libraries? I'm still using a custom built cross compiler & libraries (GTK 3.22.26 & glib 2.54.2). I know you're using the MSYS 2 prebuilt libraries. I've been wanting to use those too, but how recent are they?
They are usually the latest available (think of MSYS2's MINGW-packages as arch Linux for Windows), right now gtk 3.22.26 and glib 2.54.3.
Aside from disabling CSD they are unpatched. Just to make sure we're not comparing apples and oranges: Are you using CSD in your builds or not? This switch made a huge difference before, so if you're working with CSD enabled this might be the likely explanation why some things work in your builds that do not work in the stock builds.
"It seems that the immediate drawing of the canvas basically disables drawing of the rest of the UI"
You scared me, that would be a most grievous mistake. I just tested it again and don't see any problem. The rulers and status bar still work when dragging an object. Did you build my stream directly or have any other non-trunk changes? Sorry to suggest this but here are binaries you can test. Maybe try copying the GTK & cairo? libs to your build. https://1drv.ms/u/s!AngRQgSreBCehy4R7D3x3Y2vIXPC
I used https://gitlab.com/inkscape/inkscape/commit/78d47938194fc52e e085387d9a0dc0753f3ed6d9 as the later commits did not compile for me.
I'll check your build this evening.
We also have CI builds with MSYS2 available: https://ci.appveyor.com/project/inkscape/inkscape/history If you rebase your branch on master your branch will be built, too (as long as there are not more errors/warnings preventing the build)
I hope you're not suggesting to forget about immediate drawing and just fix the drawing priorities. Using priorities would be easier to break, while drawing immediately is fool proof.
I'm just saying that priorities have been tweaked before to make all UI update properly and we should aim to retain this state. If direct drawing is compatible with this goal (I guess it was in gtk2) that's probably fine.
"Have you published [GTK3] code anywhere? " No, I haven't had time yet. I also want to discuss the problem I posed on StackOverflow and someone suggested IRC, but that I've never used IRC and it sounds very 1990s.
It's like SMS... it just works (even today)... A lot easier than all the modern stuff that claims to be easier than IRC.
I've talked to gtk devs on IRC before and it's the easiest way to get some interaction (bug reports usually fall into oblivion sooner rather than later).
BTW, the optimized GTK also disables clearing the region to be drawn (gdk_window_clear_backing_region()).
"Is [render cache] always slow?" It's only much slower if drawing a big area AND the scene complexity is low. For small areas and high complexity scenes, the overhead is much less noticeable.
I see... I guess before the low complexity scenes were not that important as redraw times were sufficiently fast anyway. User reports of slow redrawing usually involve blurs (or less frequently other filters).
For the multithreaded rendering, it's still a work in progress. AFAIK, I've eliminated all the race conditions with ThreadSanitizer, so it should be stable. I just pushed some further changes to allow the rendering to be incremental like it always has been. It should have that -fpermissive compile error in sp-canvas.cpp fixed, but you might still need it for other files.
I'll try to build this evening. As recommended before you could check the CI to make sure your branch is properly built, which should help with testing.
Regards, Eduard
On Sun, Feb 11, 2018 at 8:37 AM, Eduard Braun <eduard.braun2@...173...> wrote:
Hi Yale,
thanks for continuing to investigate this! Some comments:
Am 09.02.2018 um 16:02 schrieb Yale Zhang:
I have an update on my progress. I've made these changes which I'm requesting to be merged from my simdgenius_inkscape branch
disable event compression (previously mentioned)
fix priority inversion (09f55021, previously mentioned) - without
this, dragging objects too fast would cause no redraw.
As noted before, when rulers are shown there still is no redraw with this change
- draw immediately (78d47938) this partially reverts Krzysztof's
Hack fest 2016 changes like in 0.92. This reduces latency by ~10ms (compare cells G22 and E22 in spreadsheet)
I originally wanted to remove backing store and draw directly to the window surface, but I ran into this dilema so I didn't do it.
https://stackoverflow.com/questions/48339792/when-drawing-to -a-window-are-the-previous-contents-usually-discarded-and-what
While this change does indeed speed up drawing a lot I'm not sure it's for the reason we hope for: It seems that the immediate drawing of the canvas basically disables drawing of the rest of the UI (i.e. rulers, coordinates in the lower right, coordinates in inputs, etc). If I hide all UI elements (Ctrl+F11) I get the same perceived performance even without your code change.
While I guess redrawing the canvas is to be preferred over redrawing other UI elements, not redrawing the rest of the UI at all is probably not desirable either. Also it poses the question: Why did gtk2 manage to redraw the canvas *and* the UI and still yield higher performance than gtk3? So I'm not sure we're not still missing the actual regression. :-/
But there is still way more speedup to be had:
- *rendering cache slows things down 6x!* Compare cells E9 & E10 in
the spreadsheet. WTH?
Is it always slow? I guess for something simple like a rectangle it might not improve things, but maybe things start to change as soon as filters are involved (or many nodes or anything else that is not easy to render)? I admit I was not involved when the rendering cache was added and do not know its purpose. I tracked down the commit in which it was added [1] which does not explain anything either, though, so I need to continue digging... If anybody knows where the changes are actually explained some feedback is welcome.
[1] https://gitlab.com/inkscape/inkscape/commit/093f4174abc07b4e a523617fccdd8028f2670fea
- optimize GDK (maybe it's only slow on Windows) - compare cells J17
and J23 I made 2 changes: a. disabled layered windows - this is almost the same effect as setting GTK_CSD=0. I'm not clear why it speeds things up. I'm guessing it reduces image copying. Layered windows have to draw to CPU memory (GDI DIB), while non-layered windows draw directly to GPU memory (device dependent bitmap)?
b. replace surface_content = gdk_window_get_content (window);
in gdk_window_begin_paint_internal() with surface_content = CAIRO_CONTENT_COLOR_ALPHA
why create/delete a surface just to get the type?
Have you published this code anywhere? Also is there any upstream discussion on this yet which I could follow?
- multithreaded rendering - I've updated it to work with trunk, so
you can try it. Very little speed up for simple scenes.
Unfortunately the code does not compile for me, excerpt from the error: sp-canvas.cpp:802:22: error: passing 'const boost::shared_mutex' as 'this' argument discards qualifiers [-fpermissive]
Do you want us to compile your code with -fpermissive?
-Yale
Regards, Eduard
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Inkscape-devel mailing listInkscape-devel@...1901...://lists.sourceforge.net/lists/listinfo/inkscape-devel
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Inkscape-devel mailing list Inkscape-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/inkscape-devel
----- End forwarded message -----
Bryce, glad to help. I'm curious why the urgency now? It seems the GTK3 port has been slow for years. Is it because 0.93 will be the 1st release with GTK3? However, the slowness isn't anything fundamental to GTK3.
The biggest problem right now is dragging an object too fast will cause it to redraw at a very slow rate or not at all. The problem gets worse the longer it takes to draw the object. The problem was the Selection::_scheduled_modified() and SPCanvas::addIdle() events had higher priority than the repaint (expose) events, causing starvation, so I rebalanced the priorities. I've fixed this in commit 09f55021be0ad36a1f70e33326401a70de4e6903 of simdgenius_inkscape.
This problem doesn't happen in 0.92 because the rendered canvas is immediately sent to the window's surface instead of scheduling it later with an expose event (gtk_widget_queue_draw_area()), which could starve. The change away from immediate refresh happened at a 2016 Hackfest by Krzysztof. I don't see any good reason to do it that way and I didn't get any response from him. I'm guessing it's because the function to get the window's surface, gdk_cairo_create() was deprecated. But you can replace it with gdk_window_begin_draw_frame().
So I've partly reverted his changes in commit 79e74d8bfaec6a2b9b754a38f1656d8e8db71465. It reduces latency by 10ms. Maybe it depends on whether ruler and status bar are on. The other benefit is it only sends the invalidated area instead of the whole canvas like SPCanvas::handle_draw() does.
Eduard has been testing my changes. He did see the canvas update faster, but found the ruler and status bar redraw became slower. I thought I've fixed them but I've lost track. I think what would help is to have a set of automated tests to measure things like mouse move to redraw latency, drawing throughput for canvas, latency & throughput for rulers & status bar...
The biggest unsolved problem I'd say, is the slow render cache. When drawing a large, flat shaded rectangle, disabling the cache (_INKSCAPE_DISABLE_CACHE=1) speeds up the drawing 6x! For complex scenes, the slow down is much less noticeable.
Note: all my observations and testing have been mostly on Windows
-Yale
On Sun, Mar 4, 2018 at 1:53 PM, Bryce Harrington <bryce@...961...> wrote:
----- Forwarded message from Mail Delivery Subsystem < MAILER-DAEMON@...62...> -----
Date: Sat, 3 Mar 2018 18:23:21 -0800 From: Mail Delivery Subsystem <MAILER-DAEMON@...62...> To: bryce@...961... Subject: Returned mail: see transcript for details
The original message was received at Fri, 2 Mar 2018 13:44:02 -0800 from static-50-53-76-183.bvtn.or.frontiernet.net [50.53.76.183]
----- The following addresses had permanent fatal errors ----- inkscape-devel@lists.sourceforge.net (reason: 550 unknown user)
----- Transcript of session follows ----- ... while talking to mx.sourceforge.net.:
DATA
<<< 550 unknown user 550 5.1.1 inkscape-devel@lists.sourceforge.net... User unknown <<< 503-All RCPT commands were rejected with this error: <<< 503-unknown user <<< 503 Valid RCPT command must precede DATA
Reporting-MTA: dns; vinyl.outflux.net Arrival-Date: Fri, 2 Mar 2018 13:44:02 -0800
Final-Recipient: RFC822; inkscape-devel@lists.sourceforge.net Action: failed Status: 5.1.1 Remote-MTA: DNS; mx.sourceforge.net Diagnostic-Code: SMTP; 550 unknown user Last-Attempt-Date: Sat, 3 Mar 2018 18:23:21 -0800
Date: Fri, 2 Mar 2018 13:43:52 -0800 From: Bryce Harrington <bryce@...961...> To: Yale Zhang <yzhang1985@...400...> Cc: Eduard Braun <eduard.braun2@...173...>, inkscape-devel@...1784... sourceforge.net Subject: Re: [Inkscape-devel] slow, sluggish drawing with pencil & calligraphy tool solved
Hi Yale,
Thanks for working on this problem, it seems to be one of our top blockers for the 0.93 release at the moment, so your work is very much appreciated.
Can you update me on how things are going right now? Are there particular things you're stuck on? I probably don't know enough to offer advice myself but maybe can suggest someone that can.
If the issue looks like it can't be solved quickly, perhaps for testing purposes it might help to add one or two environment variables to turn on/off pieces of the UI or codebase that are causing problems. So if someone testing the renderer can do without the toolbar, they can disable it at runtime? Something like that?
In the coming weeks I'd like to produce a testing build of Inkscape, so if there are some (ugly) ways to enable testers to work around the performance bug that would help.
Bryce
On Fri, Feb 16, 2018 at 02:51:43AM -0800, Yale Zhang wrote:
Thanks, I couldn't find it because I was expecting the status bar to be drawn by Cairo. I tried to increase the priority of UPDATE_PRIORITY & SP_UPDATE_SELECTION_PRIORITY, but couldn't do so without causing the
ruler
& status bar updates to starve. I conclude that UPDATE_PRIORITY cannot have any higher priority than GDK_PRIORITY_REDRAW. Even when those priorities are the same, the status bar will always get drawn before canvas because SPDesktopWidget:: setCoordinateStatus() is called before SPCanvas::addIdle().
I've pushed my changes (I did some git resets instead of revert so it's diverged). Hopefully now, you can approve? Sorry about the back and forth over the rulers & status bar not updating. Shouldn't have been greedy about reducing latency by 2ms by setting UPDATE_PRIORITY = GDK_PRIORITY_EVENTS :)
On Thu, Feb 15, 2018 at 3:58 PM, Eduard Braun <eduard.braun2@...173...>
wrote:
Am 15.02.2018 um 12:23 schrieb Yale Zhang:
I've updated my custom cross compiler to use MSYS2 packages and finally saw the lack of rule/status bar updates. Unfortunately, it had nothing
to
do with using MSYS2. I just didn't look hard enough earlier :( The earlier versions (including the binaries) did suffer the problem
but
only when dragging large rectangles. Plus I had
_INKSCAPE_DISABLE_CACHE=1,
making the problem less noticeable.
So now I know what's wrong. The ruler update priority is
G_PRIORITY_LOW =
300, while UPDATE_PRIORITY in SPCanvas::addIdle() is
GDK_PRIORITY_EVENTS =
0, so it's no mystery who loses.
Changing UPDATE_PRIORITY back to GDK_PRIORITY_REDRAW + 10 fixes the problem. But the ~10ms less latency for immediate drawing (#3) now is reduced because a ~2ms delay is added between SPCanvas::addIdle() and SPCanvas::paint().
Of course, this is perfectly usable, but I have an itch to further improve. That 2ms latency is gone if I disable the status bar, so I'd
like
to do the status bar updates after SPCanvas::paint().
But I can't find where the status bar is being drawn. Do you? And also, what is SP_DOCUMENT_UPDATE_PRIORITY and SP_DOCUMENT_ROUTING_PRIORITY in document.cpp? I don't know if those
need to
be rebalanced.
The coordinates are updated by calling "SPDesktop::set_coordinate_
status"
in "desktop.cpp" (which calls "SPDesktopWidget::setCoordinateStatus"
in
"desktop-widget.cpp").
-yale
On Wed, Feb 14, 2018 at 2:30 AM, Eduard Braun <eduard.braun2@...173...> wrote:
Am 14.02.2018 um 11:09 schrieb Yale Zhang:
Good, we're getting closer to the same page. Can you please tell me
which
of my commits did you include in your testing? If dragging is still lagging, it sounds like you didn't take change #2 (priorities). You complained it didn't help or made things worse, but it should be
quite the
opposite.
As I wrote: I checked out 0bde236 and built the resulting code. It
should
therefore have contained all you latest (public) changes.
Let me get the MSYS2 headers & libs and do a build to rule out any library issues.
This would certainly help... Even though you keep telling me the stock builds *should* behave differently with your changes - they don't. If you're able to test yourself we'll probably safe ourselves some back
and
forth as seeing is believing. ;-)
"warn me next time it's not relocatable" - I think all you have to do
to
relocate was regenerate immodules.cache & loaders.cache. I wonder how
the
release packages of Inkscape & Gimp avoid this problem.
Ah, if they contain absolute paths that might have been it. As for the release packages: they contain relative paths in imloaders.cache
(MSYS2
contains a relocation patch for gdk-pixbuf2). Earlier versions (built
wit
devlibs) included the loaders in libgdk_pixbuf-2.0-0.dll to work
around
this (it's a built option)
Yes, my version should be quite fast, but it has little to do with the GDK optimizations. You should see the same benefits with vanilla GTK (GTK_CSD=1). For the optimized version, there should be no performance difference for GTK_CSD because I force the rendering code path to what GTK_CSD=0 uses, plus some optimizations.
"I'm not able to resize the Window" Sorry, I forgot to mention it has my optimized, but work in progress libgdk-3-0.dll. Please roll back to the stock version (libgdk-3-0.dll.orig). The optimized one keeps a persistent Cairo
Win32
surface for window updates, but resizing isn't handled.
On Tue, Feb 13, 2018 at 6:27 PM, Eduard Braun <eduard.braun2@...173...> wrote:
I was now able to build 0bde236
- With the status bar visible I'm getting super fast redraws of
the
status bar with some occasional redraws of the rulers but
everything else
is locked when moving a rect.
- With the status bar hidden I'm getting more redraws now and also
infrequent redraws of the whole UI, however moving the rect is
still
extremely sluggish.
- With the status bar and rulers hidden moving the rect has a
usable
redraw speed, rest of the UI (now only values in select toolbar I
guess)
update infrequently.
Comparing with your build linked before (warn me next time it's not relocatable, I had to move it to C:\Users\Yale\inkscape.gmesh ;-) )
there
are some grave differences:
- Redraw is in fact much faster with your version - are these the
gdk changes? Or are we really on to something fundamental? This is also true for GTK_CSD=0!
- Also the rest of the UI is updated much more frequently, even
with
the status bar visible
- In your version I'm not able to resize the Window (or rather I
can
but the parts that were not shown initially are not redrawn and
only show
some graphical garbage. Is this related to you gdk changes?
Am 12.02.2018 um 13:57 schrieb Eduard Braun:
Am 12.02.2018 um 13:12 schrieb Yale Zhang:
Eduard, please pull change #2 (fix priority inversion) before the immediate rendering changes. Without it, the lack of status bar &
ruler
updates are expected.
I think we're running in circles here... Most of my comments (as
well as
yours regarding direct drawing) referred to #3. The only issue I had with #2 was that Rulers seem still to be updated with a high priority and prevented the canvas to redraw (in stock
MSYS2
builds and therefore with CSD=0).
Yes, I am using CSD=1 in my testing (for both optimized & original
GTK).
But CSD isn't the actual reason for performance difference. It's
because of
the rendering code path CSD=1 uses (draw to CPU memory buffer, then
send to
UpdateLayeredWindow()), vs CSD=0 (draw directly to GDI device
context -
surprisingly this is slower until my optimizations).
Please note that CSD=0/1 in our stock MSYS2 builds makes a *huge* difference. If that is really not the case for your custom builds we
might
want to start looking into that, too. Maybe we're facing at a more fundamental difference. As MSYS2 is the official way to get GTK+ for Windows nowadays such a difference might be very relevant for many
projects.
Are your cross-compiled libraries using mingw-w64? Which OS are you using btw? (I'm usually testing on Windows 10 - I'd not be surprised
if
there's some major difference compared to e.g. Windows 7 wrt to the
low
level drawing functions).
I'm very interested in testing your GDK-modifications and see how
they
behave with the MSYS2 builds, so if you could drop a patch somewhere
that
would be much appreciated!
I did get an error from the CI build after the multithreaded
rendering
feature. It doesn't even get past CMake configure stage, so not very useful. That's because the build server doesn't have the Boost libs
(which
I use, not just the headers).
I think you looked at the Linux build - Windows CI is "external" via AppVeyor and has the required Boost libraries. It's just not working
in
your branch right now because an upstream update broke updating but I pushed a workaround for this already in the master branch [1]
(that's why I
suggested to rebase)
[1] https://gitlab.com/inkscape/inkscape/commit/85d7fa343f477d8f aae6cbde90ae7a243115fa37 (I messed up the rebase so it's authored by Tav, sorry for that)
On Mon, Feb 12, 2018 at 2:41 AM, Eduard Braun <eduard.braun2@...173...> wrote:
Am 12.02.2018 um 10:15 schrieb Yale Zhang:
"As noted before, when rulers are shown there still is no redraw
with
this change" It works for me on Windows with rulers. Could it be some out of date libraries? I'm still using a custom built cross compiler &
libraries (GTK
3.22.26 & glib 2.54.2). I know you're using the MSYS 2 prebuilt
libraries.
I've been wanting to use those too, but how recent are they?
They are usually the latest available (think of MSYS2's
MINGW-packages
as arch Linux for Windows), right now gtk 3.22.26 and glib 2.54.3.
Aside from disabling CSD they are unpatched. Just to make sure we're not comparing apples and oranges: Are you using CSD in your builds
or not?
This switch made a huge difference before, so if you're working
with CSD
enabled this might be the likely explanation why some things work
in your
builds that do not work in the stock builds.
"It seems that the immediate drawing of the canvas basically
disables
drawing of the rest of the UI"
You scared me, that would be a most grievous mistake. I just tested
it
again and don't see any problem. The rulers and status bar still
work when
dragging an object. Did you build my stream directly or have any
other
non-trunk changes? Sorry to suggest this but here are binaries you
can
test. Maybe try copying the GTK & cairo? libs to your build. https://1drv.ms/u/s!AngRQgSreBCehy4R7D3x3Y2vIXPC
I used https://gitlab.com/inkscape/inkscape/commit/78d47938194fc52e e085387d9a0dc0753f3ed6d9 as the later commits did not compile for
me.
I'll check your build this evening.
We also have CI builds with MSYS2 available: https://ci.appveyor.com/project/inkscape/inkscape/history If you rebase your branch on master your branch will be built, too
(as
long as there are not more errors/warnings preventing the build)
I hope you're not suggesting to forget about immediate drawing and
just
fix the drawing priorities. Using priorities would be easier to
break,
while drawing immediately is fool proof.
I'm just saying that priorities have been tweaked before to make
all UI
update properly and we should aim to retain this state. If direct drawing is compatible with this goal (I guess it was in
gtk2)
that's probably fine.
"Have you published [GTK3] code anywhere? " No, I haven't had time yet. I also want to discuss the problem I
posed
on StackOverflow and someone suggested IRC, but that I've never
used IRC
and it sounds very 1990s.
It's like SMS... it just works (even today)... A lot easier than all the modern stuff that claims to be easier than IRC.
I've talked to gtk devs on IRC before and it's the easiest way to
get
some interaction (bug reports usually fall into oblivion sooner
rather than
later).
BTW, the optimized GTK also disables clearing the region to be drawn (gdk_window_clear_backing_region()).
"Is [render cache] always slow?" It's only much slower if drawing a big area AND the scene
complexity is
low. For small areas and high complexity scenes, the overhead is
much less
noticeable.
I see... I guess before the low complexity scenes were not that important as redraw times were sufficiently fast anyway. User reports of slow redrawing usually involve blurs (or less frequently other filters).
For the multithreaded rendering, it's still a work in progress.
AFAIK,
I've eliminated all the race conditions with ThreadSanitizer, so it
should
be stable. I just pushed some further changes to allow the rendering to be incremental like it always has been. It should have that
-fpermissive
compile error in sp-canvas.cpp fixed, but you might still need it
for other
files.
I'll try to build this evening. As recommended before you could check the CI to make sure your
branch
is properly built, which should help with testing.
Regards, Eduard
On Sun, Feb 11, 2018 at 8:37 AM, Eduard Braun <eduard.braun2@...173...
wrote:
> Hi Yale, > > thanks for continuing to investigate this! Some comments: > > > Am 09.02.2018 um 16:02 schrieb Yale Zhang: > > I have an update on my progress. I've made these changes which I'm > requesting to be merged from my simdgenius_inkscape branch > > 1. disable event compression (previously mentioned) > > 2. fix priority inversion (09f55021, previously mentioned) -
without
> this, dragging objects too fast would cause no redraw. > > > As noted before, when rulers are shown there still is no redraw
with
> this change > > > 3. draw immediately (78d47938) this partially reverts Krzysztof's > Hack fest 2016 changes like in 0.92. This reduces latency by ~10ms > (compare cells G22 and E22 in spreadsheet) > > I originally wanted to remove backing store and draw directly to
the
> window surface, but I ran into this dilema so I didn't do it. > > https://stackoverflow.com/questions/48339792/when-drawing-to > -a-window-are-the-previous-contents-usually-discarded-and-what > > > While this change does indeed speed up drawing a lot I'm not sure
it's
> for the reason we hope for: > It seems that the immediate drawing of the canvas basically
disables
> drawing of the rest of the UI (i.e. rulers, coordinates in the
lower right,
> coordinates in inputs, etc). If I hide all UI elements (Ctrl+F11)
I get the
> same perceived performance even without your code change. > > While I guess redrawing the canvas is to be preferred over
redrawing
> other UI elements, not redrawing the rest of the UI at all is
probably not
> desirable either. > Also it poses the question: Why did gtk2 manage to redraw the
canvas
> *and* the UI and still yield higher performance than gtk3? So I'm
not sure
> we're not still missing the actual regression. :-/ > > > But there is still way more speedup to be had: > > 1. *rendering cache slows things down 6x!* Compare cells E9 & E10
in
> the spreadsheet. > WTH? > > > Is it always slow? I guess for something simple like a rectangle it > might not improve things, but maybe things start to change as soon
as
> filters are involved (or many nodes or anything else that is not
easy to
> render)? > I admit I was not involved when the rendering cache was added and
do
> not know its purpose. I tracked down the commit in which it was
added [1]
> which does not explain anything either, though, so I need to
continue
> digging... If anybody knows where the changes are actually
explained some
> feedback is welcome. > > [1] https://gitlab.com/inkscape/inkscape/commit/093f4174abc07b4e > a523617fccdd8028f2670fea > > > 2. optimize GDK (maybe it's only slow on Windows) - compare cells
J17
> and J23 > I made 2 changes: > a. disabled layered windows - this is almost the same effect
as
> setting GTK_CSD=0. I'm not clear why it speeds things up. I'm
guessing it
> reduces image copying. Layered windows have to draw to CPU memory
(GDI
> DIB), while non-layered windows draw directly to GPU memory (device > dependent bitmap)? > > b. replace surface_content = gdk_window_get_content (window); > in gdk_window_begin_paint_internal() > with surface_content = CAIRO_CONTENT_COLOR_ALPHA > > why create/delete a surface just to get the type? > > > Have you published this code anywhere? Also is there any upstream > discussion on this yet which I could follow? > > > 3. multithreaded rendering - I've updated it to work with trunk, so > you can try it. Very little speed up for simple scenes. > > > Unfortunately the code does not compile for me, excerpt from the
error:
> sp-canvas.cpp:802:22: error: passing 'const
boost::shared_mutex'
> as 'this' argument discards qualifiers [-fpermissive] > > Do you want us to compile your code with -fpermissive? > > > > -Yale > > > Regards, > Eduard >
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Inkscape-devel mailing listInkscape-devel@...1784...
sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/inkscape-devel
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Inkscape-devel mailing list Inkscape-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/inkscape-devel
----- End forwarded message -----
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Inkscape-devel mailing list Inkscape-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/inkscape-devel
participants (2)
-
Bryce Harrington
-
Yale Zhang