void ShellAndroid::run() { PosixTimer timer; double current_time = timer.get(); while (true) { struct android_poll_source *source; while (true) { int timeout = (settings_.animate && app_.window) ? 0 : -1; if (ALooper_pollAll(timeout, nullptr, nullptr, reinterpret_cast<void **>(&source)) < 0) break; if (source) source->process(&app_, source); } if (app_.destroyRequested) break; if (!app_.window) continue; acquire_back_buffer(); double t = timer.get(); add_game_time(static_cast<float>(t - current_time)); present_back_buffer(); current_time = t; } }
void ShellXcb::loop_poll() { PosixTimer timer; double current_time = timer.get(); double profile_start_time = current_time; int profile_present_count = 0; while (true) { // handle pending events while (true) { xcb_generic_event_t *ev = xcb_poll_for_event(c_); if (!ev) break; handle_event(ev); free(ev); } if (quit_) break; acquire_back_buffer(); double t = timer.get(); add_game_time(static_cast<float>(t - current_time)); present_back_buffer(); current_time = t; profile_present_count++; if (current_time - profile_start_time >= 5.0) { const double fps = profile_present_count / (current_time - profile_start_time); std::stringstream ss; ss << profile_present_count << " presents in " << current_time - profile_start_time << " seconds " << "(FPS: " << fps << ")"; log(LOG_INFO, ss.str().c_str()); profile_start_time = current_time; profile_present_count = 0; } } }