Skip to content

Conversation

@almarklein
Copy link
Member

@almarklein almarklein commented Nov 21, 2025

This PR makes each device create a thread for polling the native device to resolve the promises. This means there are no busy-loops; i.e. its less strain on the CPU while obtaining faster responses.

The implemented technique is heavily inspired by the implementation in the Servo browser (servo/servo#32266). The Firefox browser will likely adopt a similar strategy soon (https://bugzilla.mozilla.org/show_bug.cgi?id=1870699).

When passing a loop instance, this work relies on loop.call_soon_threadsafe from pygfx/rendercanvas#146.

@almarklein almarklein requested a review from Korijn as a code owner November 21, 2025 10:56
Korijn
Korijn previously approved these changes Nov 21, 2025
@almarklein
Copy link
Member Author

I don't think anyone uses feature to set the loop yet, but just in case, let's merge this after pygfx/rendercanvas#146 is merged.

@almarklein
Copy link
Member Author

I made a small improvement to the _sync_wait() logic.

I can already see that the FPS in pygfx/rendercanvas#138 increases a bit because the system simply reacts immediately (instead of the previous loop that repeatedly sleeps and checks status). Also, while FPS is nice, the greater advantage IMO is minimizing the delay between rendering a frame and putting it under the user's eyes. This delay has a big impact on the perceived responsiveness.

@almarklein almarklein requested a review from Korijn November 24, 2025 10:49
@almarklein almarklein merged commit 50ccd8d into main Nov 24, 2025
19 checks passed
@almarklein almarklein deleted the pollthread branch November 24, 2025 11:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants