Skip to content

Dev - #215

Merged
duckietm merged 3 commits into
mainfrom
Dev
Sep 7, 2026
Merged

Dev#215
duckietm merged 3 commits into
mainfrom
Dev

Conversation

@duckietm

@duckietm duckietm commented Sep 7, 2026

Copy link
Copy Markdown
Owner

No description provided.

duckietm added 3 commits September 7, 2026 13:36
Memory leaks fixed:
- HabbiconAssetManager: composed-texture cache was keyed by continuously
  varying fade alphas and never evicted — every emote playback minted
  ~20+ permanent canvas+texture chains. Alphas are now quantized to
  8-unit steps and the cache is LRU-bounded at 256 entries with evicted
  textures destroyed.
- BadgeImageManager: an unrenderable group badge kept the 250ms retry
  loop alive forever and leaked a Container per attempt. Failure paths
  now destroy the scratch container and each badge gets a bounded
  number of attempts before being dropped from the queue.
- ExperienceData (pet XP bubble): rebuilt a Pixi Text + Container every
  animation frame without destroying them, because the amount guard was
  never armed. Now renders once per amount, destroys temporaries, and
  has a dispose called from PetVisualization.
- AvatarStructure.getParts: pushed dynamic effect part ids into the
  SHARED ActivePartSet array, growing gamedata for the life of the tab.
  Copy-on-write before appending.
- AvatarImage.dispose: releases its dynamic-part registrations from the
  shared geometry before nulling the structure — avatars disposed
  mid-effect used to pin themselves forever.
- Avatar/effect download managers: listener arrays deduped (the effect
  one grew per action update while a library was pending).
- RoomVisualization.clearHighlightArea: disposes the dropped highlight
  planes (leaked a pooled render texture per plane per drag move).
- AvatarVisualization.dispose: disposes remaining additions (pooled
  game-click-target textures survived room teardown).
- IsometricImageFurniVisualization: photo thumbnails the visualization
  itself created are now destroyed on replace/dispose via an ownership
  flag; shared asset-manager textures (guild badge) stay untouched.
- FurnitureParticleSystem: canvas render texture destroyed with its
  source, AlphaFilters destroyed on dispose.
- AdvancedMap.dispose: inverted guard meant the dictionary was never
  cleared and `disposed` stayed false (neutered SoundManager.dispose).
- MusicPlayer.play: overlapping calls orphaned a 1Hz interval.

Per-frame CPU:
- RoomInstance.update: index-based iteration instead of getValues()
  array copies (~900 copied elements + 4 allocations per frame).
- RoomObjectSprite filters setter: same-reference guard; furni layer
  update no longer allocates/assigns filters when both sides are empty
  — the unconditional assignment defeated the renderer's dirty-checking
  for every furni layer every visual update.
- RoomGeometry: direction setter early-outs when unchanged (the camera
  effect path re-assigns it every frame forever after a shake/rotate);
  displacement lookup skips key building when the room has none.
- AvatarImageCache.getImageContainer: shared empty defaults instead of
  a Map + array per body part per frame; dead double-create removed.
- AssetAliasCollection: alias scan is incremental per collection — each
  completed figure load used to re-walk every loaded collection.
- Mouse hit-testing: scratch Points instead of 2 allocations per sprite
  per mouse-move frame.
@duckietm
duckietm merged commit a706050 into main Sep 7, 2026
3 checks passed
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.

1 participant