aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2019-10-13 17:19:15 +0200
committerToni Uhlig <matzeton@googlemail.com>2019-10-13 17:19:15 +0200
commit0fc499334b5757678e3ce8e53203ce05995012bc (patch)
tree651b29c55c55d657729572f69cfd0f1e81f5017a
parent8fa32ec99a354c6031488519e7a55fcc227a723e (diff)
added gdi redraw/repaint if pre-configured time past
-rw-r--r--GdiRadar/GdiRadar.cpp29
-rw-r--r--GdiRadar/GdiRadar.h2
-rw-r--r--GdiRadar/GdiRadarMain.cpp8
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;
}