From 05c46b4744ba35bdcef046b49214ec36b39f5462 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Fri, 1 Mar 2019 16:52:59 +0100 Subject: [PATCH] iOS: fix screen black flickers and queue UI api calls to the main thread --- PanoPainter/GameViewController.m | 8 ++++---- src/app_events.cpp | 24 +++++++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/PanoPainter/GameViewController.m b/PanoPainter/GameViewController.m index 0d4f763..00c4f75 100644 --- a/PanoPainter/GameViewController.m +++ b/PanoPainter/GameViewController.m @@ -69,7 +69,7 @@ std::recursive_mutex lock_mutex; } - (void)async_swap { - [self.context presentRenderbuffer:GL_RENDERBUFFER]; + [self.context presentRenderbuffer:GL_FRAMEBUFFER]; } - (void)share_file:(NSString *)file_path @@ -468,16 +468,16 @@ std::set ignored_touch; App::I.tick(dt.count()); + [self async_lock]; if (!(App::I.redraw || App::I.animate || !working_list.empty())) { - //[self.context presentRenderbuffer:GL_FRAMEBUFFER]; - //[self async_unlock]; + [self.context presentRenderbuffer:GL_FRAMEBUFFER]; + [self async_unlock]; std::unique_lock lock(render_mutex); render_cv.wait(lock); continue; } - [self async_lock]; while (!working_list.empty()) { working_list.front()(); diff --git a/src/app_events.cpp b/src/app_events.cpp index f1c1d40..e102b66 100644 --- a/src/app_events.cpp +++ b/src/app_events.cpp @@ -41,8 +41,10 @@ void App::showKeyboard() LOG("show keyboard"); redraw = true; #ifdef __IOS__ - [ios_view registerForKeyboardNotifications]; - [ios_view becomeFirstResponder]; + dispatch_async(dispatch_get_main_queue(), ^{ + [ios_view registerForKeyboardNotifications]; + [ios_view becomeFirstResponder]; + }); #elif __ANDROID__ displayKeyboard(and_app, true); #endif @@ -53,8 +55,10 @@ void App::hideKeyboard() LOG("hide keyboard"); redraw = true; #ifdef __IOS__ - [ios_view resignFirstResponder]; -// [ios_view unregisterForKeyboardNotifications]; + dispatch_async(dispatch_get_main_queue(), ^{ + [ios_view resignFirstResponder]; + // [ios_view unregisterForKeyboardNotifications]; + }); #elif __ANDROID__ displayKeyboard(and_app, false); #endif @@ -64,7 +68,9 @@ void App::pick_image(std::function callback) { redraw = true; #ifdef __IOS__ - [ios_view pick_photo:callback]; + dispatch_async(dispatch_get_main_queue(), ^{ + [ios_view pick_photo:callback]; + }); #elif __OSX__ dispatch_async(dispatch_get_main_queue(), ^{ NSArray* fileTypes = [NSArray arrayWithObjects:@"png", @"PNG", @"jpg", @"JPG", @"jpeg", nil]; @@ -87,7 +93,9 @@ void App::pick_file(std::vector types, std::function callback) void App::display_file(std::string path) { #ifdef __IOS__ - [ios_view display_file:path]; + dispatch_async(dispatch_get_main_queue(), ^{ + [ios_view display_file:path]; + }); #elif __OSX__ [[NSWorkspace sharedWorkspace] openFile:[NSString stringWithUTF8String:path.c_str()]]; // dispatch_async(dispatch_get_main_queue(), ^{