Optimizing Games for Low-End Devices
One of the biggest challenges in mobile game development is having your game run great on a low-end device without compromising the experience on a high-end one. We tend to optimize and budget the best experience for our high-end devices. There are many good reasons for this: better monetization, better engagement, etc. Low-end devices seem to run away from us in scope and get poorly prioritized because of the focus on high-end devices. But they’re still important! According to a recent Mixpanel trend report, ~10% of iPhone users have an iPhone 5 or below.
Can we have older devices run the same graphics as new ones?
You simply can’t. Give your players a comparable experience across all devices. Allow them to accomplish the same core activities that your high-end users do. The experience may not be the same, but the core progression should be close.
Tips on Optimizing for Low-End Devices
- Think about low-end devices very early on in the project. Add checkpoints to test low-end devices at a frequency or feature check-in.
- Categorize your devices in buckets like Low, Medium, and High Quality. For example, the iPhone 6s is a High Quality device, the Samsung Galaxy 3 is low-end, etc. This list will continually fluctuate as new devices come online and technology advances. Some important things to keep in mind are device specs, chip sets, video memory, video cards, etc.
- Leverage the built-in Quality Settings in Unity. You can find it under Edit->Projects->Quality. Remember you can add/remove as many levels as you like. Customize it for your needs. I’d recommend going with three total: Low, Medium, and High. Unity has a bunch of controls you can tune per bucket. This is very helpful for a 3D game, but not so much on 2D.
- Deliver different assets based on the device quality. High-end devices get HD; low-end ones get standard. This will help with memory footprint and performance (better FPS and fewer low-memory crashes). You can leverage iOS’s app-thinning technology or Unity’s asset bundles for this as well.
- Run your game through different code paths based on the quality settings. For example, your dialogs may animate in/out when they dismiss. On low-end devices, you may want to disable the animations.
- Disable masks and alpha. They can put a heavy tax on your frames per second.
- Be prepared to make game-specific calls such as, "Which animations should I disable? What PFX should I enable/disable? Should I disable sound?"
- Lower concurrent HTTP connections for low-end devices. They usually have fewer CPU threads to work with. Also, make fewer HTTP connections in general, since they hurt your battery life.
- Create custom shaders for low-end devices. Limit extra passes and functionality. As an example, a low-end user can still function in your game without having an outline around him when selected.
- Use your game engine's profiler to find hot spots on performance. Make sure to run it on the low-end device.
Feel free to reach out to me by leaving a comment below -- I’d be more than happy to share any data or code snippets we have.