public static void PullDataStatic(ref FileAccessCaptureData captureData, Dictionary <string, FileAccessMarkerInfo> markers, ref Dictionary <string, int> markerToIDMap, int firstFrameIndex, int lastFrameIndex) { string error = null; captureData.m_FileAccessData.Clear(); captureData.m_StartTimeNs = ulong.MaxValue; captureData.m_EndTimeNs = ulong.MinValue; ProfilerFrameDataIterator frameIter = new ProfilerFrameDataIterator(); double nsFrameStart; for (int frameIndex = firstFrameIndex; frameIndex <= lastFrameIndex; ++frameIndex) { frameIter.SetRoot(frameIndex, 0); int threadCount = frameIter.GetThreadCount(frameIndex); // iterate over the threads for (int threadIndex = 0; threadIndex < threadCount; ++threadIndex) { using (RawFrameDataView frameData = ProfilerDriver.GetRawFrameDataView(frameIndex, threadIndex)) { if (!frameData.valid) { break; } nsFrameStart = frameData.frameStartTimeNs; if (frameIndex == firstFrameIndex) { if (captureData.m_StartTimeNs > nsFrameStart) { captureData.m_StartTimeNs = nsFrameStart; } } GetMarkerIDs(frameData, markers, ref markerToIDMap); string fullThreadName = GetFullThreadName(frameData.threadGroupName, frameData.threadName); // iterate over the samples to collect up any markers int sampleCount = frameData.sampleCount; for (int i = 0; i < sampleCount; ++i) { s_CheckSamples.Begin(); int markerId = frameData.GetSampleMarkerId(i); if (markerId == FrameDataView.invalidMarkerId || !markerToIDMap.ContainsValue(markerId)) { s_CheckSamples.End(); continue; } string markerName = frameData.GetMarkerName(markerId); Assert.IsTrue(markers.ContainsKey(markerName), string.Format("Marker {0} is not present in requested markers.", markerName)); s_CheckSamples.End(); s_AddNewMarker.Begin(); ulong markerStartTimeNs = Math.Max(frameData.GetSampleStartTimeNs(i) - (ulong)captureData.m_StartTimeNs, 0); ulong sampleLengthNs = frameData.GetSampleTimeNs(i); // if the marker isn't a continuation of a previous marker, add a new access if (!CheckForContinuationMarker(frameData, ref captureData, threadIndex, markerId, frameIndex, i, markerStartTimeNs, sampleLengthNs)) { FileAccessMarker fileAccessMarker = new FileAccessMarker(frameIndex, threadIndex, i); // fill in contexts from Metadata FileAccessMarkerInfo markerInfo = markers[markerName]; if (markerInfo.metadataCount == frameData.GetSampleMetadataCount(i)) { markerInfo.metaDataFiller(ref fileAccessMarker, frameData, i); } else if (error == null) // Check the error is only shown once { error = $"Some markers, such as '{markerName}', have unexpected metadata. This may be because of opening a profile captured with an older version of Unity. Certain values may be missing."; Debug.LogWarning(error); } if (string.IsNullOrEmpty(fileAccessMarker.filename)) { fileAccessMarker.readablePath = "Unknown path"; fileAccessMarker.readableFileName = "?"; } else { fileAccessMarker.readablePath = fileAccessMarker.filename; fileAccessMarker.readableFileName = Path.GetFileName(fileAccessMarker.readablePath); if (fileAccessMarker.readablePath.Contains("/Analytics/")) { fileAccessMarker.readableFileName += " (Analytics)"; } } fileAccessMarker.startNs = markerStartTimeNs; fileAccessMarker.lengthNs = sampleLengthNs; fileAccessMarker.endNs = markerStartTimeNs + sampleLengthNs; fileAccessMarker.startTimeMs = markerStartTimeNs * 0.000001; fileAccessMarker.ms = fileAccessMarker.lengthNs * 0.000001; fileAccessMarker.markerId = markerId; fileAccessMarker.type = markerInfo.fileAccessType; fileAccessMarker.markerName = markerName; fileAccessMarker.threadName = fullThreadName; fileAccessMarker.threadId = frameData.threadId; captureData.m_FileAccessData.Add(fileAccessMarker); } s_AddNewMarker.End(); } } } } foreach (var fileAccessMarker in captureData.m_FileAccessData) { fileAccessMarker.averageBandwidthMBps = (fileAccessMarker.ms > 0) ? ((float)fileAccessMarker.sizeBytes / (float)fileAccessMarker.ms) * 0.001f : 0.0f; } frameIter.Dispose(); }
public static void PullDataStatic(ref AssetCaptureData captureData, Dictionary <string, AssetMarkerInfo> markers, ref Dictionary <string, int> markerToIDMap, int firstFrameIndex, int lastFrameIndex) { string error = null; var depthStack = new Stack <int>(); captureData.m_AssetLoadMarkers.Clear(); captureData.m_StartTimeNs = ulong.MaxValue; captureData.m_EndTimeNs = ulong.MinValue; ProfilerFrameDataIterator frameIter = new ProfilerFrameDataIterator(); double nsFrameStart; for (int frameIndex = firstFrameIndex; frameIndex <= lastFrameIndex; ++frameIndex) { frameIter.SetRoot(frameIndex, 0); int threadCount = frameIter.GetThreadCount(frameIndex); // iterate over the threads for (int threadIndex = 0; threadIndex < threadCount; ++threadIndex) { using (RawFrameDataView frameData = ProfilerDriver.GetRawFrameDataView(frameIndex, threadIndex)) { if (!frameData.valid) { break; } string fullThreadName = GetFullThreadName(frameData.threadGroupName, frameData.threadName); nsFrameStart = frameData.frameStartTimeNs; if (frameIndex == firstFrameIndex) // This may only need to be done for the main thread, but does the main thread have a guaranteed index? { if (captureData.m_StartTimeNs > nsFrameStart) { captureData.m_StartTimeNs = nsFrameStart; // We will assume that this will only be true for the first frame and thus not be changed, and proceed to use this value as the start time } } GetMarkerIDs(frameData, markers, ref markerToIDMap); depthStack.Clear(); // iterate over the samples to collect up any markers int sampleCount = frameData.sampleCount; for (int i = 0; i < sampleCount; ++i) { int markerId = frameData.GetSampleMarkerId(i); if (markerId != FrameDataView.invalidMarkerId && markerToIDMap.ContainsValue(markerId)) { s_AddNewMarker.Begin(); string markerName = frameData.GetMarkerName(markerId); Assert.IsTrue(markers.ContainsKey(markerName), string.Format("Marker {0} is not present in requested markers.", markerName)); // if the marker isn't a continuation of a previous marker, add a new asset load marker if (!CheckForContinuationMarker(frameData, ref captureData, threadIndex, markerId, frameIndex, i)) { AssetLoadMarker assetLoadMarker = new AssetLoadMarker(); // fill in contexts from Metadata AssetMarkerInfo markerInfo = markers[markerName]; if (markerInfo.metadataCount == frameData.GetSampleMetadataCount(i)) { markerInfo.metaDataFiller(ref assetLoadMarker, frameData, i); } else if (string.IsNullOrEmpty(error)) // Check the error is only shown once { error = $"Some markers, such as '{markerName}', have unexpected metadata. This may be because of opening a profile captured with an older version of Unity. Certain values may be missing."; Debug.LogWarning(error); } ulong markerStartTimeNs = frameData.GetSampleStartTimeNs(i); ulong sampleLengthNs = frameData.GetSampleTimeNs(i); assetLoadMarker.markerId = markerId; if (string.IsNullOrEmpty(assetLoadMarker.filename)) { assetLoadMarker.readablePath = "Unknown path"; assetLoadMarker.readableFileName = "?"; } else { assetLoadMarker.readablePath = assetLoadMarker.filename; assetLoadMarker.readableFileName = Path.GetFileName(assetLoadMarker.readablePath); if (assetLoadMarker.readablePath.Contains("/Analytics/")) { assetLoadMarker.readableFileName += " (Analytics)"; } } assetLoadMarker.startNs = markerStartTimeNs; assetLoadMarker.lengthNs = sampleLengthNs; assetLoadMarker.endNs = markerStartTimeNs + sampleLengthNs; assetLoadMarker.startTimeMs = (markerStartTimeNs - captureData.m_StartTimeNs) * 0.000001; // could this go negative? assetLoadMarker.ms = assetLoadMarker.lengthNs * 0.000001; assetLoadMarker.frameCount = 1; assetLoadMarker.type = markerInfo.assetMarkerType; assetLoadMarker.markerName = markerName; assetLoadMarker.threadName = fullThreadName; assetLoadMarker.firstFrameIndex = frameIndex; assetLoadMarker.lastFrameIndex = frameIndex; assetLoadMarker.threadIndex = threadIndex; assetLoadMarker.threadId = frameData.threadId; assetLoadMarker.sampleIds.Add(i); assetLoadMarker.depth = 1 + depthStack.Count; captureData.m_AssetLoadMarkers.Add(assetLoadMarker); } s_AddNewMarker.End(); } UpdateDepthStack(ref depthStack, frameData.GetSampleChildrenCount(i)); } } } } frameIter.Dispose(); }