Creating 2D Sprites for a Mobile Game with Optimization

Sprites consume memory and drop frame rates even on mid-range devices — players leave, and you lose retention. We create and optimize 2D sprites for mobile games turnkey: from drawing to packing into atlases. Our engineers reduce graphics volume significantly without losing visual quality.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a mobile application for FEEDME
    Development of a mobile application for FEEDME
    971
  • Development of a mobile application for XOOMER
    Development of a mobile application for XOOMER
    869
  • Development of a mobile application for RHL
    Development of a mobile application for RHL
    1289
  • Development of a mobile application for ZIPPY
    Development of a mobile application for ZIPPY
    1143
  • Development of a mobile application for Affhome
    Development of a mobile application for Affhome
    1076
  • Development of a mobile application for the FLAVORS company
    Development of a mobile application for the FLAVORS company
    677

Why 2D sprites for a mobile game lose quality and frames

A mobile game most often fails with 2D sprites not at the rendering stage, but at the asset preparation stage.

The artist draws in high resolution, the art goes into the build "as is", and on the device a chain begins: texture blurring during scaling, extra asset weight in the package, frame rate drops on weak models.

Each item on its own looks tolerable, but together they produce animation stutters and "mush" on characters — the thing a player notices before the gameplay.

Blurring is almost always a consequence of the wrong filtering mode and the absence of power-of-two dimensions in the sheet size. A sprite drawn for one scale, when stretched on screens with a different pixel density, gets interpolated, and the outline loses sharpness.

It is fixed not by redrawing, but by import settings: filtering mode, disabling mip levels where they hurt, aligning atlas dimensions.

Asset weight grows imperceptibly: duplicate frames, unused variants, full-size source files inside the build. Sprite optimization starts with an audit — what is actually called at runtime and what sits there as dead weight.

Atlases packed without padding for specific scenes produce fewer material switches and a predictable package size.

The frame rate drops where many transparent layers and effects live on screen at the same time. Every extra transparent pixel is a redraw, and on a weak device the frame budget runs out before the scene has time to render.

We break down how this is closed at the level of graphics preparation and build settings, rather than with crutches in code.

What 2D sprite optimization brings to a mobile game

Atlases instead of a scatter of files

Every sprite loaded as a separate file is a separate draw call and a graphics pipeline state switch.

Packing sprites into atlases cuts the number of draw calls many times over: dozens of small images become a single texture, and rendering performance stops being CPU-bound on the frame.

Texture compression for mobile GPUs

Choosing a hardware-supported compression format takes the load off the device's memory: an uncompressed texture takes up many times more space than a compressed one.

For 2D sprites, a mobile game gets a stable frame rate even on weak devices, and the build size shrinks without any loss of visual quality.

Memory control and eliminating crashes

Peak memory consumption is the main cause of crashes on devices with low memory. Profiling and unloading unused atlases on scene changes remove an entire class of out-of-memory failures rather than merely postponing them.

Option When it fits Limitations
Sprite atlases Many small elements, UI, animations Requires repacking when frames are added
Hardware-supported texture compression Large backgrounds, dense graphics Depends on format support on the device
Manual optimization without atlases Prototype, single sprites Doesn't scale, the number of draw calls grows

Our engineers build atlases and set up texture compression in TexturePacker — this gives a predictable build size and a stable frame rate across the entire device fleet.

How we create and optimize 2D sprites: stages of work

Work on 2D sprites for a mobile game begins not with drawing, but with an audit of what already exists: we look at the source files, analyze how the graphics are currently packaged, how much memory they take up on the device, and where the rendering bottlenecks are.

It often turns out that half of the frames can be merged, and some layers are not needed at all — this removes load without losing the visuals. Then we structure the process so that each stage delivers a measurable result, rather than "it looks prettier."

  1. Graphics audit. We compile an inventory of assets, flag duplicates, broken frames, and unnecessary layers. The output is a resource map with an assessment of what gets reused and what gets redrawn.
  2. Source preparation. We bring frames to a unified grid and palette, clean up transparent margins and compression artifacts. This removes extra pixels that would otherwise be pulled into the device's memory.
  3. Atlas assembly. We lay out the sprites on a shared sheet, taking into account draw order and frequency of use. One atlas instead of dozens of separate files reduces the number of draw call switches.
  4. Mobile optimization. We select the compression format and color depth for each type of graphics — backgrounds, characters, UI. Static elements are packed more tightly, while animation is given a quality margin.
  5. Testing on devices. We run the build on real devices of different tiers, measuring scene load time and memory consumption. We look not only at flagships, but also at low-end models, where bottlenecks are most noticeable.
  6. Asset handoff. We deliver the finished atlases, layered source files, and a description of the structure: which sprite is where, how it is assembled, and what to change when adding new content.

This order matters because optimization at the end of the pipeline is always more expensive than at the start. If you draw everything first and then compress it, part of the work is wasted — you have to redraw frames to meet new requirements.

When the audit and atlas assembly come first, the artist and the engineer work within the same set of constraints, and the result doesn't have to be redone.

The client ends up with more than just images — they get a manageable set of resources: a clear structure, memory headroom for future updates, and documentation that lets the team add new content without us.

Describe your game and the current state of your graphics — we'll get back to you with an estimate and a work plan.

How is a sprite atlas different from individual images?

A sprite atlas is a single image in which all frames and graphic elements are tightly packed, with the coordinates of each frame described in a separate description file. Individual images are when each frame is stored as its own file.

The difference shows up not in the picture on screen, but in how the engine works with memory and the graphics pipeline.

The key parameter is draw calls. Each individual image, when rendered to the screen, requires a graphics pipeline state switch: the engine needs to rebind the texture before drawing the next frame.

A sprite atlas removes this problem — all frames live in a single texture, and the engine draws them in batches, without rebinding.

On a scene with a hundred simultaneously visible objects, this is the difference between a hundred draw calls and just a few, and it is precisely draw calls that hit the performance ceiling on weak mobile devices.

The second parameter is memory loading. Individual images require a separate header and buffer alignment for each texture; across dozens of small files, the overhead is noticeable.

An atlas holds a single texture, but pays for this with area: if the frames are not tightly packed, some pixels go to waste. That is why packing is done with an algorithm that controls fill rate, rather than "by eye."

There is also a downside. An atlas loads all frames into memory at once, even those that are rarely needed — for large animation sets, this is extra weight. Individual images are loaded on demand and allow memory to be freed up for other tasks.

In practice, a hybrid is chosen: frequently used frames go into the atlas, while rare and large ones remain as separate files.

Bottom line: individual images are simpler to prepare and allow targeted loading, while an atlas wins on draw calls and frame rate stability. The decision is made based on the number of objects on the scene and the device profile, not on the artist's convenience.

Case study: how sprite optimization sped up a mobile game

The project is a casual puzzle game with procedurally assembled levels: hundreds of objects on the scene, each with its own animation.

At the start, the artists delivered sprites "however was convenient in the editor": large sheets, extra transparent margins, different palettes for neighboring objects.

The game worked, but on mid-range devices a level opened noticeably longer than was comfortable, and during long sessions memory grew in steps — the collector could not keep up with freeing unpacked textures.

What the measurements showed

We started not with redrawing, but with profiling: we captured level load time, peak memory consumption, and the distribution of frame duration across three device classes.

It turned out that the bottleneck was not the number of objects, but the way they were packed: atlases were not assembled into a common sheet, some sprites were loaded at their original resolution, and transparent edges wasted texture area. This gave a concrete work plan instead of "let's redraw everything."

What we changed

We split the graphics into atlases by frequency of use: objects that appear on screen together ended up in the same sheet — the number of material switches per frame dropped.

We trimmed transparent margins to the actual sprite boundaries, brought the palettes to a common set, and rebuilt the animations into a common format with per-frame offsets.

Large backgrounds were moved into separate sheets at reduced resolution — they did not need the original level of detail anyway.

Metric Before After
Level load baseline 2.4x faster
Peak memory per scene baseline 38% lower
Stable frame rate drops at peaks smooth graph without stutters
Graphics package size baseline 31% smaller

What the result was

The level began to open faster, memory stopped growing during long sessions, and frame drops in peak scenes were gone — the game keeps an even rhythm on mid-range devices.

A separate effect: the artists now assemble atlases by a clear rule, and new objects no longer drag old problems along with them.

We select the tools for packing and controlling the weight of graphics based on the project's engine — here TexturePacker helped in tandem with the engine's profiler. Describe your task — we will come back with an estimate and a work plan.

Compatibility, migration, and rollback doubts — let's break them down

Before starting, clients usually ask the same set of questions: will the new 2D sprites fit into the current project, will the graphics migration break already released builds, and what happens if the art doesn't stick. We answer to the point.

What if the sprites don't match the format of the current pipeline? We check sprite compatibility at the input: we verify the atlas grid, pixel density, layer order, and animation anchor points against what the project already uses.

If the engine expects a different format, we convert during the preparation stage, not at the moment of integration, so the build doesn't break.

How does the graphics migration happen without downtime? Atlases are assembled in parallel with the working branch, and the old ones stay in place until acceptance.

The switch happens through resource substitution, not by rewriting the rendering code — this reduces the risk of regressions in animations and effects.

Is it possible to roll back the changes? Yes. Each sprite set is versioned, and rolling back changes is reverting to the previous atlas in a single operation. We maintain the history so that the previous release remains reproducible.

How are project accesses organized and what about documentation handover?

Project accesses are granted by roles with the minimum necessary permissions — separately for the repository, separately for the resource storage. Upon completion, you receive a documentation handover: atlas structure, naming rules, export requirements, and build instructions. Accesses are closed at your request.

Upon delivery, you receive:

  • sprite source files in an editable format with layers;
  • assembled atlases and coordinate maps for the target resolutions;
  • configured export rules and build scripts;
  • a compatibility scheme with the current project pipeline;
  • a versioning policy and the procedure for rolling back changes;
  • instructions for adding new sprites without our team;
  • an access matrix and the procedure for handing them over.

Describe your task and current pipeline — we'll get back to you with an estimate and a work plan.

Timeline for creating and optimizing 2D sprites by stage

Timelines depend not on the number of images, but on the number of unique states: a character with eight animations and four directions is already several dozen sprites, and each goes through the same pipeline.

Below is an approximate time by stage for a typical set of a mid-sized mobile game. The ranges are given without being tied to a calendar: they shift based on the batch size and how ready the source materials are.

Final rendering takes the longest — it grows linearly with the number of frames, whereas the other stages barely depend on the batch size. That's why we split a large set into waves: the first covers the key characters and the interface, then the secondary objects follow.

This way the game gets working visuals earlier, and style revisions don't affect atlases that have already been assembled.

In parallel with rendering, preparation for assembly is underway: we define the atlas grid and storage format in advance so that at the final step we don't have to re-mark up the finished frames.

This saves several days at the optimization stage and removes the risk that the graphics won't fit in memory on low-end devices.

To get back to you with an estimate and a plan, describe the task: genre, list of characters and objects, required animations, and target devices. Based on this data, we'll put together a work schedule with realistic timelines for your scope.