using System.Diagnostics; namespace LibMMD.Unity3D { /// Owns frame-budget accounting for incremental Unity object construction. internal sealed class MmdLoadTimeSlicer { private readonly long _budgetTicks; private long _sliceStarted; private bool _resumingAfterYield; internal MmdLoadTimeSlicer(MmdModelOptions options) { _budgetTicks = (long)(options.LoadingFrameBudgetMilliseconds * Stopwatch.Frequency / 1000d); _sliceStarted = Stopwatch.GetTimestamp(); } internal bool ShouldYield() { var now = Stopwatch.GetTimestamp(); if (_resumingAfterYield) { _resumingAfterYield = false; _sliceStarted = now; return false; } if (_budgetTicks > 0 && now - _sliceStarted < _budgetTicks) return false; _resumingAfterYield = true; return true; } } }