internal static unsafe string Invoke(IntPtr obj, FrameMetrics InFrameMetrics) { long *p = stackalloc long[] { 0L, 0L, 0L, 0L, 0L }; byte *b = (byte *)p; *((FrameMetrics *)(b + 0)) = InFrameMetrics; Main.GetProcessEvent(obj, GenerateFilename_ptr, new IntPtr(p));; return(FString.Get(b + 16)); } }
internal static unsafe void Invoke(IntPtr obj, CapturedPixels PixelData, Name StreamName, FrameMetrics FrameMetrics, bool bCopyImageData) { long *p = stackalloc long[] { 0L, 0L, 0L, 0L, 0L, 0L, 0L }; byte *b = (byte *)p; *((CapturedPixels *)(b + 0)) = PixelData; *((Name *)(b + 16)) = StreamName; *((FrameMetrics *)(b + 28)) = FrameMetrics; *((bool *)(b + 44)) = bCopyImageData; Main.GetProcessEvent(obj, WriteImageToDisk_ptr, new IntPtr(p));; } }
//private readonly int TotalDuration = (int)FrameMetricsId.TotalDuration; //public OnFrameMetricsAvailableListener(string activityName) //{ // _activityName = activityName; //} //public void Dispose() //{ //} //public IntPtr Handle { get; } public void OnFrameMetricsAvailable(Window window, FrameMetrics frameMetrics, int dropCountSinceLastInvocation) { //if (Looper.MainLooper == Looper.MyLooper()) //{ // Log.Error("THIS IS UI THREAD", "UI THREAD"); //} var frameMetricsCopy = new FrameMetrics(frameMetrics); //frameMetrics.GetMetric((int)FrameMetricsId.AnimationDuration); allFrames++; var totalDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.TotalDuration); var totalDurationMs = (float)(0.000001 * totalDuration); if (totalDurationMs > warningLevelMs) { jankyFrames++; //var msg = $"Janky frame detected on {_activityName} with total duration: {totalDurationMs}\n"; var d = new FrameMetricsData() { Offset = PTrackerTimeProvider.Source.Elapsed, FrameNumber = allFrames, TotalDuration = totalDuration, LayoutMeasureDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.LayoutMeasureDuration), DrawDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.DrawDuration), CommandIssueDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.CommandIssueDuration), JunkyFrameNumber = jankyFrames //AnimationDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.AnimationDuration), //FirstDrawFrame = frameMetricsCopy.GetMetric((int)FrameMetricsId.FirstDrawFrame), //InputHandlingDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.InputHandlingDuration), //IntendedVsyncTimestamp = frameMetricsCopy.GetMetric((int)FrameMetricsId.IntendedVsyncTimestamp), //SwapBuffersDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.SwapBuffersDuration), //SyncDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.SyncDuration), //UnknownDelayDuration = frameMetricsCopy.GetMetric((int)FrameMetricsId.UnknownDelayDuration), //VsyncTimestamp = frameMetricsCopy.GetMetric((int)FrameMetricsId.VsyncTimestamp), }; _renderingMetricsRecorder.PushNewFrame(d); //float layoutMeasureDurationMs = (float)(0.000001 * frameMetricsCopy.GetMetric((int)FrameMetricsId.LayoutMeasureDuration)); //float drawDurationMs = (float)(0.000001 * frameMetricsCopy.GetMetric((int)FrameMetricsId.DrawDuration)); //float gpuCommandMs = (float)(0.000001 * frameMetricsCopy.GetMetric((int)FrameMetricsId.CommandIssueDuration)); //float othersMs = totalDurationMs - layoutMeasureDurationMs - drawDurationMs - gpuCommandMs; //float jankyPercent = (float)jankyFrames / allFrames * 100; //msg += $"Layout/measure: {layoutMeasureDurationMs}ms, draw:{drawDurationMs}ms, gpuCommand:{gpuCommandMs}ms others:{othersMs}ms\n"; //msg += "Janky frames: " + jankyFrames + "/" + allFrames + "(" + jankyPercent + "%)"; //if (showWarning && totalDurationMs > errorLevelMs) //{ // Log.Error("FrameMetricsDataData", msg); //} //else if (showError) //{ // Log.Warn("FrameMetricsDataData", msg); //} //var d = new FrameMetricsData() //{ // FrameNumber = allFrames, // LayoutMeasureDuration = layoutMeasureDurationMs, // DrawDuration = drawDurationMs, // CommandIssueDuration = gpuCommandMs, //}; } }