From 4b018be78907eec4d85e24e64402e1fbb5860aea Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Thu, 17 Feb 2022 20:08:41 +0100 Subject: [PATCH] Add --print-fps to enable FPS counter on start The FPS counter could be enabled/disabled via MOD+i. Add a command line option to enable it on start. This is consistent with other features like --turn-screen-off or --fullscreen. Fixes #468 PR #3030 --- README.md | 9 +++++++++ app/scrcpy.1 | 4 ++++ app/src/cli.c | 10 ++++++++++ app/src/options.c | 1 + app/src/options.h | 1 + app/src/scrcpy.c | 1 + app/src/screen.c | 5 +++++ app/src/screen.h | 2 ++ 8 files changed, 33 insertions(+) diff --git a/README.md b/README.md index dbbc4d71..1139092f 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,15 @@ scrcpy --max-fps 15 This is officially supported since Android 10, but may work on earlier versions. +The actual capture framerate may be printed to the console: + +``` +scrcpy --print-fps +``` + +It may also be enabled or disabled at any time with MOD+i. + + #### Crop The device screen may be cropped to mirror only part of the screen. diff --git a/app/scrcpy.1 b/app/scrcpy.1 index 13a9a97a..62cfe004 100644 --- a/app/scrcpy.1 +++ b/app/scrcpy.1 @@ -211,6 +211,10 @@ Inject alpha characters and space as text events instead of key events. This avoids issues when combining multiple keys to enter special characters, but breaks the expected behavior of alpha keys in games (typically WASD). +.TP +.B "\-\-print\-fps +Start FPS counter, to print framerate logs to the console. It can be started or stopped at any time with MOD+i. + .TP .BI "\-\-push\-target " path Set the target directory for pushing files to the device by drag & drop. It is passed as\-is to "adb push". diff --git a/app/src/cli.c b/app/src/cli.c index eb28b1d7..ab2d7d10 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -55,6 +55,7 @@ #define OPT_NO_DOWNSIZE_ON_ERROR 1035 #define OPT_OTG 1036 #define OPT_NO_CLEANUP 1037 +#define OPT_PRINT_FPS 1038 struct sc_option { char shortopt; @@ -336,6 +337,12 @@ static const struct sc_option options[] = { "special character, but breaks the expected behavior of alpha " "keys in games (typically WASD).", }, + { + .longopt_id = OPT_PRINT_FPS, + .longopt = "print-fps", + .text = "Start FPS counter, to print framerate logs to the console. " + "It can be started or stopped at any time with MOD+i.", + }, { .longopt_id = OPT_PUSH_TARGET, .longopt = "push-target", @@ -1547,6 +1554,9 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[], case OPT_NO_CLEANUP: opts->cleanup = false; break; + case OPT_PRINT_FPS: + opts->start_fps_counter = true; + break; case OPT_OTG: #ifdef HAVE_USB opts->otg = true; diff --git a/app/src/options.c b/app/src/options.c index 5a717df5..6651020f 100644 --- a/app/src/options.c +++ b/app/src/options.c @@ -63,4 +63,5 @@ const struct scrcpy_options scrcpy_options_default = { .select_tcpip = false, .select_usb = false, .cleanup = true, + .start_fps_counter = false, }; diff --git a/app/src/options.h b/app/src/options.h index f96edb22..f63e5c42 100644 --- a/app/src/options.h +++ b/app/src/options.h @@ -138,6 +138,7 @@ struct scrcpy_options { bool select_usb; bool select_tcpip; bool cleanup; + bool start_fps_counter; }; extern const struct scrcpy_options scrcpy_options_default; diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index 8c4920d6..3ed1d249 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -588,6 +588,7 @@ aoa_hid_end: .rotation = options->rotation, .mipmaps = options->mipmaps, .fullscreen = options->fullscreen, + .start_fps_counter = options->start_fps_counter, .buffering_time = options->display_buffer, }; diff --git a/app/src/screen.c b/app/src/screen.c index 2b1c5299..c233cf6e 100644 --- a/app/src/screen.c +++ b/app/src/screen.c @@ -386,6 +386,7 @@ sc_screen_init(struct sc_screen *screen, screen->req.width = params->window_width; screen->req.height = params->window_height; screen->req.fullscreen = params->fullscreen; + screen->req.start_fps_counter = params->start_fps_counter; static const struct sc_video_buffer_callbacks cbs = { .on_new_frame = sc_video_buffer_on_new_frame, @@ -562,6 +563,10 @@ sc_screen_show_initial_window(struct sc_screen *screen) { sc_screen_switch_fullscreen(screen); } + if (screen->req.start_fps_counter) { + sc_fps_counter_start(&screen->fps_counter); + } + SDL_ShowWindow(screen->window); } diff --git a/app/src/screen.h b/app/src/screen.h index 12b8816c..222e418f 100644 --- a/app/src/screen.h +++ b/app/src/screen.h @@ -35,6 +35,7 @@ struct sc_screen { uint16_t width; uint16_t height; bool fullscreen; + bool start_fps_counter; } req; SDL_Window *window; @@ -93,6 +94,7 @@ struct sc_screen_params { bool mipmaps; bool fullscreen; + bool start_fps_counter; sc_tick buffering_time; };