On iOS, we have a very simple way of detecting what hardware we’re running, and then disabling certain objects from rendering, or altering physics iterations, etc.
There’s hundreds of Android devices… Preferably, we would rather the end user didn’t have a say…
Now, I’ve done some rather subtle changes on the fly in the past where if the frame rate dropped below 30 for more than three seconds, I’d have the particle count, if it did it again, it would disable them entirely, but now i’m talking about things that can’t just subtly turn off (light shafts, shadows, particular shaders, etc).
Can you run a demo scene the first time the game is started, check the average frame rate, and set things accordingly? Something like this is the only real way to go, as figuring out real world performance by looking at device specs is complicated at best and impossible at worst.
we’ve gone for a toggle in options with low and high detail. I don’t think it needs more options than that, and high is on for everything we’ve got a profile for. low isn’t all that low, it just runs “ok” on 3GS, our base device. If a droid is slower than 3GS, it probably is fairly ancient.
So I guess, leave it up to user but default one or the other depending on what you’ve got a profile for.
Well lets face it.
Android has a lot of phones and you can target different ones.
Most of the time you can use android SDK API version to choose level.
Also there is a question what type on phone you want to support.
Many time I see developer try to support to many phones.
The result is often bad. Maybe its greed that is the main reason for it.
My View is to make the game and make it like you want it to look and what type of phone you want it for.
If you want to have good graphics you can easy target high end phones and use the API level for it.
Its not only the power of the phone thats problem. Also the screen size is also a problem.
Also to target low end phone is nothing I would do, if I want a good game.
On android we have over a 1m user install base, and we wish to add new features. It’s not usually wise to burn 900,000 users because you have decided you don’t like their phone.
I don’t have Unity 4 yet but it supposedly allows you to truly set resolution for ios, hopefully that works for android as well.
Halfing the resolution would only take 1/4th the gpu power. (you might not want to half it-- just ‘3/4th’ it.)
If you do any setResolution Unity tests on Android please let us know how it turns out! (I’m curious as well.)
Rendering at anything other than native res isn’t really an option either. We would get poor feedback about the game looking ‘soft’.
On iOS I change things like shaders, particle density, shadows, physics iterations and volume lights (basically just trying to avoid too much overdraw), so the frame rate is a relatively consistant 60fps across the board.
I think a slider is probably the best way forward for Android users.
I have tested SetResolution in 4 on a number of Android devices and it works as it should. As JT explains above, the image isn’t as clear as native mode. In fact, on one device I tested, it made some shading artifacts more noticeable. Also, rendering to a lower resolution then blitting the result to the screen has its own cost so it doesn’t really help on slower devices.
SetResolution is one option but it’s not a universal solution.
I agree with the slider option for graphics detail. There are just too many phones to come up with an automatic approach.
btw I think clock tests, speed tests etc etc are all pretty much doomed on a mobile which can be intercepted by calls, low batteries, cpus winding down in periods of low activity, power saving etc etc… doing a test like this isn’t very reliable on mobiles. It’s tricky enough on desktop.
Jamie, I think it might be heading that way for iOS as well considering that they’re mixing things up so much (ipad mini)… in a year it’ll be a bit of a mess to keep track of
It’s also a lack of user education. PC users are used to dabbling, and they know what ‘Anti Aliasing’ means, etc. This new generation of more-tech-savvy but less-tech-educated (that is, they use lots of equipment but have little to no understanding of how it works) will probably work best with a simple slider.
I’m just concerned with the visualisation of it. Setting the slider then jumping into the game with no realtime preview of your frame rate?
It wouldn’t be too hard to slide, then test, and just have a ‘worst case scenario’ running beside the slider, and then just showing the word ‘Optimal’ or ‘Poor’ performance word next to it (rather than showing them the current frame rate, interpret it for them).
With our next project we’re building everything to be very scalable in terms of quality because there now is such a wide disparity in processing power… People are still using their 3GS everyday, and then there’s people with a Galaxy Note 2… Still, an automated, instant, solution would be preferable
Screen.SetResolution has been supported on Android for several of the 3.x releases (don’t remember exactly when I added it, but I guess it was in 3.2 or 3.3 or something).
Obviously it will make the image look a bit ‘fuzzy’ - but for mega-resolution devices (like Nexus 10) it could still be an option.
It’s pretty much an instant-fix for fill-rate limited devices, which is why a bunch of us wanted it in unity. Ultimately having a list of devices to check for and tuning it for each is quite expensive and time consuming to do.