Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как лучше оптимизировать игру?

Вова Денисов Ученик (201), закрыт 2 недели назад
Недавно сделал смену дня и ночи в игре и заметил, что фпс нормально так просел. Вообщем скайбокс у меня Procedural, а изменение его типа например на Cubemap не даёт особого прироста фпс. Значит дело в скрипте изменения этого скайбокса, подумал я и решил отключить код на время, и фпс прирос на 80-100. Для сравнения, с отключённым сценарием у меня фпс 150-200, а с включённым в среднем 90-120, а иногда и до 60 проседает. Хочу спросить у знающих людей, можно ли что нибудь с этим сделать? Вот сам код

using UnityEngine;

public class DayCycleManager : MonoBehaviour
{
[Range(0, 1)]
public float TimeOfDay;
public float DayDuration = 30f;

public AnimationCurve SunCurve;
public AnimationCurve MoonCurve;
public AnimationCurve SkyboxCurve;

public Material DaySkybox;
public Material NightSkybox;

public ParticleSystem Stars;

public Light Sun;
public Light Moon;

private float sunIntensity;
private float moonIntensity;

private void Start()
{
sunIntensity = Sun.intensity;
moonIntensity = Moon.intensity;

}

private void Update()
{
TimeOfDay += Time.deltaTime / DayDuration;
if (TimeOfDay >= 1)
{
TimeOfDay -= 1;
}
// Настройки освещения (skybox и основное солнце)
if(TimeOfDay <= 0.5f)
{
Moon.intensity = 0f;

RenderSettings.sun = Sun;
Sun.intensity = sunIntensity * SunCurve.Evaluate(TimeOfDay);
}
else
{
Sun.intensity = 0f;
RenderSettings.sun = Moon;
Moon.intensity = moonIntensity * MoonCurve.Evaluate(TimeOfDay);
}
RenderSettings.skybox.Lerp(NightSkybox, DaySkybox, SkyboxCurve.Evaluate(TimeOfDay));
DynamicGI.UpdateEnvironment();

// Прозрачность звёзд
var mainModule = Stars.main;
mainModule.startColor = new Color(1, 1, 1, 1 - SkyboxCurve.Evaluate(TimeOfDay));

// Поворот луны и солнца
Sun.transform.localRotation = Quaternion.Euler(TimeOfDay * 360f, 180, 0);
Moon.transform.localRotation = Quaternion.Euler(TimeOfDay * 360f + 180f, 180, 0);
}
}
Дополнен 1 месяц назад
Возможно дело в том, что само изменение материала скайбокса сжирает производительность, и дело не в самом скрипте и если это так, то скажите мне об этом пожалуйста
Лучший ответ
Андрей Высший разум (460615) 1 месяц назад
Зачем ты вращаешь одновременно и Луну и Солнце? У тебя же виден только 1 объект. Перенеси вращения в тот самый if, в котором ты выставляешь Sun.intensity и Moon.intensity - Солнце в первую ветку, Луну во вторую.

Вот это вот: RenderSettings.skybox.Lerp(NightSkybox, DaySkybox, SkyboxCurve.Evaluate(TimeOfDay)); явно делает что-то лишнее, раз ты отправляешь туда и NightSkybox и DaySkybox. Почему бы не разделить на две подпрограммы: отдельно для дня и отдельно для ночи.

А лучше полностью разделить отрисовку дня и ночи. Так, чтобы любые манипуляции с Луной и ночными текстурами были только в ночное время, а любые манипуляции с Солнцем и дневными текстурами - только в дневное время.

P.S. Нет, я не специалист в Unity. Это очевидные предположения, вытекающие из вида твоего кода.
Вова ДенисовУченик (201) 1 месяц назад
RenderSettings.skybox.Lerp(NightSkybox, DaySkybox, SkyboxCurve.Evaluate(TimeOfDay)) - это для плавного изменения скайбокса дня и ночи, а отправляю я NightSkybox и DaySkybox, чтобы бралось среднее значение экспозиции относительно времени значения моей кривой на графике. Разделение у меня на день и ночь есть, и там просто изменяется яркость луны или солнца в зависимости от времени(ночь или день). Никаких манипуляций с текстурами у меня нет и по сути я лишь меняю один параметр скайбокса постоянно, чтобы переход происходил плавно, как в реальности. И код не мой, я лишь немножко адаптировал его под мою игру, но это неважно
Остальные ответы
Похожие вопросы