Example #1
0
        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);
        }