protected void Update() { if (Time.fixedTime < _startTime) { return; } int sampleCount = Mathf.CeilToInt(Mathf.Min(targetSamplesPerSecond * Time.deltaTime * _throttleFactor, Mathf.Exp(speedupRate * (Time.time - _startTime)) * Time.deltaTime)); var stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); for (int i = 0; i < sampleCount; ++i) { var sample = _sampleGenerator.Next(); if (float.IsNaN(sample)) { continue; } var index = Mathf.RoundToInt(Mathf.Clamp(sample * _scale + _offset, -1f, _samples.Length)); if (index >= 0 && index < _samples.Length) { _samples[index] += 1; } } stopwatch.Stop(); float elapsedTime = (float)((double)stopwatch.ElapsedTicks / System.Diagnostics.Stopwatch.Frequency); if (elapsedTime > maxFrameTime) { _throttleFactor = Mathf.Max(0.000001f, _throttleFactor * maxFrameTime * 0.99f / Mathf.Max(0.001f, elapsedTime)); } else if (_throttleFactor < 1f) { _throttleFactor = Mathf.Min(_throttleFactor * 1.01f, 1f); } int maxSampleCount = minSampleScale; for (int i = 0; i < _samples.Length; ++i) { maxSampleCount = Mathf.Max(maxSampleCount, _samples[i]); } for (int x = 0; x < _texture.width; ++x) { _pixels[x] = _pixels[x + _texture.width] = new Color(_samples[x] / (float)maxSampleCount, 0f, 0f, 1f); } _texture.SetPixels(_pixels); _texture.Apply(false, false); _totalSampleCount += sampleCount; _totalTimeMicroseconds += Mathf.FloorToInt(elapsedTime * 1000000f); double totalSamplesPerSecond = _totalSampleCount / (_totalTimeMicroseconds / 10000000d); samplesPerSecondLabel.text = string.Format("samples/s: {0:N0}", totalSamplesPerSecond); }