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));;
            }
        }
Beispiel #3
0
            //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,

                    //};
                }
            }