Just like on PCs, mobile platforms like iOS and Android have devices of various levels of performance. You can easily find a phone that’s 10x more powerful for rendering than some other phone. Quite easy way of scaling:
Графическая производительность связана с филлрейтом, пиксельной и геометрической сложностью (количеством вершин). Их можно уменьшить. Здесь может помочь Occlusion culling, т.к. Unity не будет отображать объекты, не входящие в область обзора.
На мобильных, по сути, связь скорости заполнения (скорость заполнения = пиксели экрана * сложность шейдера * овердрафт) и более сложных шейдеров является наиболее распространенной причиной проблем. Поэтому рекомендуется использовать мобильные шейдеры, поставляемые с Unity или писать свои, как можно более простые. Если это возможно, заменяйте пиксельные шейдеры на вершинные.
Если уменьшение качества текстур в настройках качества сделает игру быстрее, то у вас, возможно, ограничена пропускная способность памяти. Поэтому используйте компрессию текстур, мипмапы, уменьшайте размер текстуры и т.д.
LOD (Level of Detail) - make objects simpler or eliminate them completely as they move further away.
Мобильные графические процессоры имеют огромные трудности в том, как много тепла они производят, сколько энергии они потребляют, насколько большие или шумные они могут быть. Так, по сравнению с настольными, мобильные графические процессоры имеют меньшую пропускную способность, низкую ALU производительность и производительность текстур. Архитектуры графических процессоров также настроены под использование низкой пропускной способности и производительности.
Unity оптимизирован под OpenGL ES 2.0, используется шейдерный язык GLSL ES(схожий с HLSL). Чаще всего шейдеры пишутся в HLSL (известен также как Cg). Это перекрестие, сделанное в GLSL ES для мобильных платформ. Также вы можете писать на GLSL, если хотите, но при этом придерживайтесь OpenGL платформ (mobile + Mac). При использовании float/half/fixed типов в HLSL, они в конечном итоге будут highp/mediump/lowp точными определителями в GLSL ES.
Вот контрольный список для хороший практики:
void Update (){
// flip between meshes
bufferMesh = on ? meshA : meshB;
on = !on;
bufferMesh.vertices = vertices; // modification to mesh
meshFilter.sharedMesh = bufferMesh;
}
Проверка границ филлрейта (fillrate) проста: если вы уменьшите разрешение, игра будет идти быстрее? Если да, то ваш филлрейт ограничен.
Попробуйте уменьшить сложность шейдеров с помощью следующих методов:
Часто бывает, что обработка пикселей в игре ограничивается процессором. Таким образом, в конечном итоге остаются неиспользуемые мощности, особенно на многоядерных процессорах. Таким образом, часто целесообразно перекладывать следующие функции с GPU на CPU (Unity их поддерживает): mesh skinning, батчинг маленьких объектов, обновления геометрии частиц.
Это следует делать с осторожностью. Если вы не связаны по графическим вызовам (draw calls), то батчинг на самом деле помешает производительности. Он сделает culling менее эффективным и сделает многие объекты зависимыми от освещения.
Физика может сильно нагрузить процессор. Можно проследить это с помощью профайлера редактора. Если физика сильно нагружает процессор:
These are the popular mobile architectures. This is both different hardware vendors than in PC/console space, and very different GPU architectures than the “usual” GPUs.
Потратьте некоторое время на рассмотрение различных подходов к рендерингу и спроектируйте свою игру соответственно. Заострите внимание на сортировке. Определите самые низкие из поддерживаемых девайсов в начале разработки. Протестируйте на них с профайлером свою игру.
Используйте специфичное для платформы сжатие текстур.
Only PowerVR architecture (tile based deferred) to be concerned about.
Это означает:
И минусы:
Загрузки реализованы через асинхронный API, представленный ОС, потому что ОС решает как много потоков нужно для создания загрузки. При одновременном запуске нескольких загрузок, нужно учесть общую пропускную способность устройства, которую он может поддерживать и объем свободной памяти. Каждая параллельная загрузка выделяет отдельный временный буфер, поэтому нужно убедится что хватит оперативной памяти.
Иногда ничего нет в консоли, просто случайный сбой