Fixing screen resize bugs
This commit is contained in:
parent
6406c4f258
commit
6a79e8e41e
79
src/Game.cpp
79
src/Game.cpp
@ -109,7 +109,7 @@ namespace FRG
|
||||
renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE);
|
||||
renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE);
|
||||
#endif
|
||||
loadingTexture = renderer.textureManager.LoadFromPng("resources/loading.png", "");
|
||||
loadingTexture = renderer.textureManager.LoadFromPng("resources/loading003.png", "");
|
||||
|
||||
loadingProgressBarFrameTexture = renderer.textureManager.LoadFromPng(
|
||||
"resources/loadingProgressBarFrame.png", "", true);
|
||||
@ -1134,7 +1134,6 @@ namespace FRG
|
||||
CheckGlError(__FILE__, __LINE__);
|
||||
}
|
||||
|
||||
|
||||
int64_t Game::getSyncTimeMs() {
|
||||
int64_t localNow = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
std::chrono::system_clock::now().time_since_epoch()).count();
|
||||
@ -1189,46 +1188,20 @@ namespace FRG
|
||||
SDL_GL_SwapWindow(FRG::Environment::window);
|
||||
}
|
||||
|
||||
void Game::update() {
|
||||
SDL_Event event;
|
||||
const bool mobileIsPortrait = loadingCompleted && (Environment::width < Environment::height);
|
||||
while (SDL_PollEvent(&event)) {
|
||||
if (event.type == SDL_QUIT) {
|
||||
Environment::exitGameLoop = true;
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
if (event.type == SDL_APP_WILLENTERBACKGROUND) {
|
||||
isAppActive = false;
|
||||
__android_log_print(ANDROID_LOG_INFO, "Game", "App moving to background, suspending loop");
|
||||
break;
|
||||
}
|
||||
if (event.type == SDL_APP_DIDENTERFOREGROUND) {
|
||||
isAppActive = true;
|
||||
__android_log_print(ANDROID_LOG_INFO, "Game", "App returned to foreground, resuming loop");
|
||||
break;
|
||||
}
|
||||
/*
|
||||
__android_log_print(ANDROID_LOG_ERROR, "Game",
|
||||
"Game::update step 1 event type: %d", event.type);
|
||||
*/
|
||||
#endif
|
||||
|
||||
|
||||
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) {
|
||||
void Game::onWindowResized() {
|
||||
const bool wasPortrait = Environment::width < Environment::height;
|
||||
FRG::logger() << "Window resized" << std::endl;
|
||||
|
||||
if (Environment::isHighDPIEnabled) {
|
||||
// Если High DPI включен, запрашиваем реальное физическое разрешение буфера
|
||||
int drawW, drawH;
|
||||
SDL_GL_GetDrawableSize(Environment::window, &drawW, &drawH);
|
||||
Environment::width = drawW;
|
||||
Environment::height = drawH;
|
||||
}
|
||||
else {
|
||||
// Если High DPI выключен, используем логические размеры из события
|
||||
Environment::width = event.window.data1 / FRG::Environment::customDpiScale;
|
||||
Environment::height = event.window.data2 / FRG::Environment::customDpiScale;
|
||||
int winW, winH;
|
||||
SDL_GetWindowSize(Environment::window, &winW, &winH);
|
||||
Environment::width = winW / FRG::Environment::customDpiScale;
|
||||
Environment::height = winH / FRG::Environment::customDpiScale;
|
||||
}
|
||||
|
||||
Environment::computeProjectionDimensions();
|
||||
@ -1242,10 +1215,30 @@ namespace FRG
|
||||
}
|
||||
|
||||
logger() << "Window resized (Render Size): " << Environment::width << "x" << Environment::height << std::endl;
|
||||
//space.clearTextRendererCache();
|
||||
}
|
||||
|
||||
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) {
|
||||
void Game::update() {
|
||||
SDL_Event event;
|
||||
const bool mobileIsPortrait = loadingCompleted && (Environment::width < Environment::height);
|
||||
while (SDL_PollEvent(&event)) {
|
||||
if (event.type == SDL_QUIT) {
|
||||
Environment::exitGameLoop = true;
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
if (event.type == SDL_APP_WILLENTERBACKGROUND) {
|
||||
isAppActive = false;
|
||||
__android_log_print(ANDROID_LOG_INFO, "Game", "App moving to background, suspending loop");
|
||||
}
|
||||
if (event.type == SDL_APP_DIDENTERFOREGROUND) {
|
||||
isAppActive = true;
|
||||
__android_log_print(ANDROID_LOG_INFO, "Game", "App returned to foreground, resuming loop");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if (event.type == SDL_WINDOWEVENT && (event.window.event == SDL_WINDOWEVENT_RESIZED || event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) {
|
||||
onWindowResized();
|
||||
}
|
||||
|
||||
// Suppress all input while portrait overlay is shown
|
||||
@ -1384,6 +1377,20 @@ namespace FRG
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback detection (proactive check)
|
||||
int drawableW, drawableH;
|
||||
SDL_GL_GetDrawableSize(Environment::window, &drawableW, &drawableH);
|
||||
if (drawableW != lastDrawableW || drawableH != lastDrawableH) {
|
||||
lastDrawableW = drawableW;
|
||||
lastDrawableH = drawableH;
|
||||
onWindowResized();
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
if (!isAppActive) return;
|
||||
#endif
|
||||
|
||||
// Drain one loading step per frame so the window/tab keeps pumping events
|
||||
// and repainting between steps instead of freezing for the whole load.
|
||||
if (!loadingCompleted && !loadSteps.empty()) {
|
||||
|
||||
@ -39,6 +39,7 @@ namespace FRG {
|
||||
void setupPart2();
|
||||
void update();
|
||||
void render();
|
||||
void onWindowResized();
|
||||
|
||||
bool shouldExit() const { return Environment::exitGameLoop; }
|
||||
|
||||
@ -201,6 +202,9 @@ namespace FRG {
|
||||
int64_t newTickCount;
|
||||
int64_t lastTickCount;
|
||||
|
||||
int lastDrawableW = -1;
|
||||
int lastDrawableH = -1;
|
||||
|
||||
static const size_t CONST_TIMER_INTERVAL = 10;
|
||||
static const size_t CONST_MAX_TIME_INTERVAL = 1000;
|
||||
};
|
||||
|
||||
29
src/main.cpp
29
src/main.cpp
@ -267,34 +267,9 @@ int main(int argc, char* argv[]) {
|
||||
}
|
||||
|
||||
while (!g_game->shouldExit()) {
|
||||
SDL_Event event;
|
||||
// Обрабатываем системные события Android до обновления кадра
|
||||
/*while (SDL_PollEvent(&event)) {
|
||||
// Перенаправляем событие в игру, чтобы сработал ваш внутренний цикл (память, ресайз и т.д.)
|
||||
// Примечание: внутри Game::update у вас тоже стоит PollEvent.
|
||||
// Чтобы события не терялись, лучше обрабатывать их в одном месте,
|
||||
// но жизненно важные для ОС флаги перехватываем здесь:
|
||||
if (event.type == SDL_QUIT) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Сворачивание / Разворачивание приложения в Android
|
||||
if (event.type == SDL_APP_WILLENTERBACKGROUND) {
|
||||
isAppActive = false;
|
||||
__android_log_print(ANDROID_LOG_INFO, "Game", "App moving to background, suspending loop");
|
||||
}
|
||||
if (event.type == SDL_APP_DIDENTERFOREGROUND) {
|
||||
isAppActive = true;
|
||||
__android_log_print(ANDROID_LOG_INFO, "Game", "App returned to foreground, resuming loop");
|
||||
}
|
||||
}*/
|
||||
|
||||
if (isAppActive) {
|
||||
g_game->update();
|
||||
// На Android шаг кадров завязан на VSync (SwapInterval = 1).
|
||||
// SDL_Delay(16) здесь не нужен, он будет вызывать микро-фризы (stuttering).
|
||||
}
|
||||
else {
|
||||
|
||||
if (!isAppActive) {
|
||||
// Если игра свернута — спим, чтобы не нагружать CPU/GPU
|
||||
SDL_Delay(100);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user