diff --git a/app/android/java/com/khronos/vulkan_samples/FaceLandmarkerHelper.kt b/app/android/java/com/khronos/vulkan_samples/FaceLandmarkerHelper.kt index 3f359c7..ca6f9f4 100644 --- a/app/android/java/com/khronos/vulkan_samples/FaceLandmarkerHelper.kt +++ b/app/android/java/com/khronos/vulkan_samples/FaceLandmarkerHelper.kt @@ -104,7 +104,8 @@ class FaceLandmarkerHelper( .setMinTrackingConfidence(minFaceTrackingConfidence) .setMinFacePresenceConfidence(minFacePresenceConfidence) .setNumFaces(maxNumFaces) - .setOutputFaceBlendshapes(true) + .setOutputFaceBlendshapes(false) + .setOutputFacialTransformationMatrixes(false) .setRunningMode(runningMode) // The ResultListener and ErrorListener only use for LIVE_STREAM mode. @@ -270,7 +271,7 @@ class FaceLandmarkerHelper( val detectionLatency = resultTime - timings.detectionStartTime val captureToDetectionLatency = timings.detectionStartTime - timings.captureTime - Log.d("TimeLatency", + Log.i("TimeLatency", "总延时: ${totalLatency}ms | " + "预处理: ${preprocessLatency}ms | " + "检测: ${detectionLatency}ms | " + @@ -291,6 +292,9 @@ class FaceLandmarkerHelper( } else { val finishTimeMs = SystemClock.uptimeMillis() val inferenceTime = finishTimeMs - result.timestampMs() + Log.i("TimeLatency", + "总延时: ${inferenceTime}ms | " + ) faceLandmarkerHelperListener?.onResults( ResultBundle( result, diff --git a/app/android/java/com/khronos/vulkan_samples/MainActivity.java b/app/android/java/com/khronos/vulkan_samples/MainActivity.java index e466314..c495838 100644 --- a/app/android/java/com/khronos/vulkan_samples/MainActivity.java +++ b/app/android/java/com/khronos/vulkan_samples/MainActivity.java @@ -37,6 +37,7 @@ import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; public class MainActivity extends GameActivity implements FaceLandmarkerHelper.LandmarkerListener, CameraDataFetcher.CameraDataCallback { private ProcessCameraProvider cameraProvider; @@ -179,19 +180,45 @@ public class MainActivity extends GameActivity implements FaceLandmarkerHelper.L imageAnalyzer.setAnalyzer(backgroundExecutor, new ImageAnalysis.Analyzer() { + private long lastCaptureTime = 0; + private int frameCount = 0; @Override public void analyze(@NonNull ImageProxy image) { + frameCount++; + long currentTime = System.currentTimeMillis(); try { - long analyzeTime = SystemClock.elapsedRealtimeNanos(); - long captureTime = image.getImageInfo().getTimestamp(); - long latencyNs = analyzeTime - captureTime; - double latencyMs = latencyNs / 1_000_000.0; + long captureTimeNs = image.getImageInfo().getTimestamp(); + long analyzeTime = System.currentTimeMillis(); + + // 简单直接的计算方法 + long captureTimeMs = TimeUnit.NANOSECONDS.toMillis(captureTimeNs); + long latency = analyzeTime - captureTimeMs; + + // 帧率计算 + if (lastCaptureTime > 0) { + long frameInterval = captureTimeMs - lastCaptureTime; + double fps = 1000.0 / frameInterval; + + if (frameCount % 10 == 0) { // 每30帧打印一次 + Log.i("TimeLatency", String.format( + "Frame %d - Latency: %d ms, FPS: %.1f", + frameCount, latency, fps + )); + } + } + + lastCaptureTime = captureTimeMs; - Log.d("CameraLatency", String.format("Image capture to analyze latency: %.2f ms", latencyMs)); - //Log.d("Camera", "Received image: " + image.getWidth() + "x" + image.getHeight()); processImageForVulkan(image); - detectFace(image); + if(frameCount %2 == 0) + { + detectFace(image); + } + else + { + image.close(); + } } finally { //image.close(); // 确保在这里关闭 //Log.d("Camera", "Image closed, ready for next frame");