Revert "feat(perf): multithreaded resource updater" (#10684)

Revert "feat(perf): multithreaded resource updater (#10683)"

This reverts commit d8f3dded11.
This commit is contained in:
Constrat
2024-09-24 21:25:04 +02:00
committed by GitHub
parent d8f3dded11
commit f40036d6df

View File

@@ -1,8 +1,5 @@
#include <chrono>
#include <filesystem>
#include <fstream>
#include <future>
#include <thread>
#include <unordered_set>
#include <meojson/json.hpp>
@@ -75,19 +72,12 @@ bool check_roguelike_replace_for_overseas(
const std::filesystem::path& output_dir);
bool update_version_info(const std::filesystem::path& input_dir, const std::filesystem::path& output_dir);
template <typename Func, typename... Args>
auto run_async(Func&& func, Args&&... args)
{
return std::async(std::launch::async, std::forward<Func>(func), std::forward<Args>(args)...);
}
int main([[maybe_unused]] int argc, char** argv)
{
// ---- PATH DECLARATION ----
const char* str_exec_path = argv[0];
const auto cur_path = std::filesystem::path(str_exec_path).parent_path();
std::vector<std::future<bool>> futures;
auto solution_dir = cur_path;
for (int i = 0; i != 10; ++i) {
@@ -112,88 +102,159 @@ int main([[maybe_unused]] int argc, char** argv)
// ---- METHODS CALLS ----
auto start = std::chrono::high_resolution_clock::now();
// Update stage.json from Penguin Stats
futures.push_back(run_async(update_stages_data, cur_path, resource_dir));
// Update infrast data from ArknightsGameResource
futures.push_back(run_async(update_infrast_data, official_data_dir / "gamedata" / "excel", resource_dir));
// Update infrast templates from ArknightsGameResource
futures.push_back(run_async(
update_infrast_templates,
official_data_dir / "building_skill",
resource_dir / "template" / "infrast"));
// Update battle chars info for all clients
futures.push_back(
run_async(update_battle_chars_info, official_data_dir / "gamedata" / "excel", overseas_data_dir, resource_dir));
// Update roguelike replace for overseas from ArknightsGameData_YoStar
for (const auto& [in, out] : global_dirs) {
futures.push_back(run_async(
check_roguelike_replace_for_overseas,
overseas_data_dir / in / "gamedata" / "excel",
resource_dir / "global" / out / "resource" / "tasks.json",
official_data_dir / "gamedata" / "excel",
cur_path / in));
// Update levels.json from ArknightsGameResource
std::cout << "------- Update levels.json for Official -------" << '\n';
if (!update_levels_json(official_data_dir / "levels.json", resource_dir / "Arknights-Tile-Pos")) {
std::cerr << "update levels.json failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
// Update version info from ArknightsGameData
futures.push_back(run_async(update_version_info, official_data_dir / "gamedata" / "excel", resource_dir));
// 这个 en_levels.json 是自己手动生成放进去的
// Will never work without en_levels.json in proj_dir, commented for now
// generate_english_roguelike_stage_name_replacement(official_data_dir / "levels.json", cur_path
// / "en_levels.json");
// Update global version info from ArknightsGameData_YoStar
for (const auto& [in, out] : global_dirs) {
futures.push_back(run_async(
update_version_info,
overseas_data_dir / in / "gamedata" / "excel",
resource_dir / "global" / out / "resource"));
// Update infrast data from ArknightsGameResource
std::cout << "------- Update infrast data for Official -------" << '\n';
if (!update_infrast_data(official_data_dir / "gamedata" / "excel", resource_dir)) {
std::cerr << "Update infrast data failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
// Update infrast templates from ArknightsGameResource
std::cout << "------- Update infrast templates for Official -------" << '\n';
if (!update_infrast_templates(official_data_dir / "building_skill", resource_dir / "template" / "infrast")) {
std::cerr << "Update infrast templates failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
// Update roguelike recruit data from ArknightsGameResource
// std::cout << "------- Update roguelike recruit data -------" << '\n';
// if (!update_roguelike_recruit(arkbot_res_dir, resource_dir, solution_dir)) {
// std::cerr << "Update roguelike recruit data failed" << '\n';
// return -1;
// } else {
// std::cout << "Done" << '\n';
//}
// Update base_name.json from Penguin Stats
std::cout << "------- Update stage.json for Official -------" << '\n';
if (!update_stages_data(cur_path, resource_dir)) {
std::cerr << "Update stages data failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
// Update battle chars info for all clients
std::cout << "------- Update battle chars info for all clients -------" << '\n';
if (!update_battle_chars_info(official_data_dir / "gamedata" / "excel", overseas_data_dir, resource_dir)) {
std::cerr << "Update battle chars info failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
// Update recruitment data from ArknightsGameResource
std::future<bool> a1 = run_async(
update_recruitment_data,
official_data_dir / "gamedata" / "excel",
resource_dir / "recruitment.json",
true);
// Update items template and json from ArknightsGameResource
std::future<bool> a2 = run_async(update_items_data, official_data_dir, resource_dir, true);
if (!a1.get() || !a2.get()) {
std::cerr << "One of the dependent tasks in group A failed" << '\n';
std::cout << "------- Update recruitment data for Official -------" << '\n';
if (!update_recruitment_data(official_data_dir / "gamedata" / "excel", resource_dir / "recruitment.json", true)) {
std::cerr << "Update recruitment data failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
// Update recruitment data from ArknightsGameData_YoStar
for (const auto& [in, out] : global_dirs) {
futures.push_back(run_async(
update_recruitment_data,
overseas_data_dir / in / "gamedata" / "excel",
resource_dir / "global" / out / "resource" / "recruitment.json",
false));
std::cout << "------- Update recruitment data for " << out << "------- " << '\n';
if (!update_recruitment_data(
overseas_data_dir / in / "gamedata" / "excel",
resource_dir / "global" / out / "resource" / "recruitment.json",
false)) {
std::cerr << "Update recruitment data failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
}
// Update items template and json from ArknightsGameResource
std::cout << "------- Update items template and json for Official -------" << '\n';
if (!update_items_data(official_data_dir, resource_dir)) {
std::cerr << "Update items data failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
// Update items template and json from ArknightsGameData_YoStar
for (const auto& [in, out] : global_dirs) {
futures.push_back(run_async(
update_items_data,
overseas_data_dir / in / "gamedata" / "excel",
resource_dir / "global" / out / "resource",
false));
}
for (auto& future : futures) {
if (!future.get()) {
std::cerr << "One of the updates failed" << '\n';
std::cout << "------- Update items template and json for " << out << "------- " << '\n';
if (!update_items_data(
overseas_data_dir / in / "gamedata" / "excel",
resource_dir / "global" / out / "resource",
false)) {
std::cerr << "Update items json failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
std::cout << "Time: " << elapsed_seconds.count() << "s" << '\n';
// Update roguelike replace for overseas from ArknightsGameData_YoStar
for (const auto& [in, out] : global_dirs) {
std::cout << "------- Update roguelike replace for " << out << "------- " << '\n';
if (!check_roguelike_replace_for_overseas(
overseas_data_dir / in / "gamedata" / "excel",
resource_dir / "global" / out / "resource" / "tasks.json",
official_data_dir / "gamedata" / "excel",
cur_path / in)) {
std::cerr << "Update roguelike replace for overseas failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
}
// Update version info from ArknightsGameData
std::cout << "------- Update version info for Official -------" << '\n';
if (!update_version_info(official_data_dir / "gamedata" / "excel", resource_dir)) {
std::cerr << "Update version info failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
// Update global version info from ArknightsGameData_YoStar
for (const auto& [in, out] : global_dirs) {
std::cout << "------- Update version info for " << out << "------- " << '\n';
if (!update_version_info(
overseas_data_dir / in / "gamedata" / "excel",
resource_dir / "global" / out / "resource")) {
std::cerr << "Update version info failed" << '\n';
return -1;
}
else {
std::cout << "Done" << '\n';
}
}
std::cout << "------- All success -------" << '\n';
return 0;
@@ -205,6 +266,7 @@ bool update_items_data(const std::filesystem::path& input_dir, const std::filesy
{
const auto input_json_path =
with_imgs ? input_dir / "gamedata" / "excel" / "item_table.json" : input_dir / "item_table.json";
auto parse_ret = json::open(input_json_path);
if (!parse_ret) {
std::cerr << "parse json failed" << '\n';
@@ -500,6 +562,8 @@ bool update_stages_data(const std::filesystem::path& input_dir, const std::files
const std::string PenguinAPI = R"(https://penguin-stats.io/PenguinStats/api/v2/stages?server=)";
const std::vector<std::string> PenguinServers = { "CN", "US", "JP", "KR" };
const std::filesystem::path TempFile = input_dir / "stages.json";
struct DropInfo
{
std::string item_id;
@@ -512,35 +576,16 @@ bool update_stages_data(const std::filesystem::path& input_dir, const std::files
std::map<std::string, std::set<DropInfo>> drop_infos;
std::map<std::string, json::value> stage_basic_infos;
auto fetch_and_parse = [&](const std::string& server) -> bool {
std::filesystem::path temp_file = input_dir / ("stages_" + server + ".json");
int stage_request_ret = system(("curl -o \"" + temp_file.string() + "\" " + PenguinAPI + server).c_str());
for (const auto& server : PenguinServers) {
int stage_request_ret = system(("curl -o \"" + TempFile.string() + "\" " + PenguinAPI + server).c_str());
if (stage_request_ret != 0) {
std::cerr << "Request Penguin Stats failed for server: " << server << '\n';
std::cerr << "Request Penguin Stats failed" << '\n';
return false;
}
return true;
};
std::vector<std::future<bool>> futures;
for (const auto& server : PenguinServers) {
futures.push_back(std::async(std::launch::async, fetch_and_parse, server));
}
for (auto& future : futures) {
if (!future.get()) {
std::cerr << "One of the updates failed" << '\n';
return false;
}
}
// Merge data from all temporary files sequentially
for (const auto& server : PenguinServers) {
std::filesystem::path temp_file = input_dir / ("stages_" + server + ".json");
auto parse_ret = json::open(temp_file);
auto parse_ret = json::open(TempFile);
if (!parse_ret) {
std::cerr << "parse stages.json failed for server: " << server << '\n';
std::cerr << "parse stages.json failed" << '\n';
return false;
}
auto& stage_json = parse_ret.value();