Slow canvas UI (with multiple elements)

I just wanted to chime in here and mention that I tested @curtisw’s performance improvements and they appear to give a major boost to Grasshopper on Mac. Curtis has done an amazing job with this and we hope you test out the the Release Candidate and report back.

Previously, the FPS counter found in View > Canvas redraw speed was broken, but Curtis has fixed that too in this update. That means that, going forward, we can make more meaningful comparisons to see if we’ve improved or regressed.

3 Likes

RH-60220 is fixed in the latest Service Release Candidate

2 Likes

@curtisw, @dan thanks a lot for your effort guys! You are amazing.

I tried out the newest improvements and did some comparisons myself.
6.29.20239.15172 vs. 7.0.20266.16016 running on macOS 10.15.6

Here is my experience:

  1. Canvas frame rate seems to have increased about 2x (This was measured by video recording the two versions and counting frames). And one can really feel the difference, when zooming and panning around!

  2. The speed of resizing empty GH windows has increased significantly as well, being around 5x faster (from around 0.6fps to around 3.5fps)

  3. Next I compared those improvements to the current Windows version. GH in Windows is about 3-3.7x faster.
    Furthermore, resizing GH in Windows works in an instant. Actually faster than resizing the Explorer window, which is very funny.

You guys made some great progress here. Overall GH frame rate has gone from being about 6-7.4x slower to only being 3-3.7x slower, which is great!
However, as can be seen, some improvements still have to be made. Please let me know if I can be of any help!

Best wishes,

Rudi

4 Likes

Thanks so much for the detailed testing @rudolf.neumerkel! Yep, always room for improvement, but I’m glad things are a bit faster.

2 Likes

Sure thing @dan, it is a pleasure being able to help a bit.

Are there any further canvas fps improvements, that we can expect with RH7? I am now working again on some larger scripts and am getting frame rates as low as 6fps in some areas (only using half of my 16" screen). Keep in mind, that this also slows down moving and adding components to the canvas.
Did you find out any new bottlenecks?

Thank you and have a great day!

Some small issue I just found…

Downloaded the script from Daniel´s answer:

There is some text / graphics on the top of the canvas.

Framerate with text: 6fps
After deleting the text: 30fps

Hey @rudolf.neumerkel,

Thanks for following up! I’m seeing major slowdowns with that definition too. I’ve created a new YT for that RH-62333.

Cheers!

awesome, thank you for the quick reply!

I am sorry for the not so scientific nature of my reply, but… Rhino 7 is handling Grasshopper canvas much better. Sometimes I need to use Rhino 5 as well and the difference is gigantic. Not on par yet with the Windows version, though.
Keep up the good job on the improvements! I still have faith that one day both Win and Mac will be the same in terms of performance.

1 Like

Totally agree sir. Canvas performance has improved a lot. General speed and as well as UI fixes, zooming smoothness etc. are much better now.
But as Dan mentioned there is still some room for improvement - I am still experiencing heavy frame drops in most of my (larger/denser) scripts.

Cant wait to see some more fps gains, guys!!! :rocket::heart::coffee::earth_africa::ocean:

btw, I already wrote about this but: it is crazy how well the Trackpad functionality is implemented!!! It is amazing. Feels about as fast as with the mouse!

edit:
Basically, scripts larger than around 1000 components get so slow that proper work is not possible or takes more twice the time as it should, which is obviously not good, when time is limited. Interestingly performance in that case has barely anything to do with actual displayed components - even a few currently visible component would only display with 10 fps or less. Not so much fun debugging a large script in that scenario…

Just to elaborate on this sentence:

  • I opened a larger script (>1000 components)
  • Created a single Geometry component somewhere with some distance away from all the other components
  • checked the Canvas RedrawSpeed in fullscreen

The result: 8.47 frames/second for a “single” visible component. (compared to over 30fps if I paste the same component in an empty script).
Hopefully this hints to an underlying issue - not only actively shown components, but amount of components in the background as well… Hope this helps!

@curtisw, @dan

@rudolf.neumerkel thanks for the follow up and details.

When using the script you posted before (Studio_HB_Skript.gh), I am seeing ~30 fps when doing the same steps. It could be a “rogue” component that is causing the issue, by doing excessive drawing or processing even when not on screen. Are you able to replicate the issue with that script as well?

Also, would you be able to send the script you’re using that causes the larger slowdown? It would help to track down the issue.

@curtisw thanks a lot for your answer as well as the quick investigation!

I can confirm: the Studio_HB_Skript does not seems to have this kind of slowdown. Here is the script which causes the issue:

210220_Iteration.gh (775.8 KB)

This is the case independent of how large the window is btw. I am getting 9fps also with a tiny GH window.

p.s.:

As a side note, speaking of larger scripts.:The Search function of GH also seems to behave differently with larger scripts. The component you click on in the dialog will be to be displayed in the center of the window and grayed out area seems to have some graphical issues - see the screenshot attached below: On the left is a new script with 2 components, on the right is a larger scripts (this seems to be happening with many of my scripts). Maybe this issue is related, IDK.

@curtisw, can you reproduce the same issue on your machine?

Cheers, Rudi

Wow, this file has quite a few third-party components. I’ve hunted down and installed most of them (not all), but I cannot reproduce this. I get faster redraw speeds if I zoom into a single component than if I zoom out to the entire graph.

Deinstallad ALL plugins I could find from:

  • libaries folder
  • user objects
  • package manager

Opened the script without installing all the plugins. Frame rate of an empty area increased from 8.5 to 12. But still way to slow - in an empty area it should be maxing out at 60fps as it does when I open an empty document.

Anyway, I have not encountered this problem in another script yet, so for now it is not too urgent. I am more interested in overall canvas performance improvements and this is a very strange but specific issue… (still experiencing an average frame rate of 12-14fps, when I am checking in from time to time in my usual scripts)

Fun fact, I remember @DavidRutten allegedly stating a while back that Grasshopper is not intended for having more than 150 (?) components on the canvas. And that bigger definitions should be clustered and/or spanned over multiple files. :slight_smile:

true that. Realized this way too late tbh…
However, most of the UI performance issues, have more sth to do with currently visible number of components on the canvas, rather than total amount. Canvas performance can already be slow with a script with 30 components

Hey @rudolf.neumerkel,

Thanks again for the sample file, and sorry I missed responding to your earlier messages.

I tried out the file in the profiler and when in a blank part of the canvas I found that the Group, Relay, and Placeholder components (when you don’t have the specified plugin(s)) still render even if out of view. There may be components in the missing plugins that need to do the same bounds check too (if they override the Render method), but unfortunately only the plugin author(s) can fix those up.

I’ve created RH-64310 to fix that up. After those fixes it gets it back up to near ~60fps at an empty area of the canvas (which is the max on macOS due to its limiting to the screen refresh rate).

Cheers,
Curtis.

1 Like

thanks for your answer! There are some things which I did not understand:

to make things clear, what do you mean by

  • groups? → the colored grouping boundaries?
  • relays?

how did you find that out btw?

what is the render method?