Releases: pixijs/pixijs
v8.17.1
💾 Download
Installation:
npm install pixi.js@8.17.1Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.1/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.1/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.1/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.1/dist/pixi.min.mjs
Documentation:
Changed
🐛 Fixed
- fix: compressed textures ignoring resolution from URL (e.g.
@0.75x) by @Zyie in #11960 - fix: center-align text correctly when words exceed wordWrapWidth by @Zyie in #11966
🧹 Chores
v8.17.0
💾 Download
Installation:
npm install pixi.js@8.17.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.17.0/dist/pixi.min.mjs
Documentation:
Changed
🚨 Behavior Change
BlurFilternow uses an optimized halving strength scheme by default, which changes visual output compared to previous versions. Setlegacy: trueto restore the old behavior.new BlurFilter({ legacy: true }); // or globally: BlurFilter.defaultOptions.legacy = true;
- Text with
align: 'justify'now useswordWrapWidthfor width calculation instead ofmaxLineWidth, matching CSS behavior. The last line is no longer stretched. breakWords: trueinHTMLTextnow correctly uses CSSword-break: break-wordinstead ofbreak-allto match behavior of other text renderers.
🎁 Added
- feat: add tagged text support to canvasTextSplit by @Zyie in #11949
SplitTextnow supportstagStyles, so styled runs (e.g.<red>Hello</red> <blue>World</blue>) are correctly split into per-characterTextobjects with individual styles preserved.
- feat: Improves text rendering and layout handling by @Zyie in #11947
- Bitmap text now supports
whiteSpacemodes (normal,pre,nowrap,pre-line,pre-wrap) with proper space/newline collapsing - Bitmap text word wrap supports break-after characters (hyphens, en-dash, em-dash, soft hyphen)
- Canvas text and split text now render
align: 'justify'by distributing extra word spacing - Dynamic bitmap fonts scale drop shadow
bluranddistanceproportionally to font size - Bitmap font
xAdvancenow uses true advance width frommeasureText()instead of bounding-box width - Kerning values correctly scaled by
fontScalein dynamic bitmap fonts
- Bitmap text now supports
- feat: add visibleChanged event to container by @ikigai-bjorn-s in #11940
container.on('visibleChanged', (visible) => { console.log('Visibility changed to:', visible); });
- feat: Add function for removing aliases from resolver by @Sertion in #11921
🐛 Fixed
- fix: prevent filter corruption with TexturePool mipmap separation by @vkarponen in #11865
- fix: blur by reducing strength on each pass by @Zyie in #11909
- fix: Reduce work done by the blur shader by @Sertion in #11917
- fix: Correctly handle offset in ColorMatrixFilter by @Sertion in #11925
- fix: Apply global filter offset to ParticleContainer rendering by @GoodBoyDigital in #11882
- fix: respect texture trim offset in NineSliceSprite by @shtse8 in #11919
- fix: return valid empty bounds from empty Graphics by @GoodBoyDigital in #11908
- fix: Graphics getLocalBounds returns stale data between operations in same frame by @GoodBoyDigital in #11886
- fix: Graphics bounds account for miter joins at sharp angles by @GoodBoyDigital in #11884
- fix: BindGroup crash when resource destroyed in batched group by @GoodBoyDigital in #11876
- fix: remove listener from old resource in BindGroup.setResource by @GoodBoyDigital in #11901
- fix: removeAllListeners() on Renderer.destroy() by @taye in #11951
- fix: correct minFPS/maxFPS mutual clamping in Ticker by @Zyie in #11952
- fix: invalidate cached source in color.setAlpha() to prevent stale alpha reuse by @darthvader58 in #11924
- fix: emit removed event when using addChildAt by @aSipz in #11912
- fix: guard against missing characters and kerning data in bitmap text by @stargazer-2697 in #11907
- fix: copy modifier keys from TouchEvent to normalized touch objects by @kaigritun in #11906
- fix: use quotes when loading a Web font to support old versions of Chrome by @adngdb in #11902
- fix: move DOMPipe registration to init.ts to fix Web Worker support by @Zyie in #11953
- fix: clarify BackgroundLoader cache behavior in documentation by @imuday984 in #11935
🧹 Chores
- chore: Add PixiJS development playground by @GoodBoyDigital in #11878
- chore: overhaul documentation system with TypeDoc plugins, examples, and guides by @Zyie in #11905
- chore: consolidate build and test scripts by @Zyie in #11910
- chore: expand build, test, and API documentation by @Zyie in #11956
- chore: combine visual test diff output into single labeled image by @Zyie in #11954
- chore: add ESLint rule enforcing ~/ imports in test and scene files by @Zyie in #11899
- chore: reorganizes visual scene tests into logical subdirectories by @Zyie in #11872
- chore: Improve test server setup by dynamically allocating port by @Zyie in #11874
- chore: increase HTMLText visual test wait from 250ms to 350ms by @Zyie in #11891
- chore: remove tsc-silent dependency by @Zyie
- docs: document filters + RenderLayer limitation by @GoodBoyDigital in #11883
New Contributors
- @adngdb made their first contribution in #11902
- @kaigritun made their first contribution in #11906
- @darthvader58 made their first contribution in #11924
- @Sertion made their first contribution in #11925
- @shtse8 made their first contribution in #11919
- @aSipz made their first contribution in #11912
- @ikigai-bjorn-s made their first contribution in #11940
- @vkarponen made their first contribution in #11865
- @imuday984 made their first contribution in #11935
- @taye made their first contribution in #11951
v8.16.0
💾 Download
Installation:
npm install pixi.js@8.16.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.16.0/dist/pixi.min.mjs
Documentation:
Changed
🚨 Behavior Change
SplitTextnow more accurately splitsTextacross a wider range ofTextStyleconfigurations. This may result in slight changes to character positioning.- Using
SplitText.fromfrom an existingTextnow correctly transfers the source anchor to the new instance by mapping the anchor to pivot coordinates. This changes layout and positioning compared to previous behavior. SplitBitmapTextnow correctly defaults to awhitefill, matching the behavior ofBitmapText.HTMLTextnow correctly respectsbreakWordsand no longer cuts off words that exceedwordWrapWidth.HTMLTextnow respects the alpha value of its fill and stroke.Textnow correctly aligns when usingalign: 'right'oralign: 'center', resulting in a small positional adjustment.Container.cullAreais now correctly interpreted in the container’s local coordinate space and transformed to global coordinates before culling checks.// cullArea is defined in local space and transformed during culling container.cullArea = new Rectangle(0, 0, 100, 100);
graphics.texture(texture, 0x000000)will now correctly apply a black tint
🎁 Added
- feat: Canvas renderer by @krzys @Zyie in #11815
- Note: This feature is experimental, please let us know if you run into any issues.
await app.init({ preference: 'canvas' });
- feat: tagged text by @Zyie in #11827
- Note: Currently only works for
Text/HTMLText,BitmapTextsupport coming soon
const text = new Text({ text: '<bold>Important:</bold> This is <highlight>highlighted</highlight> text', style: { fontFamily: 'Arial', fontSize: 28, fill: 'white', tagStyles: { bold: { fontWeight: 'bold', fill: 'yellow' }, highlight: { fill: 'cyan', fontSize: 32 } } } });
- Note: Currently only works for
- feat: improve stability of SplitText by @Zyie in #11858
- SplitText now fully mirrors Text behavior and regenerates automatically when its TextStyle changes via
text.styleChanged()
splitText.style.fontSize = 32 splitText.styleChanged()
- SplitText now fully mirrors Text behavior and regenerates automatically when its TextStyle changes via
- feat: external texture support by @astralarya @GoodBoyDigital in #11846 #11861
- feat: add parseSync to spritesheet by @jimhigson in #11794
- feat: improved Pool typing for pool.get() method by @unstoppablecarl in #11799
- feat: add cube texture by @GoodBoyDigital in #11800
- by @GoodBoyDigital in
- feat: Implement mip level rendering support in the rendering system by @GoodBoyDigital in #11801
- feat: render to array layer by @GoodBoyDigital in #11803
🐛 Fixed
- fix: Improve HTML text measurement accuracy and add comprehensive test scenes by @Zyie in #11862
- fix: project container.cullArea from local to global coordinate space before doing cull check by @jujurocket in #11598
- fix: use vColor instead of localUniforms.uColor in WebGPU MSDF shader by @Riphal in #11848
- fix: preserve VAO cache in GlGeometrySystem by @GoodBoyDigital in #11863
- fix: GC system to ensure render groups are marked as dirty by @Zyie in #11842
- fix: SplitBitmapText requires "fill: 'white'" by @GiorgiMaziashvili in #11721
- fix: preserve generic type parameters in WGSL struct reflection by @stargazer-2697 in #11855
- fix: improve extractAttributesFromGpuProgram to support struct-based inputs by @GoodBoyDigital in #11796
- fix: improves tree-shaking by optimizing module imports by @Zyie in #11833
- fix: disambiguate falsey tint with black uint by @bigtimebuddy in #11831
- fix: BitmapFontManager getFont emitting TextStyle update event by @subhu339 in #11835
- fix: allow custom parsers to override src in Resolver (#11828) by @GoodBoyDigital in #11849
- fix: recognise WGSL vertex attributes followed by closing parenthesis by @stargazer-2697 in #11854
- fix: Video Loader Not Catching Load Errors by @stargazer-2697 in #11856
🧹 Chores
- chore: add visual tests for text rendering features by @Zyie in #11825
- chore: Upgrades dependencies by @Zyie in #11806
- chore: guide to use envinfo to get environment information by @typed SIGTERM in #11859
- chore: optimize fastCopy with waterfall typed array selection by @GoodBoyDigital in #11798
- chore: use texImage2D instead of texSubImage2D for video in Safari by @GoodBoyDigital in #11867
New Contributors
- @subhu339 made their first contribution in #11835
- @stargazer-2697 made their first contribution in #11854
- @GiorgiMaziashvili made their first contribution in #11721
- @Riphal made their first contribution in #11848
- @jujurocket made their first contribution in #11598
- @krzys made their first contribution in #11815
v8.15.0
💾 Download
Installation:
npm install pixi.js@8.15.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0/dist/pixi.min.mjs
Documentation:
Changed
🎁 Added
- feat: add unified GC by @Zyie in #11786
- Deprecated
TextureGCSystem/RenderableGCSystemin favor ofGCSystem.// old app.init({ textureGCActive: true, textureGCMaxIdle: 60000, textureGCCheckCountMax: 30000, renderableGCActive: true, renderableGCMaxUnusedTime: 60000, renderableGCFrequency: 30000, }); // new app.init({ gcActive: true, gcMaxUnusedTime: 60000, gcFrequency: 30000, });
- feat: Adds auto-GC option to view containers by @Zyie in #11810
- Disable automatic garbage collection for a node.
new Sprite({ autoGarbageCollect: false, });
- Disable automatic garbage collection for a node.
- Deprecated
- feat: add unload method to reset GPU data by @Zyie in #11762
-
You can now manually unload a node by calling its
unloadmethod. This releases any GPU resources associated with the node. The node can still be used afterward—it will be re-created automatically when needed.sprite.unload(); text.unload(); mesh.unload();
-
feat: move GPU context storage to GraphicsContext._gpuData by @Zyie in #11763
-
feat: move GL/GPU buffer storage to Buffer._gpuData and manage buffers list by @Zyie in #11775
-
feat: add descriptive names GCManagedHash by @Zyie in #11811
-
feat: update text GPU lifecycle and resolution updates by @Zyie in #11781
-
- feat: ParticleContainer type improvements by @unstoppablecarl in #11708
- feat: allow RenderTexture.create to accept dynamic option by @seanzhaoxiaoxiao in #11767
🐛 Fixed
- fix: SVGParser.ts Allow negative values for Polygon(s)/polyline(s) by @Raukie in #11771
- fix: prevent double returning of batches to pool by @GoodBoyDigital in #11780
- fix: Add error handling for message processing in KTX worker by @zardoy in #11768
- fix: RenderTexture ignoring format setting (WebGL) by @laino in #11777
- fix: Add Multiple Render Targets (MRT) support by @GoodBoyDigital in #11792
- fix: correct viewport Y calculation for root render targets by @GoodBoyDigital in #11797
- fix: garbage collection for bitmap text by @Zyie in #11809
🧹 Chores
- chore: Improve JSDoc documentation across modules by @Zyie in #11812
- chore: refactors CI workflows for trusted publishing by @Zyie in #11820
New Contributors
v8.15.0-rc
💾 Download
Installation:
npm install pixi.js@8.15.0-rcDevelopment Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0-rc/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0-rc/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0-rc/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.15.0-rc/dist/pixi.min.mjs
Documentation:
Changed
🎁 Added
- feat: allow RenderTexture.create to accept dynamic option by @seanzhaoxiaoxiao in #11767
- feat: add unload method to reset GPU data by @Zyie in #11762
- feat: add unified GC by @Zyie in #11786
- feat: move GPU context storage to GraphicsContext._gpuData by @Zyie in #11763
- feat: move GPU data to Geometry._gpuData by @Zyie in #11772
- feat: move GPUData to TextureSource by @Zyie in #11774
- feat: move GL/GPU buffer storage to Buffer._gpuData and manage buffers list by @Zyie in #11775
- feat: update text GPU lifecycle and resolution updates by @Zyie in #11781
- feat: ParticleContainer type improvements by @unstoppablecarl in #11708
🐛 Fixed
- fix: SVGParser.ts Allow negative values for Polygon(s)/polyline(s) by @Raukie in #11771
- fix: prevent double returning of batches to pool by @GoodBoyDigital in #11780
- fix: Add error handling for message processing in KTX worker by @zardoy in #11768
- fix: RenderTexture ignoring format setting (WebGL) by @laino in #11777
- fix: Add Multiple Render Targets (MRT) support by @GoodBoyDigital in #11792
New Contributors
v8.14.3
💾 Download
Installation:
npm install pixi.js@8.14.3Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.3/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.3/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.3/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.3/dist/pixi.min.mjs
Documentation:
Changed
🐛 Fixed
- fix: Only create stage Container on init if it doesn't exist by @lunarraid in #11766
v8.14.2
💾 Download
Installation:
npm install pixi.js@8.14.2Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.2/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.2/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.2/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.2/dist/pixi.min.mjs
Documentation:
Changed
🐛 Fixed
- fix: graphics memory leak and cleanup by @Zyie in #11753
- fix: typo in Application example: replace '-' with '=' in asset loading by @Aryaman1792 in #11750
- fix: parse resolution and format from URLs in object sources in assets resolver by @stereopasa in #11747
- fix: track item count in Pool class and add related tests by @Zyie in #11760
- fix: bitmanFontXMLParser should recognize xml fonts with versions by @rafalaidlaw in #11761
- fix: Remove automatically added 'resize' event listener from TextureSource on Texture destroy() by @Romans-I-XVI in #11764
- fix: resolve a typescript annoyance with Container.filters by @jimhigson in #11757
- fix: enable proper application reinitialization by @Zyie in #11759
- fix: correct uBackTexture binding for filters with blendRequired by @GoodBoyDigital in #11754
🧹 Chores
- chore: add mention of uBackTexture to Filter docs (otherwise undocumented) by @jimhigson in #11756
New Contributors
- @Aryaman1792 made their first contribution in #11750
- @stereopasa made their first contribution in #11747
- @rafalaidlaw made their first contribution in #11761
- @Romans-I-XVI made their first contribution in #11764
v8.14.1
💾 Download
Installation:
npm install pixi.js@8.14.1Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.1/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.1/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.1/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.1/dist/pixi.min.mjs
Documentation:
Changed
🐛 Fixed
- fix: bytesPerRow calculation for BufferImageSource in WebGPU by @koteelok in #11718
- fix: Guards mask reset from null reference by @Zyie in #11719
- fix: Prevents errors during worker manager reset by @Zyie in #11720
🧹 Chores
- chore: move transcoders off pixijs.download by @bigtimebuddy in #11730
- chore: cleanup using optional chaining by @bigtimebuddy in #11713
v8.14.0
💾 Download
Installation:
npm install pixi.js@8.14.0Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.0/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.0/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.0/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.14.0/dist/pixi.min.mjs
Documentation:
Changed
🎁 Added
- feat: add asset loading strategies by @Zyie in #11693
- Three new loading strategies have been introduced:
throw,skip, andretrythrow: The default strategy and matches the behavior of previous versions. With this strategy enabled any asset that fails to load will throw an error and the promise will reject.skip: If any asset fails to load not error is thrown and the loader continues to load other assetsretry: Allow for multiple attempts at loading an asset before an error is thrown. The number of attempts and the delay between attempts are configurable
const options: LoadOptions = { strategy: 'retry', retryCount: 5, // Retry up to 5 times }; await Assets.load('unstable-asset.png', options);
await Assets.init({ basePath, loadOptions: { strategy: 'skip', onError: (error, asset) => console.log(error, asset.url) }, }); Assets.addBundle('testBundle', [ { alias: 'bunny', src: 'textures/bunny_no_img.png' }, { alias: 'bunny2', src: 'textures/bunny.png' }, ]); // only bunny2 is defined and did not throw an error const assets = await Assets.loadBundle('testBundle');
- Three new loading strategies have been introduced:
- feat: Adds progress size to asset loading by @Zyie in #11699
- You can provide
progressSizewhen loading assets to get a more accurate loading percentage. If no size is provide the default value is 1.
const assets = [ { src: [ { src: 'textures/texture.webp', progressSize: 900, }, ], alias: ['bunny-array', 'bunny-array2'], }, { src: 'textures/bunny.png', progressSize: 100, } ]; const res = await Assets.load(assets, progressMock);
- You can provide
- feat: added rotate to Point math-extras by @unstoppablecarl in #11704
// Basic point rotation const point = new Point(10, 20); const degrees = 45 const radians = degrees * (Math.PI / 180) const result = point.rotate(radians); console.log(result); // {x: -7.071067811865474, y: 21.213203435596427} // Using output point for efficiency const output = new Point(10, 20); point.rotate(90 * (Math.PI / 180), output); console.log(result); // {x: -7.071067811865474, y: 21.213203435596427}
- feat: add change guards to TextStyle setters to prevent redundant updates by @mayakwd in #11677
🐛 Fixed
- fix: incorrect accessibility div when recycled from the pool (#11679) by @brentmc in #11680
- fix: use updated childrenRenderablesToUpdate index in validateRenderables by @davidetan in #11688
- fix: modify conditional to skip draw call when instanceCount < 1 by @jaburwock in #11639
- fix: respect filter enabled state by @mayakwd in #11674
- fix: ensure
updateTextBoundsis called regardless of style and resolution change by @mayakwd in #11676 - fix: Allow IRenderLayer as part of the ContainerOptions children array by @albinkong in #11687
- fix: removes accessibility system event listeners correctly by @Zyie in #11700
🧹 Chores
- chore: fix outdated
textureSourceOptionsdoc example by @Caden-Hornyak in #11686
New Contributors
- @Caden-Hornyak made their first contribution in #11686
- @jaburwock made their first contribution in #11639
- @unstoppablecarl made their first contribution in #11704
v8.13.2
💾 Download
Installation:
npm install pixi.js@8.13.2Development Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.13.2/dist/pixi.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.13.2/dist/pixi.mjs
Production Build:
- https://cdn.jsdelivr.net/npm/pixi.js@8.13.2/dist/pixi.min.js
- https://cdn.jsdelivr.net/npm/pixi.js@8.13.2/dist/pixi.min.mjs
Documentation: