Fix: prevent unnecessary webgl canvas recreation in noSmooth() #7557
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Resolve #7548
Issue
Calling noSmooth() inside draw() in WebGL mode recreates the canvas because setAttributes('antialias', false) is called every time. This causes unexpected behavior, including loss of canvas positioning and state.
Fix:
Before setting antialias to false, we check if it's already false.
If it's already disabled, we skip calling setAttributes(), preventing unnecessary canvas recreation.
Why This Fix?
Optimizes performance: Avoids reinitializing the WebGL canvas every frame.
Prevents unintended side effects: Keeps canvas position and other properties intact.
Aligns with expected behavior: In 2D mode, noSmooth() doesn’t recreate the canvas, so WebGL should behave similarly.
Before
Output with noSmooth()
Not display any output..
Output without noSmooth()

After

After fix issue.
Output with noSmooth() as well as without noSmooth().
Alternative Solution Considered
Updating the documentation to explicitly state that calling noSmooth() after initialization will recreate the canvas. This can still be done in addition to this fix.
Testing
✅ Verified in both 2D and WebGL renderers.
✅ noSmooth() works correctly in setup() and draw().
✅ No canvas recreation occurs unless truly necessary.