examples/rpgwalk: FPS-метр
Плашка слева-сверху (значение раз в секунду, рисуется на обеих страницах — fps_draw=2, как в examples/space). ~39 fps на 8 ходящих персонажах (кадр на грани 20 мс — частично двухvsync'овые кадры). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -101,6 +101,22 @@ static void turn_90(uint8_t i)
|
||||
go_edge(i);
|
||||
}
|
||||
|
||||
/* FPS-плашка слева-сверху: значение раз в секунду, рисуется на ОБЕИХ
|
||||
* страницах (fps_draw = 2 кадра), банк 0x50 — heal её учитывает. */
|
||||
static void show_fps(uint8_t v)
|
||||
{
|
||||
char buf[4];
|
||||
|
||||
buf[0] = (char)('0' + (v / 100) % 10);
|
||||
buf[1] = (char)('0' + (v / 10) % 10);
|
||||
buf[2] = (char)('0' + v % 10);
|
||||
buf[3] = 0;
|
||||
setcolor(WHITE);
|
||||
setfillstyle(SOLID_FILL, BLACK);
|
||||
bar(0, 0, 27, 9);
|
||||
outtextxy(2, 1, buf);
|
||||
}
|
||||
|
||||
static void draw_field(void)
|
||||
{
|
||||
int i;
|
||||
@@ -124,6 +140,7 @@ static void draw_field(void)
|
||||
int main(void)
|
||||
{
|
||||
uint8_t i, page, hidden;
|
||||
uint8_t frames = 0, last_sec, fps_val = 0, fps_draw = 0;
|
||||
datetime_t dt;
|
||||
|
||||
if (atlas_load(&at1, "bard1.atl") != 0 &&
|
||||
@@ -161,6 +178,7 @@ int main(void)
|
||||
gfx_set_visible_page(0);
|
||||
getdatetime(&dt);
|
||||
srand((unsigned)(dt.second * 77u + dt.minute));
|
||||
last_sec = dt.second;
|
||||
|
||||
for (;;) {
|
||||
if (kbhit() && getch() == 27)
|
||||
@@ -176,6 +194,18 @@ int main(void)
|
||||
|
||||
hidden = gfx_get_visible_page() ^ 1;
|
||||
gfx_set_draw_page(hidden);
|
||||
frames++;
|
||||
getdatetime(&dt);
|
||||
if (dt.second != last_sec) {
|
||||
last_sec = dt.second;
|
||||
fps_val = frames;
|
||||
frames = 0;
|
||||
fps_draw = 2;
|
||||
}
|
||||
if (fps_draw) {
|
||||
fps_draw--;
|
||||
show_fps(fps_val);
|
||||
}
|
||||
sprite_update(sp, NCHR);
|
||||
gfx_wait_vsync();
|
||||
gfx_set_visible_page(hidden);
|
||||
|
||||
Reference in New Issue
Block a user