Is there a way to adjust quality dynamically based on performance?

Hi,

I want my application to adjust its quality based on its performance on the user’s device. For example, I want my textures to be high res at the beginning, but lower their res if it impacts the user’s performance. Even better - I would like to detect that the user is getting close to a noticeable performance decline and lower their res in time to prevent him from getting there to begin with.

If I understood correctly, browsers don’t allow me access to read the user’s GPU memory usage due to privacy considerations.

I know that I can measure FPS but I’m looking for another way.

Is the goal I’m aiming to achieve possible? If so, what it the best practice way to achieve it?

Thanks

If you’d like to optimise the app performance (not it’s general GPU usage) isn’t FPS exactly what you’re looking for though :thinking: (more precisely, average FPS) ?

Quite a bit of calculations is done on the CPU (render order, intersections, frustum visibility etc.) - optimising GPU usage exclusively seems like optimising the best performing component of the entire fps-affecting pipeline.

1 Like

But will the FPS necessarily drop when I load more and more textures and the user’s GPU memory is getting close to its limit and crashing? (sorry if that’s an obvious question, I’m quite new to this).

Afaik, the amount of textures you put on the GPU should not affect the FPS (it will at some point just crash the application - especially on mobile - unless you take care of disposing the unnecessary stuff.)

The resolution of textures put on the GPU will likely affect the performance. And that performance can be measured by looking at FPS.

1 Like

Yeah, I meant the total amount of texture memory, so mostly high res textures.

So dropping high res textures and swapping them with their low res version in case of a drop in average FPS is what I should do?

Over how long an interval should I average FPS? 5 seconds? 10?

EDIT:

Are the FPS affected by textures in memory even if they aren’t rendered to the screen? If the user is facing forward and there are high res textures behind him, for example, I keep them in memory because I want them to be available when he turns around. So these textures impact the performance even when he’s facing forward and these textures aren’t rendered?

Personally I wouldn’t - but if you’d like to do that in real-time, then I think yes (keep in mind user experience may be less than pleasing.)

I’d pick a longer interval - 10 or 30 seconds. FPS can randomly drop to very low values just because Three is compiling new materials or adding geometries to the scene - and this kind of drops are essentially outliers that have not much to do with the actual device performance.

Nope, at least to my knowledge, they don’t. Textures are just parts of materials, and materials are rendered only when they are visible on the screen.