gc menu now tries to load control data from ns cache before manually loading.

on fw 19 and below, loading from cache takes ~5ms, whereas manually loading takes ~20ms.
manually loading is still faster than relying on ns to load control from storage (~50ms).
This commit is contained in:
ITotalJustice
2025-05-14 00:04:47 +01:00
parent 35abe363a6
commit 0167bf034c

View File

@@ -182,6 +182,7 @@ Menu::Menu() : MenuBase{"GameCard"_i18n} {
const Vec2 pad{0, 125 - v.h};
m_list = std::make_unique<List>(1, 3, m_pos, v, pad);
nsInitialize();
fsOpenDeviceOperator(std::addressof(m_dev_op));
fsOpenGameCardDetectionEventNotifier(std::addressof(m_event_notifier));
fsEventNotifierGetEventHandle(std::addressof(m_event_notifier), std::addressof(m_event), true);
@@ -494,6 +495,31 @@ void Menu::OnChangeIndex(s64 new_index) {
const auto index = m_entries.empty() ? 0 : m_entry_index + 1;
this->SetSubHeading(std::to_string(index) + " / " + std::to_string(m_entries.size()));
const auto id = m_entries[m_entry_index].app_id;
if (hosversionBefore(20,0,0)) {
TimeStamp ts;
auto control = std::make_unique<NsApplicationControlData>();
u64 control_size;
if (R_SUCCEEDED(nsGetApplicationControlData(NsApplicationControlSource_CacheOnly, id, control.get(), sizeof(NsApplicationControlData), &control_size))) {
log_write("\t\t[ns control cache] time taken: %.2fs %zums\n", ts.GetSecondsD(), ts.GetMs());
NacpLanguageEntry* lang_entry{};
nacpGetLanguageEntry(&control->nacp, &lang_entry);
if (lang_entry) {
m_lang_entry = *lang_entry;
}
const auto jpeg_size = control_size - sizeof(NacpStruct);
m_icon = nvgCreateImageMem(App::GetVg(), 0, control->icon, jpeg_size);
if (m_icon > 0) {
return;
}
}
}
// nsGetApplicationControlData() will fail if it's the first time
// mounting a gamecard if the image is not already cached.
// waiting 1-2s after mount, then calling seems to work.
@@ -506,7 +532,7 @@ void Menu::OnChangeIndex(s64 new_index) {
std::vector<u8> icon;
const auto path = BuildGcPath(collection.name.c_str(), &m_handle);
u64 program_id = m_entries[m_entry_index].app_id | collection.id_offset;
u64 program_id = id | collection.id_offset;
if (hosversionAtLeast(17, 0, 0)) {
fsGetProgramId(&program_id, path, FsContentAttributes_All);
}