From f32a416e035221ef1daf1185b7fec8644ee02baa Mon Sep 17 00:00:00 2001 From: Anton Lavrevov Date: Fri, 28 Mar 2025 13:08:04 -0500 Subject: [PATCH] Fixed tween destroy memory leak. close #1898 --- CHANGELOG.md | 5 +++++ src/Tween.ts | 33 ++++++++++++++++++--------------- test/unit-tests.html | 1 + test/unit/Tween-test.ts | 34 +++++++++++----------------------- 4 files changed, 35 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be7f89b7..726de791 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 9.3.21 (not released) + +- Fixed memory leaks on Tween destroy +- Fixed incorrect export of stage/layer when internal nodes used buffer canvas for rendering + ## 9.3.20 (2025-03-20) - Fix text rendering when ellipses are used diff --git a/src/Tween.ts b/src/Tween.ts index bb2d8278..c1d61b78 100644 --- a/src/Tween.ts +++ b/src/Tween.ts @@ -200,8 +200,7 @@ export class Tween { nodeId = node._id, easing = config.easing || Easings.Linear, yoyo = !!config.yoyo; - let duration, - key; + let duration, key; if (typeof config.duration === 'undefined') { duration = 0.3; @@ -268,11 +267,7 @@ export class Tween { _addAttr(key, end) { const node = this.node, nodeId = node._id; - let diff, - len, - trueEnd, - trueStart, - endRGBA; + let diff, len, trueEnd, trueStart, endRGBA; // remove conflict from tween map if it exists const tweenId = Tween.tweens[nodeId][key]; @@ -352,14 +347,7 @@ export class Tween { _tweenFunc(i) { const node = this.node, attrs = Tween.attrs[node._id][this._id]; - let key, - attr, - start, - diff, - newVal, - n, - len, - end; + let key, attr, start, diff, newVal, n, len, end; for (key in attrs) { attr = attrs[key]; @@ -528,11 +516,26 @@ export class Tween { this.pause(); + // Clean up animation + if (this.anim) { + this.anim.stop(); + } + + // Clean up tween entries for (const key in attrs) { delete Tween.tweens[nodeId][key]; } + // Clean up attrs entry delete Tween.attrs[nodeId][thisId]; + + // Clean up parent objects if empty + if (Object.keys(Tween.tweens[nodeId]).length === 0) { + delete Tween.tweens[nodeId]; + } + if (Object.keys(Tween.attrs[nodeId]).length === 0) { + delete Tween.attrs[nodeId]; + } } } diff --git a/test/unit-tests.html b/test/unit-tests.html index 1262ea64..5bf2ce73 100644 --- a/test/unit-tests.html +++ b/test/unit-tests.html @@ -11,6 +11,7 @@