diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2019-10-13 17:19:15 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2019-10-13 17:19:15 +0200 |
commit | 0fc499334b5757678e3ce8e53203ce05995012bc (patch) | |
tree | 651b29c55c55d657729572f69cfd0f1e81f5017a | |
parent | 8fa32ec99a354c6031488519e7a55fcc227a723e (diff) |
added gdi redraw/repaint if pre-configured time past
-rw-r--r-- | GdiRadar/GdiRadar.cpp | 29 | ||||
-rw-r--r-- | GdiRadar/GdiRadar.h | 2 | ||||
-rw-r--r-- | GdiRadar/GdiRadarMain.cpp | 8 |
3 files changed, 37 insertions, 2 deletions
diff --git a/GdiRadar/GdiRadar.cpp b/GdiRadar/GdiRadar.cpp index 430d100..7962f20 100644 --- a/GdiRadar/GdiRadar.cpp +++ b/GdiRadar/GdiRadar.cpp @@ -27,7 +27,8 @@ struct gdi_radar_context HWND myDrawWnd; WNDCLASSW wc; - clock_t minimumUpdateTime; + double minimumUpdateTime; + UINT64 maximumRedrawFails; clock_t lastTimeUpdated; UINT64 GameMapWidth; UINT64 GameMapHeight; @@ -109,6 +110,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM l draw_entity(wnd_ctx, entity.pos[0], entity.pos[1], entity.health, entity.color, entity.name); } EndPaint(hwnd, &ps); + + wnd_ctx->lastTimeUpdated = clock(); break; } @@ -147,7 +150,8 @@ struct gdi_radar_context * const /* config params */ result->className = _wcsdup(cfg->className); result->windowName = _wcsdup(cfg->windowName); - result->minimumUpdateTime = (clock_t)cfg->minimumUpdateTime; + result->minimumUpdateTime = cfg->minimumUpdateTime; + result->maximumRedrawFails = cfg->maximumRedrawFails; result->reservedEntities = cfg->reservedEntities; result->entities.reserve(result->reservedEntities); @@ -218,6 +222,27 @@ void gdi_radar_clear_entities(struct gdi_radar_context * const ctx) ctx->entities.clear(); } +bool gdi_radar_redraw_if_necessary(struct gdi_radar_context * const ctx) +{ + clock_t end; + double cpu_time_used; + + end = clock(); + cpu_time_used = ((double)(end - ctx->lastTimeUpdated)) / CLOCKS_PER_SEC; + std::cout << "Time past after last update: " << cpu_time_used << std::endl; + + if (cpu_time_used > ctx->minimumUpdateTime) { + if (cpu_time_used > ctx->minimumUpdateTime * ctx->maximumRedrawFails) { + std::cout << "ERROR: Redraw failed for the last " + << ctx->maximumRedrawFails << " times!\n"; + return false; + } + RedrawWindow(ctx->myDrawWnd, NULL, NULL, RDW_INVALIDATE); + } + + return true; +} + void gdi_radar_set_game_dimensions(struct gdi_radar_context * const ctx, UINT64 GameMapWidth, UINT64 GameMapHeight) { diff --git a/GdiRadar/GdiRadar.h b/GdiRadar/GdiRadar.h index 2049605..22e2f92 100644 --- a/GdiRadar/GdiRadar.h +++ b/GdiRadar/GdiRadar.h @@ -8,6 +8,7 @@ struct gdi_radar_config { LPCWSTR className; LPCWSTR windowName; double minimumUpdateTime; + UINT64 maximumRedrawFails; size_t reservedEntities; }; @@ -40,6 +41,7 @@ struct entity { void gdi_radar_add_entity(struct gdi_radar_context * const ctx, struct entity const * const ent); void gdi_radar_clear_entities(struct gdi_radar_context * const ctx); +bool gdi_radar_redraw_if_necessary(struct gdi_radar_context * const ctx); void gdi_radar_set_game_dimensions(struct gdi_radar_context * const ctx, UINT64 GameMapWidth, UINT64 GameMapHeight); static void gdi_radar_set_game_dimensions(struct gdi_radar_context * const ctx, diff --git a/GdiRadar/GdiRadarMain.cpp b/GdiRadar/GdiRadarMain.cpp index f6e909f..d8ed7e9 100644 --- a/GdiRadar/GdiRadarMain.cpp +++ b/GdiRadar/GdiRadarMain.cpp @@ -16,6 +16,7 @@ int main() cfg.className = L"BlaTest"; cfg.windowName = L"BlaTestWindow"; cfg.minimumUpdateTime = 0.25f; + cfg.maximumRedrawFails = 5; cfg.reservedEntities = 16; std::cout << "Init\n"; @@ -38,7 +39,14 @@ int main() entity e3{ 500.0f, 500.0f, 80.0f, entity_color::EC_RED, "whiteshirt" }; gdi_radar_add_entity(ctx, &e3); +#if 0 gdi_radar_process_window_events_blocking(ctx); +#else + do { + gdi_radar_redraw_if_necessary(ctx); + Sleep(200); + } while (!gdi_radar_process_window_events_nonblocking(ctx)); +#endif return 0; } |