public void ProcessRecording()
        {
            if (!m_recording)
            {
                return;
            }

            float begin_time = Time.realtimeSinceStartup;

            m_ctx.MarkFrameBegin();
            m_ctx.AddTime(m_time);
            foreach (var recorder in m_capturers)
            {
                recorder.Capture();
            }
            m_ctx.MarkFrameEnd();

            m_time += Time.deltaTime;
            ++m_frameCount;

            m_elapsed = Time.realtimeSinceStartup - begin_time;
            if (m_settings.detailedLog)
            {
                Debug.Log("AlembicRecorder: frame " + m_frameCount + " (" + (m_elapsed * 1000.0f) + " ms)");
            }
        }
        void ProcessCapture()
        {
            if (!m_recording || Time.frameCount == m_prevFrame)
            {
                return;
            }
            m_prevFrame = Time.frameCount;
            if (m_captureOnStart && m_ignoreFirstFrame && m_firstFrame)
            {
                m_firstFrame = false;
                return;
            }

            float begin_time = Time.realtimeSinceStartup;

            m_ctx.MarkFrameBegin();
            m_ctx.AddTime(m_time);
            foreach (var recorder in m_capturers)
            {
                recorder.Capture();
            }
            m_ctx.MarkFrameEnd();
            m_time += Time.deltaTime;
            ++m_frameCount;

            m_elapsed = Time.realtimeSinceStartup - begin_time;
            if (m_detailedLog)
            {
                Debug.Log("AlembicExporter: frame " + m_frameCount + " (" + (m_elapsed * 1000.0f) + " ms)");
            }

            if (m_maxCaptureFrame > 0 && m_frameCount >= m_maxCaptureFrame)
            {
                EndCapture();
            }
        }
        public void ProcessRecording()
        {
            if (!m_recording)
            {
                return;
            }

            float begin_time = Time.realtimeSinceStartup;

            // check if there are new GameObjects to capture
            UpdateCaptureNodes();
            if (m_frameCount > 0 && m_newNodes.Count > 0)
            {
                // add invisible sample
                m_ctx.MarkFrameBegin();
                foreach (var node in m_newNodes)
                {
                    node.MarkForceInvisible();
                    node.Capture();
                }
                m_ctx.MarkFrameEnd();
            }
            m_newNodes.Clear();

            // do capture
            m_ctx.MarkFrameBegin();
            m_ctx.AddTime(m_time);
            foreach (var kvp in m_nodes)
            {
                var node = kvp.Value;
                node.Capture();
                if (node.transform == null)
                {
                    m_iidToRemove.Add(node.instanceID);
                }
            }
            m_ctx.MarkFrameEnd();

            // remove deleted GameObjects
            foreach (int iid in m_iidToRemove)
            {
                m_nodes.Remove(iid);
            }
            m_iidToRemove.Clear();

            // advance time
            ++m_frameCount;
            m_timePrev = m_time;
            switch (m_settings.conf.timeSamplingType)
            {
            case aeTimeSamplingType.Uniform:
                m_time = (1.0f / m_settings.conf.frameRate) * m_frameCount;
                break;

            case aeTimeSamplingType.Acyclic:
                m_time += Time.deltaTime;
                break;
            }
            m_elapsed = Time.realtimeSinceStartup - begin_time;

            // wait maximumDeltaTime if timeSamplingType is uniform
            if (m_settings.conf.timeSamplingType == aeTimeSamplingType.Uniform && m_settings.fixDeltaTime)
            {
                AbcAPI.aeWaitMaxDeltaTime();
            }

            if (m_settings.detailedLog)
            {
                Debug.Log("AlembicRecorder: frame " + m_frameCount + " (" + (m_elapsed * 1000.0f) + " ms)");
            }
        }