Why Use BitmapText Over Text in Pixi.js
When building a user interface (UI) in Pixi.js, developers must
choose between standard Text and BitmapText
for rendering written information. While standard Text is
easier to set up initially using system fonts, BitmapText
is the industry standard for game development due to its superior
performance, reduced memory overhead, and seamless rendering efficiency.
This article explains the technical differences between the two
rendering methods and outlines why BitmapText is almost
always the better choice for dynamic game UIs.
How Standard Text Works (The Bottleneck)
To understand why BitmapText is preferred, it helps to
understand how Pixi.js handles standard Text.
When you create a standard Text object, Pixi.js does not
render the text directly in WebGL. Instead, it creates a hidden HTML5
<canvas> element behind the scenes, draws the text
onto that canvas using the browser’s 2D context, and then uploads that
canvas as a texture to the GPU.
While this works well for static text, it introduces a severe
bottleneck when text changes frequently (such as a timer, score counter,
or damage numbers). Every time a standard Text string is
updated, Pixi.js must: 1. Clear the hidden canvas. 2. Redraw the new
text to the canvas. 3. Re-upload the newly updated texture to the
GPU.
This cycle causes massive CPU-to-GPU transfer overhead and triggers garbage collection spikes, leading to noticeable frame drops (stuttering) in your game.
How BitmapText Works (The Solution)
BitmapText bypasses the canvas creation and GPU upload
process entirely by treating text as a collection of sprites.
Before rendering, a developer generates a font atlas (a single image
containing all the letters, numbers, and symbols needed) alongside an
XML or JSON file mapping the coordinates of each character. When you
render BitmapText, Pixi.js simply draws individual sprites
from this pre-loaded texture atlas.
Updating a BitmapText string does not require creating
new textures. Pixi.js only needs to change the positions and texture
coordinates of the existing character sprites, which WebGL can process
almost instantly.
Key Advantages of BitmapText for Game UIs
1. Extreme Performance and Batching
Because BitmapText characters are just sprites
originating from a single texture atlas, Pixi.js can batch them into a
single draw call. You can render hundreds of dynamic numbers, player
names, and UI elements simultaneously on screen at 60 FPS without
impacting performance.
2. Lower Memory Usage
Standard Text requires a unique canvas texture for every
single text object on the screen. If you have 50 different damage
numbers floating on screen, you have 50 unique textures taking up GPU
memory. With BitmapText, those 50 numbers all share the
exact same font atlas texture, drastically reducing the game’s memory
footprint.
3. Visual Consistency Across Devices
Standard Text relies on system fonts or web fonts loaded
by the browser. If a user’s device lacks the font or fails to load it
properly, the browser will fall back to a default font (like Times New
Roman or Arial), potentially ruining your UI layout. Because
BitmapText uses a pre-rendered image asset, your font will
look identical on every single device, operating system, and
browser.
4. Support for Advanced Effects
By using tools to generate your bitmap fonts, you can bake complex styling—such as multi-colored gradients, inner glows, 3D bevels, and custom hand-drawn textures—directly into the font image. Achieving these same visual effects dynamically using standard CSS/Canvas text styling is either highly resource-intensive or mathematically impossible.
When to Use Standard Text Instead
While BitmapText is superior for the vast majority of
game UI elements, standard Text still has a place. You
might choose standard Text if: * The text is
entirely static: For main menu titles, credits, or static
settings labels that never change during gameplay, standard
Text is acceptable because the GPU upload only happens
once. * You require localization in many languages:
Generating bitmap fonts for languages with thousands of unique
characters (like Chinese, Japanese, or Korean) can result in massive
texture files. In these cases, standard Text or specialized
font-loading strategies are often easier to manage.