Title: [Bug]: macOS backend flickers/flashes due to use of timers · Issue #31991 · matplotlib/matplotlib · GitHub
Open Graph Title: [Bug]: macOS backend flickers/flashes due to use of timers · Issue #31991 · matplotlib/matplotlib
X Title: [Bug]: macOS backend flickers/flashes due to use of timers · Issue #31991 · matplotlib/matplotlib
Description: Bug summary Right now, the macOS backend has a lot of "misfires" where it will momentary render a blank figure. This typically occurs when the figure is first displayed as well as during a window resize. Here's a screen recording of me r...
Open Graph Description: Bug summary Right now, the macOS backend has a lot of "misfires" where it will momentary render a blank figure. This typically occurs when the figure is first displayed as well as during a window r...
X Description: Bug summary Right now, the macOS backend has a lot of "misfires" where it will momentary render a blank figure. This typically occurs when the figure is first displayed as well as during ...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/31991
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: macOS backend flickers/flashes due to use of timers","articleBody":"### Bug summary\n\nRight now, the macOS backend has a lot of \"misfires\" where it will momentary render a blank figure. This typically occurs when the figure is first displayed as well as during a window resize.\n\nHere's a screen recording of me resizing \"galleries/examples/pie_and_polar_charts/polar_demo.py\" on an old MacBook Air:\n\n\u003cdetails\u003e\n\u003csummary\u003eVideo of problem\u003c/summary\u003e\n\n---\n\n\u003cp\u003e⚠️ \u003cb\u003eWARNING\u003c/b\u003e: This video shows a flashing/flickering white box on top of a dark background.\u003c/p\u003e\n\nhttps://github.com/user-attachments/assets/04bbcc99-27ea-4891-974a-c59c5eda25e3\n\u003c/details\u003e\n\nThis also occurs on modern/faster hardware although not as pronounced.\n\nThe root cause is the use of timers to call `setNeedsDisplay:YES`. This was implemented in #21790 in order to fix #10980 and #17445. However, I believe that pull request was done without realizing it's possible to send the Agg buffer directly to an NSView (via layer-backing or layer-hosting) without the need of a `-drawRect:` callback.\n\n---\n\nAt a **very** general level, the macOS run loop has different phases of execution:\n\n1. Event-processing / Timers\n2. Layout\n3. Drawing\n\nRight now, in response to a `draw_idle()` call, the macosx backend creates a single-shot NSTimer and adds it to the run loop. At best, the timer will not fire until the **next** run loop cycle. If we are in \"Phase 1\" above, the earliest that `_draw_idle()` will be called is the **next** \"Phase 1\". We will skip over the actual draw phase (\"Phase 3\") of the current run loop cycle.\n\nAgain, this is a best case scenario. Per [Timer Tolerance](https://developer.apple.com/documentation/foundation/timer?language=objc#Timer-Tolerance):\n\n\u003e \"The system reserves the right to apply a small amount of tolerance to certain timers regardless of the value of the tolerance property.\n\nBasically, using an NSTimer is the equivalent of telling the system: \"perform this invocation no earlier than X, but you can delay a bit after X to save power.\"\n\n`draw_idle()` should instead do the following:\n\n1. If running in the main thread, immediately call `setNeedsDisplay`.\n2. If running on a background thread, `dispatch_async()` to the main thread and then call `setNeedsDisplay`.\n\n\u003e [!CAUTION]\n\u003e This assumes a layer-backed/layer-hosted approach. It won't work with the current `-drawRect:` approach without breaking blitting.\n\n### Code for reproduction\n\n```Python\n# galleries/examples/pie_and_polar_charts/polar_demo.py\n```\n\n### Actual outcome\n\nFlicker, misalignment with macOS drawing phase\n\n### Expected outcome\n\nNo flicker when resizing. No flicker upon first showing the figure.\n\n### Additional information\n\n_No response_\n\n### Operating system\n\nmacOS (Tested on 10.14, 14.7, and 27 beta 2)\n\n### Matplotlib Version\n\n3.11\n\n### Matplotlib Backend\n\nmacosx\n\n### Python version\n\n3.14.5\n\n### Jupyter version\n\n_No response_\n\n### Installation\n\nNone","author":{"url":"https://github.com/iccir","@type":"Person","name":"iccir"},"datePublished":"2026-07-03T17:30:08.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/31991/matplotlib/issues/31991"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:3df9dedd-539d-0918-68e5-6c5db4ae7f54 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 8E12:15CD3E:A8B2E:E888E:6A511039 |
| html-safe-nonce | 06e0ca57d29531da2c4cbdfedfbe8c28b80ae49ae0b53694e67b5f9d0174a0f7 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4RTEyOjE1Q0QzRTpBOEIyRTpFODg4RTo2QTUxMTAzOSIsInZpc2l0b3JfaWQiOiI0Mzg3ODAyOTYwMDUyMTYyNjE3IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | d7f83826938c1eef9293db7fbf8cc6282d7a49f565db0e61e3163bf478089513 |
| hovercard-subject-tag | issue:4805304999 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/31991/issue_layout |
| twitter:image | https://opengraph.githubassets.com/d8599fd3539be9bef17ae4713f3e89ba832b3f616c2f8ba17ba632dbecf79dbb/matplotlib/matplotlib/issues/31991 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/d8599fd3539be9bef17ae4713f3e89ba832b3f616c2f8ba17ba632dbecf79dbb/matplotlib/matplotlib/issues/31991 |
| og:image:alt | Bug summary Right now, the macOS backend has a lot of "misfires" where it will momentary render a blank figure. This typically occurs when the figure is first displayed as well as during a window r... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | iccir |
| hostname | github.com |
| expected-hostname | github.com |
| None | b076e100febaa00374cd89239f915d00dd3187f7c68b12bc2b7688181305344d |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | f9137f6d981cbbfd780af369f80ce890b2d0d2d4 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width