Skip to content

Commit 623c9f4

Browse files
JamirasLibretroAdmin
authored andcommitted
slowly prefetch all badges if threads are available
1 parent f5d5928 commit 623c9f4

3 files changed

Lines changed: 71 additions & 3 deletions

File tree

cheevos/cheevos.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,6 +1506,60 @@ static void rcheevos_client_login_callback(int result,
15061506
}
15071507
}
15081508

1509+
#ifdef HAVE_THREADS
1510+
1511+
void rcheevos_download_next_badge(retro_task_t* task)
1512+
{
1513+
/* progress: 0 = unlocked images for achievements player hasn't earned
1514+
* 1 = locked images for achievements player hasn't earned
1515+
* 2 = unlocked images for achievements player has earned
1516+
*/
1517+
const int bucket = (task->progress == 2) ? RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED : RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED;
1518+
const rc_client_achievement_t* first_locked_achievement =
1519+
rc_client_get_next_achievement_info(rcheevos_locals.client, task->user_data, bucket);
1520+
1521+
while (first_locked_achievement)
1522+
{
1523+
bool result;
1524+
1525+
if (task->progress == 1)
1526+
{
1527+
char locked_name[24];
1528+
snprintf(locked_name, sizeof(locked_name), "%s_lock", first_locked_achievement->badge_name);
1529+
result = rcheevos_client_download_badge_from_url(first_locked_achievement->badge_locked_url, locked_name);
1530+
}
1531+
else
1532+
{
1533+
result = rcheevos_client_download_badge_from_url(first_locked_achievement->badge_url, first_locked_achievement->badge_name);
1534+
}
1535+
1536+
if (result)
1537+
break;
1538+
1539+
first_locked_achievement =
1540+
rc_client_get_next_achievement_info(rcheevos_locals.client, first_locked_achievement, bucket);
1541+
}
1542+
1543+
if (!first_locked_achievement)
1544+
{
1545+
if (task->progress == 2 || !rcheevos_is_game_loaded())
1546+
{
1547+
/* mark task as complete so it will get cleaned up */
1548+
task_set_flags(task, RETRO_TASK_FLG_FINISHED, true);
1549+
return;
1550+
}
1551+
1552+
task->user_data = NULL; /* restart list */
1553+
task->progress++;
1554+
}
1555+
1556+
/* wait 10 seconds, then download the next badge */
1557+
task->user_data = (void*)first_locked_achievement;
1558+
task->when = cpu_features_get_time_usec() + 10 * 1000000;
1559+
}
1560+
1561+
#endif
1562+
15091563
static void rcheevos_finalize_game_load(rc_client_t* client)
15101564
{
15111565
settings_t* settings = config_get_ptr();
@@ -1522,6 +1576,9 @@ static void rcheevos_finalize_game_load(rc_client_t* client)
15221576
const rc_client_achievement_t* first_locked_achievement = NULL;
15231577
const rc_client_game_t* game = rc_client_get_game_info(client);
15241578
char badge[32];
1579+
#ifdef HAVE_THREADS
1580+
retro_task_t* task;
1581+
#endif
15251582

15261583
badge[0] = 'i';
15271584
strlcpy(&badge[1], game->badge_name, sizeof(badge) - 1);
@@ -1531,6 +1588,17 @@ static void rcheevos_finalize_game_load(rc_client_t* client)
15311588
first_locked_achievement = rc_client_get_next_achievement_info(client, NULL, RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED);
15321589
if (first_locked_achievement)
15331590
rcheevos_client_download_badge_from_url(first_locked_achievement->badge_url, first_locked_achievement->badge_name);
1591+
1592+
#ifdef HAVE_THREADS
1593+
task = task_init();
1594+
if (task)
1595+
{
1596+
task->handler = rcheevos_download_next_badge;
1597+
task->user_data = (void*)first_locked_achievement;
1598+
task->when = cpu_features_get_time_usec() + 5*60*1000000; /* five minutes */
1599+
task_queue_push(task);
1600+
}
1601+
#endif
15341602
}
15351603

15361604
if (!rc_client_is_processing_required(client))

cheevos/cheevos_client.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,9 +478,9 @@ bool rcheevos_client_download_badge(rc_client_download_queue_t* queue,
478478
return true;
479479
}
480480

481-
void rcheevos_client_download_badge_from_url(const char* url, const char* badge_name)
481+
bool rcheevos_client_download_badge_from_url(const char* url, const char* badge_name)
482482
{
483-
rcheevos_client_download_badge(NULL, url, badge_name);
483+
return rcheevos_client_download_badge(NULL, url, badge_name);
484484
}
485485

486486
static void rcheevos_client_fetch_next_badge(rc_client_download_queue_t* queue)

cheevos/cheevos_client.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ RETRO_BEGIN_DECLS
2222

2323
void rcheevos_client_download_placeholder_badge(void);
2424
void rcheevos_client_download_achievement_badges(rc_client_t* client);
25-
void rcheevos_client_download_badge_from_url(const char* url, const char* badge_name);
25+
bool rcheevos_client_download_badge_from_url(const char* url, const char* badge_name);
2626

2727
void rcheevos_client_server_call(const rc_api_request_t* request,
2828
rc_client_server_callback_t callback, void* callback_data, rc_client_t* client);

0 commit comments

Comments
 (0)