Surface Appearance loads inconsistently on mobile and often displays at very low quality - even if the phone allows it

Hi,

Thank you everyone for your time! :grinning_face:

As a Roblox developer, I strive to implement the latest & most innovative avatar related APIs for our makeup game: “Style Stars”.

Our makeup game relies on Surface Appearance textures for makeup. Players can select various different makeup textures & color them accordingly. We uploaded those textures as 256x256 and 128x128. Given their texture size being optimized and small already, we did not expect any issues.

The Problem:

As we have grown our game to over 4M monthly active users, we have noticed reports starting in mid December 2025 of players reporting low quality makeup, especially on mobile.

How players are supposed to see the makeup:

How a majority of players see the makeup in our game:

Aside from the bug that I am going to describe shortly, I personally expect downscaling to happen on textures that are 1024x1024 or 512x512. Not on textures that are 256x256 or 128x128 already - especially intended for fragile & important features like the face. Surface Appearance related to a face should not downscale lower than 256x256, and the benefit of having a somewhat readable face, outweighs the downside of the small performance loss in my opinion.

The Bug:

I am going to reference a different makeup game for the bug I am reporting, since I could not actively reproduce the issue in our game, even though it clearly exists (as reported by our players). This game is owned by someone else - using similar tech.

game name: “Glow Up”.

What happened:

I joined the game on my Iphone 16 Pro Max. I have a good internet connection. The entire games textures looked downscaled like this for the entire session:

I did not experience any lag or performance issues, it simply happened.

I had to rejoin the game for the textures to look like this again:

It seems like the textures did not increase in quality even though my phone clearly allowed for it.

It is likely that texture streaming has something to do with this. Texture streaming rolled out on mobile December 12th.
Following December 12th, our game had its lowest retention day ever, at 2% D1 retention including a loss of players. We did not push an update at this time:

Postlude:

I have a few questions.

  1. What is the lowest a Surface Appearance gets downscaled to?
  2. Will making our makeup textures 512x512 prevent them to be downscaled this heavily, aside from the bug?
  3. Does this happen when your internet is bad, or is it related to memory? And does this always happen on low-end devices? If so, what devices in particular?
  4. Can we disable texture streaming?

Statement from the owner of Glow Up:

Expected behavior

What we expect to happen:

Most importantly:

  1. Textures getting rendered to their highest form when the device allows it
  2. Do not downscale 256x256 or 128x128 textures
  3. Let players pre-load Surface Appearance
  4. Set priorities for Surface Appearances - so developers can decide what textures are important to load and can not be sacrificed
  5. Let developers disable texture streaming

Why It Matters:

We love innovative APIs and want to continue using them. But for us to keep using this feature, it is important that textures on the face do not get downscaled using a Surface Appearance this heavily, in and outside the context of this bug. Considering the new platform makeup launch on Roblox in Q1, This is crucial for us & the platform to continue to thrive.

Thank you for your time.

  • Best,
    Henry :grinning_face:
1 Like

Hey Henry, this looks like a common texture streaming bug on mobile rather than an issue with how you authored the textures. Your 128×128 and 256×256 SurfaceAppearances are already in the range where aggressive downscaling should not destroy facial detail like this, especially on devices like iPhone 16 Pro Max with good network and no memory pressure.

What you’re seeing in “Glow Up” (entire session stuck at low‑mip, only fixed when you rejoin) strongly suggests to me that the streaming system never promotes those textures, even though the device can clearly handle it.

Heres a response to your questions:
“What is the lowest a SurfaceAppearance gets downscaled to?”

Roblox has not documented a fixed minimum mip or resolution per texture; the streaming system decides the mip level based on memory, distance, and device budgets, so faces can drop far below 128×128 in bad cases right now.

“Will making textures 512×512 prevent this?”

Increasing to 512×512 doesn’t guarantee a fix, streaming can still choose a very low mip so the final visible resolution can end up similar or worse, it just gives the engine more levels to choose from.

For now I’d keep facial textures small and sharp (like your current 256×256) and rely on Roblox to adjust streaming rather than up‑resing everything.

“Is this bad internet, memory, or only low‑end devices?”

Your iPhone 16 Pro Max with good network shows it’s not limited to bad internet or low‑end devices. I’d say it’s most likely a combination of the new mobile streaming behavior and how it prioritizes textures at join, kind of like a gamble.

Low‑end devices will hit this more often, but high‑end devices are clearly affected too, which matches the retention drop you saw starting right after mobile texture streaming rolled out.

”Can we disable texture streaming?”

You can’t globally disable texture streaming or explicitly pin specific SurfaceAppearances at full resolution, this would be internal to Roblox, not your developers specifically.

Here’s some things your team can try:

  • Prioritize avatar proximity and camera setup

Keep the camera close to the face when makeup is being edited so the engine treats those textures as high‑priority and is more likely to stream them at higher mips.

  • Force a “refresh” path in gameplay

Add an in‑game toggle (example: a “reload avatar” or “rejoin booth” button) that respawns the character or reloads the rig. In some cases this can cause the engine to reconsider streaming priorities without a full rejoin, this is not guaranteed though, but worth a shot

  • Reduce competing high‑res textures in the scene

Wherever possible lower resolution or simplify less important environment textures so the streaming budget is less contested and facial textures have a better chance to stay sharp.

It would be nice to have something from Roblox for a documented minimum resolution for SurfaceAppearances used on faces, a way to mark certain SurfaceAppearances as “high priority” or “pinned” for streaming, an option to disable or relax texture streaming for key characters, at least on capable devices. Especially in 2026 devices are evolving, and even older devices are capable

I hope this helps you and your team Henry,

Blixsmh

1 Like

Thanks for reporting this. The team is taking a look! I might DM you if we need more specific info / repro steps.