BRO_TIGER
@BRO_TIGER
Indie Developer (C#, JS)

Причуды Unity3D или GFX.WaitForPresent?

Доброго времени суток Тостер! Задался вопросом об оптимизации своего проекта и проверки скриптов, тестировалось всё на Пеньке (Pentium CPU B970 2.30 GHz) в разрешении 800x450 (Не лучшее железо для теста) И при проверке заметил интересную штуку gfx.waitforpersent, связанное с Рендерингом... Ещё я не давно сделал скрипт на волны (Поймете дальше зачем я рассказал про этот скрипт), но из-за gfx 45 FPS и просадки до 30 FPS...

Отключил VSync, думал что всё пропадёт... gfx пропал но на смену ему пришёл мой скрипт из-за которого начались те же просадки только я не понял почему он занимает в Обновлении столько процентов если пересчитывание вертикалей равен 2.8%...

Скрин:
c4034cf75e7040368aeb413192f0405b.png

Отключил скрипт и опять gfx.waitforpresent, но оптимизация появилась 70 FPS при выключенном VSync и Скрипте...

Скрин;
32ac89231738473c8a9236c7008aed32.png

Скрипт:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using ArchimedsLab;

public class Waves : MonoBehaviour
{

    public float waveHeight = 10.0f;
    public float speed = 1.0f;
    public float waveLength = 1.0f;
    public float noiseStrength = 4.0f;
    public float noiseWalk = 1.0f;
    public float randomHeight = 0.2f;
    public float randomSpeed = 5.0f;
    public float noiseOffset = 20.0f;


    private Vector3[] baseHeight;
    private Vector3[] vertices;
    private List<float> perVertexRandoms = new List<float>();
    private Mesh mesh;


    void Awake()
    {
        mesh = GetComponent<MeshFilter>().mesh;
        if (baseHeight == null)
        {
            baseHeight = mesh.vertices;
        }

        for (int i = 0; i < baseHeight.Length; i++)
        {
            perVertexRandoms.Add(Random.value * randomHeight);
        }
    }

    void Update()
    {
        if (vertices == null)
        {
            vertices = new Vector3[baseHeight.Length];
        }

        for (int i = 0; i < vertices.Length; i++)
        {
            Vector3 vertex = baseHeight[i];
            Random.seed = (int)((vertex.x + noiseOffset) * (vertex.x + noiseOffset) + (vertex.y + noiseOffset) * (vertex.y + noiseOffset));
            vertex.z += Mathf.Sin(Time.time * speed + baseHeight[i].x * waveLength + baseHeight[i].z * waveLength) * waveHeight;
            vertex.z += Mathf.Sin(Mathf.Cos(Random.value * 1.0f) * randomHeight * Mathf.Cos(Time.time * randomSpeed * Mathf.Sin(Random.value * 1.0f)));
            vertex.z += Mathf.PerlinNoise(baseHeight[i].x + Mathf.Cos(Time.time * 0.1f) + noiseWalk, baseHeight[i].z + Mathf.Sin(Time.time * 0.1f)) * noiseStrength;
            vertices[i] = vertex;
        }
        mesh.vertices = vertices;
        mesh.RecalculateNormals();
    }
}


Баг или Фича? Что делать не знаю, впервые с оптимизацией сталкиваюсь)
Заранее Спасибо!
  • Вопрос задан
  • 2565 просмотров
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
gfx.waitforpersent - и подобные вызовы в профаилере всего лишь указывают, что проц или видео ожидают видео или проц (соответственно).
Тоесть что-то является узким местом и не дает на полную работать.
В Вашем случае видимо видеокарточка успевала бы быстрее отрисовывать, но проц чем-то занят и не отдает так часто на отрисовку данные. Выключив скрипт с волнами - сняли вычисления с проца видимо..и стало больше кадров.
Ну и тут как бы очевидно что вычислений у вас в Апдеите - многовато. столько умножений.. и каждый кадр. и на каждую вершину меша, небось и не самого простого..
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы