#c# #unity3d #coroutine
Вопрос:
Я работаю над копией кликера для файлов cookie.
Что происходит, так это то, что я использую a yield return new WaitForSeconds (0.1f)
для добавления файлов cookie в секунду в счетчик файлов cookie, и я хочу, чтобы они складывались быстро, а не секунда в секунду.
Проблема в том, что когда я запускаю его на своем компьютере, он работает идеально, но когда я запускаю его на своем Android, он медленно добавляет файлы cookie на счетчик.
Согласно моим небольшим знаниям, я бы сказал, что это связано с FPS. Я пытался использовать (Time.deltaTime * 0.1f)
, внутри WaitForSeconds
, но он все еще медленно работает в Android. Также пробовал использовать этот Invoke()
метод, но он тоже работает медленно.
(У меня есть StartCoroutine
внутренний Update
метод.) (Когда я ставлю 1 секунду вместо 0,1 f, это работает нормально, но выглядит не очень хорошо с точки зрения внешнего вида.)
IEnumerator Rps()
{
Stats.CookiesTotal = Stats.CookiesTotal Stats.cookiesPerSecond;
yield return new WaitForSeconds(Time.deltaTime * 0.1f);
yield return null;
}
private void Update()
{
StartCoroutine(Rps());
openSlot(price1text, price1, slot1);
openSlot(price2text, price2, slot2);
openSlot(price3text, price3, slot3);
}
Комментарии:
1. Вы запускаете сопрограмму в обновлении. Это может плохо кончиться. Вам нужно выполнить отладку и показать его и свой код.
2. я застрял на этом некоторое время, я также пытался включить сопрограмму в метод запуска, но мне нужно добавлять файлы cookie каждую секунду, и для этого я также некоторое время пробовал внутри IEnumerator, но ничего не работает должным образом
3. Вы не читали, как большинство из этого работает, не так ли? Поместите петлю в сопрограмму и запустите ее с самого начала. И отказаться от дополнительного урожая
4. Не используйте сопрограммы, так как они учат плохим привычкам с точки зрения разработчика c# и, скорее всего, приведут к линчеванию на обычной работе c#
Ответ №1:
Вы вызываете сопрограмму, от Update()
которой зависит частота кадров. Таким образом, на машине с частотой 60 кадров в секунду он будет работать Rps()
60 раз, в то время как на машине с частотой 30 кадров в секунду он будет работать Rps()
30 раз. Таким образом, более быстрая машина fps будет быстрее генерировать файлы cookie. Также обратите внимание, что WaitForSeconds
это происходит после того, как вы увеличили количество файлов cookie, что означает, что это вообще ничего не задерживает, поэтому, по сути, этот код такой же, как:
private void Update()
{
Stats.CookiesTotal = Stats.CookiesTotal Stats.cookiesPerSecond;
//...
}
Как предположили другие, использование сопрограмм таким образом Update()
не является идеальным. Можно добиться постоянного увеличения количества файлов cookie каждые 0,1 с, запустив сопрограмму Start()
и имея бесконечный цикл внутри сопрограммы, который увеличивает количество файлов cookie и ожидает X раз. Вам нужно будет очень внимательно относиться к управлению этой сопрограммой бесконечного цикла.
(Этот код не тестируется, но должен дать вам общее представление)
private IEnumerator countCookiesCoroutine;
IEnumerator Rps()
{
while (true){
Stats.CookiesTotal = Stats.CookiesTotal Stats.cookiesPerSecond;
yield return new WaitForSeconds(0.1f);
}
}
private void Start()
{
countCookiesCoroutine = Rps();
StartCoroutine(countCookiesCoroutine);
}
Более простым подходом, особенно если вы работаете с большим количеством файлов cookie и точность не важна, может быть увеличение количества файлов cookie на FixedUpdate()
основе временного шага физики, например:
private void FixedUpdate(){
Stats.CookiesTotal = Stats.CookiesTotal (Stats.cookiesPerSecond * Time.fixedDeltaTime);
}
Это позволит увеличить скорость файлов cookie так же плавно, как обновления физики и независимо от частоты кадров. Причина, по которой я использовал FixedTime()
, а не Update()
потому Update()
, что зависит от частоты кадров, и даже на Time.deltaTime
более быстрых машинах файлы cookie будут собираться быстрее из-за того, что более высокий процент сложных файлов cookie рассчитывается чаще, чем на более медленных машинах с частотой кадров в секунду.
Вам также может потребоваться обернуть отображение номеров файлов cookie в a Mathf.Floor()
, если отображение десятичных знаков нежелательно.
Комментарии:
1. Чувак, ты на самом деле спас меня, FixedUpdate() был решением, что странно, потому что я уже пробовал это раньше, но теперь это работает.