From f2139440b6ca8b57e06f82b67ab0b26b3780c09f Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 29 Nov 2020 11:19:48 +0900 Subject: [PATCH] Defer rendering to idle time SDL_RenderCopy / SDL_RenderPresent was called too often, which sometimes caused screen update to fail on Mac. --- src/sys/ags.cpp | 11 ++++++++--- src/sys/ags.h | 4 ++++ src/sys/nact.cpp | 15 ++++++++++----- src/sys/nact.h | 1 + src/sys/nact_sys1.cpp | 36 ++++++++++++++++++------------------ src/sys/nact_sys2.cpp | 42 +++++++++++++++++++++--------------------- src/sys/nact_sys3.cpp | 26 +++++++++++++------------- 7 files changed, 75 insertions(+), 60 deletions(-) diff --git a/src/sys/ags.cpp b/src/sys/ags.cpp index 082d6ea..f4ce89a 100644 --- a/src/sys/ags.cpp +++ b/src/sys/ags.cpp @@ -33,7 +33,7 @@ static SDL_Surface* display_surface; box[n].ey = y2; \ } -AGS::AGS(NACT* parent, const char* fontfile) : nact(parent) +AGS::AGS(NACT* parent, const char* fontfile) : nact(parent), dirty(false) { sdlRenderer = SDL_CreateRenderer(g_window, -1, 0); SDL_RenderSetLogicalSize(sdlRenderer, 640, 400); @@ -502,7 +502,6 @@ void AGS::draw_screen(int sx, int sy, int width, int height) void AGS::invalidate_screen(int sx, int sy, int width, int height) { - SDL_UnlockSurface(hBmpDest); int top = screen_height == 400 ? sy + (scroll - 400) : sy; if (top < 0) { height += top; @@ -515,10 +514,16 @@ void AGS::invalidate_screen(int sx, int sy, int width, int height) width = hBmpDest->w - sx; SDL_Rect rect = {sx, sy, width, height}; SDL_UpdateTexture(sdlTexture, &rect, pixels, hBmpDest->pitch); + dirty = true; +} + +void AGS::update_screen() { + if (!dirty) + return; SDL_RenderClear(sdlRenderer); SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL); SDL_RenderPresent(sdlRenderer); - SDL_LockSurface(hBmpDest); + dirty = false; } #ifdef __EMSCRIPTEN__ diff --git a/src/sys/ags.h b/src/sys/ags.h index d398d5f..cfcaf76 100644 --- a/src/sys/ags.h +++ b/src/sys/ags.h @@ -94,6 +94,8 @@ public: AGS(NACT* parent, const char* fontfile); ~AGS(); + void update_screen(); + void flush_screen(bool update); void load_cg(int page, int transparent); @@ -134,6 +136,8 @@ public: void load_cursor(int page); void select_cursor(); + bool dirty; + // ACG.DAT char acg[16]; diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index c8e41aa..630741a 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -125,7 +125,7 @@ bool NACT::mainloop() execute(); // 512コマンド実行毎にSleep(10) if(!(sleep_cnt = (sleep_cnt + 1) & 0x1ff)) { - SDL_Delay(10); + sys_sleep(10); } } return restart_after_terminate; @@ -303,7 +303,7 @@ void NACT::execute() if(dwTime <= SDL_GetTicks()) { break; } - SDL_Delay(16); + sys_sleep(16); } } if(!ags->draw_hankaku) { @@ -339,7 +339,7 @@ void NACT::execute() if(dwTime <= SDL_GetTicks()) { break; } - SDL_Delay(16); + sys_sleep(16); } } output_console(string); @@ -392,7 +392,7 @@ void NACT::wait_after_open_menu() break; } */ - SDL_Delay(10); + sys_sleep(10); dwTime = SDL_GetTicks(); } @@ -404,10 +404,15 @@ void NACT::wait_after_open_menu() if(!get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } } +void NACT::sys_sleep(int ms) { + ags->update_screen(); + SDL_Delay(ms); +} + // WinMainとのインターフェース int NACT::get_screen_height() diff --git a/src/sys/nact.h b/src/sys/nact.h index 543ddce..78894d3 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -213,6 +213,7 @@ protected: void wait_after_open_menu(); + void sys_sleep(int ms); uint8 get_key(); void get_cursor(int* x, int* y); void set_cursor(int x, int y); diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index fab1961..0348d9a 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -30,7 +30,7 @@ if(dwTime <= SDL_GetTicks()) { \ break; \ } \ - SDL_Delay(10); \ + sys_sleep(10); \ } \ } @@ -52,14 +52,14 @@ if(dwTime <= SDL_GetTicks()) { \ break; \ } \ - SDL_Delay(10); \ + sys_sleep(10); \ } \ break; \ } \ if(dwTime <= SDL_GetTicks()) { \ break; \ } \ - SDL_Delay(10); \ + sys_sleep(10); \ } \ } @@ -345,14 +345,14 @@ void NACT_Sys1::cmd_open_menu() return; } if((val = get_key()) != 0) { - SDL_Delay(100); + sys_sleep(100); break; } get_cursor(¤t_mx, ¤t_my); if(abs(my - current_my) > 3) { break; } - SDL_Delay(10); + sys_sleep(10); } if(val) { for(;;) { @@ -362,7 +362,7 @@ void NACT_Sys1::cmd_open_menu() if(!get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } } @@ -531,14 +531,14 @@ top2: return; } if((val = get_key()) != 0) { - SDL_Delay(100); + sys_sleep(100); break; } get_cursor(¤t_mx, ¤t_my); if(abs(my - current_my) > 3) { break; } - SDL_Delay(10); + sys_sleep(10); } if(val) { for(;;) { @@ -548,7 +548,7 @@ top2: if(!get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } } @@ -713,14 +713,14 @@ top2: return; } if((val = get_key()) != 0) { - SDL_Delay(100); + sys_sleep(100); break; } get_cursor(¤t_mx, ¤t_my); if(abs(my - current_my) > 3) { break; } - SDL_Delay(10); + sys_sleep(10); } if(val) { for(;;) { @@ -730,7 +730,7 @@ top2: if(!get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } } @@ -798,9 +798,9 @@ void NACT_Sys1::cmd_a() if(get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } - SDL_Delay(100); + sys_sleep(100); for(;;) { if(terminate) { return; @@ -808,7 +808,7 @@ void NACT_Sys1::cmd_a() if(!(get_key() & 0x18)) { break; } - SDL_Delay(10); + sys_sleep(10); } } @@ -1210,9 +1210,9 @@ void NACT_Sys1::cmd_y() if(get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } - SDL_Delay(100); + sys_sleep(100); for(;;) { if(terminate) { return; @@ -1220,7 +1220,7 @@ void NACT_Sys1::cmd_y() if(!(get_key() & 0x18)) { break; } - SDL_Delay(10); + sys_sleep(10); } ags->clear_text_window(text_window, true); break; diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index f91dcb3..d139ce9 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -22,7 +22,7 @@ if(dwTime <= SDL_GetTicks()) { \ break; \ } \ - SDL_Delay(10); \ + sys_sleep(10); \ } \ } @@ -44,14 +44,14 @@ if(dwTime <= SDL_GetTicks()) { \ break; \ } \ - SDL_Delay(10); \ + sys_sleep(10); \ } \ break; \ } \ if(dwTime <= SDL_GetTicks()) { \ break; \ } \ - SDL_Delay(10); \ + sys_sleep(10); \ } \ } @@ -390,14 +390,14 @@ void NACT_Sys2::cmd_open_menu() return; } if((val = get_key()) != 0) { - SDL_Delay(100); + sys_sleep(100); break; } get_cursor(¤t_mx, ¤t_my); if(abs(my - current_my) > 3) { break; } - SDL_Delay(10); + sys_sleep(10); } if(val) { for(;;) { @@ -407,7 +407,7 @@ void NACT_Sys2::cmd_open_menu() if(!get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } } @@ -541,14 +541,14 @@ void NACT_Sys2::cmd_open_verb() return; } if((val = get_key()) != 0) { - SDL_Delay(100); + sys_sleep(100); break; } get_cursor(¤t_mx, ¤t_my); if(abs(my - current_my) > 3) { break; } - SDL_Delay(10); + sys_sleep(10); } if(val) { for(;;) { @@ -558,7 +558,7 @@ void NACT_Sys2::cmd_open_verb() if(!get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } } @@ -679,14 +679,14 @@ void NACT_Sys2::cmd_open_obj(int verb) return; } if((val = get_key()) != 0) { - SDL_Delay(100); + sys_sleep(100); break; } get_cursor(¤t_mx, ¤t_my); if(abs(my - current_my) > 3) { break; } - SDL_Delay(10); + sys_sleep(10); } if(val) { for(;;) { @@ -696,7 +696,7 @@ void NACT_Sys2::cmd_open_obj(int verb) if(!get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } } @@ -762,9 +762,9 @@ void NACT_Sys2::cmd_a() if(get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } - SDL_Delay(100); + sys_sleep(100); for(;;) { if(terminate) { return; @@ -772,7 +772,7 @@ void NACT_Sys2::cmd_a() if(!(get_key() & 0x18)) { break; } - SDL_Delay(10); + sys_sleep(10); } } @@ -1387,7 +1387,7 @@ void NACT_Sys2::cmd_y() if(dwTime <= SDL_GetTicks()) { break; } - SDL_Delay(10); + sys_sleep(10); } } break; @@ -1434,7 +1434,7 @@ void NACT_Sys2::cmd_y() if(dwTime <= SDL_GetTicks()) { break; } - SDL_Delay(0); + sys_sleep(0); } } ags->fade_end(); @@ -1455,7 +1455,7 @@ void NACT_Sys2::cmd_y() if(dwTime <= SDL_GetTicks()) { break; } - SDL_Delay(0); + sys_sleep(0); } } } @@ -1499,9 +1499,9 @@ void NACT_Sys2::cmd_y() if(get_key()) { break; } - SDL_Delay(10); + sys_sleep(10); } - SDL_Delay(100); + sys_sleep(100); for(;;) { if(terminate) { return; @@ -1509,7 +1509,7 @@ void NACT_Sys2::cmd_y() if(!(get_key() & 0x18)) { break; } - SDL_Delay(10); + sys_sleep(10); } break; case 254: diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index 1a97744..8a305a5 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -157,10 +157,10 @@ int NACT_Sys3::menu_select(int num_items) if (dx*dx + dy*dy > 10) break; if((val = get_key()) != 0) { - SDL_Delay(100); + sys_sleep(100); break; } - SDL_Delay(16); + sys_sleep(16); } if(val) { for(;;) { @@ -170,7 +170,7 @@ int NACT_Sys3::menu_select(int num_items) if(!get_key()) { break; } - SDL_Delay(16); + sys_sleep(16); } } @@ -387,9 +387,9 @@ void NACT_Sys3::cmd_a() if(get_key()) { break; } - SDL_Delay(16); + sys_sleep(16); } - SDL_Delay(30); + sys_sleep(30); for(;;) { if(terminate) { return; @@ -397,7 +397,7 @@ void NACT_Sys3::cmd_a() if(!(get_key() & 0x18)) { break; } - SDL_Delay(16); + sys_sleep(16); } } @@ -638,7 +638,7 @@ void NACT_Sys3::cmd_k() return; } } - SDL_Delay(16); + sys_sleep(16); } if(cmd != 0 && cmd != 4) { RND = val; @@ -646,7 +646,7 @@ void NACT_Sys3::cmd_k() // キーが離されるまで待機 if(cmd != 1) { - SDL_Delay(100); + sys_sleep(100); for(;;) { if(terminate) { return; @@ -654,7 +654,7 @@ void NACT_Sys3::cmd_k() if(!(val = get_key())) { break; } - SDL_Delay(16); + sys_sleep(16); } } @@ -1158,7 +1158,7 @@ void NACT_Sys3::cmd_y() if(dwTime <= SDL_GetTicks()) { break; } - SDL_Delay(16); + sys_sleep(16); } } break; @@ -1251,7 +1251,7 @@ void NACT_Sys3::cmd_y() ags->fade_in(i); int32 ms = dwStart + param * 1000 / 60 * i - SDL_GetTicks(); if (ms > 0) - SDL_Delay(ms); + sys_sleep(ms); } ags->fade_end(); } @@ -1265,7 +1265,7 @@ void NACT_Sys3::cmd_y() ags->fade_out(i, (cmd == 41) ? false : true); int32 ms = dwStart + param * 1000 / 60 * i - SDL_GetTicks(); if (ms > 0) - SDL_Delay(ms); + sys_sleep(ms); } } break; @@ -1303,7 +1303,7 @@ void NACT_Sys3::cmd_y() if(!get_key()) { break; } - SDL_Delay(16); + sys_sleep(16); } } } else if(param == 3) {