From 0d2a23254e70a54aeb5e62c8536b91090055bc40 Mon Sep 17 00:00:00 2001 From: obligaron Date: Sat, 25 Jun 2022 22:19:37 +0200 Subject: [PATCH] Use binaryformat for demofile (#4799) --- Source/engine/demomode.cpp | 80 ++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/Source/engine/demomode.cpp b/Source/engine/demomode.cpp index 0505ce53a..688769dd4 100644 --- a/Source/engine/demomode.cpp +++ b/Source/engine/demomode.cpp @@ -42,8 +42,8 @@ uint32_t DemoModeLastTick = 0; int LogicTick = 0; int StartTime = 0; -int DemoGraphicsWidth = 640; -int DemoGraphicsHeight = 480; +uint16_t DemoGraphicsWidth = 640; +uint16_t DemoGraphicsHeight = 480; void PumpDemoMessage(DemoMsgType demoMsgType, uint32_t message, int32_t wParam, int32_t lParam, float progressToNextGameTick) { @@ -57,53 +57,50 @@ void PumpDemoMessage(DemoMsgType demoMsgType, uint32_t message, int32_t wParam, Demo_Message_Queue.push_back(msg); } +template +T ReadFromStream(std::ifstream &stream) +{ + T value; + stream.read(reinterpret_cast(&value), sizeof(value)); + return value; +} + +template +void WriteToDemo(T value) +{ + DemoRecording.write(reinterpret_cast(&value), sizeof(value)); +} + bool LoadDemoMessages(int i) { std::ifstream demofile; char demoFilename[16]; snprintf(demoFilename, 15, "demo_%d.dmo", i); - demofile.open(paths::PrefPath() + demoFilename); + demofile.open(paths::PrefPath() + demoFilename, std::fstream::binary); if (!demofile.is_open()) { return false; } - std::string line; - std::getline(demofile, line); - std::stringstream header(line); - - std::string number; - std::getline(header, number, ','); // Demo version - if (std::stoi(number) != 0) { + uint8_t version = ReadFromStream(demofile); + if (version != 0) { return false; } - std::getline(header, number, ','); - gSaveNumber = std::stoi(number); - - std::getline(header, number, ','); - DemoGraphicsWidth = std::stoi(number); - - std::getline(header, number, ','); - DemoGraphicsHeight = std::stoi(number); - - while (std::getline(demofile, line)) { - std::stringstream command(line); + gSaveNumber = ReadFromStream(demofile); + DemoGraphicsWidth = ReadFromStream(demofile); + DemoGraphicsHeight = ReadFromStream(demofile); - std::getline(command, number, ','); - int typeNum = std::stoi(number); + while (!demofile.eof()) { + uint32_t typeNum = ReadFromStream(demofile); auto type = static_cast(typeNum); - std::getline(command, number, ','); - float progressToNextGameTick = std::stof(number); + float progressToNextGameTick = ReadFromStream(demofile); switch (type) { case DemoMsgType::Message: { - std::getline(command, number, ','); - uint32_t message = std::stoi(number); - std::getline(command, number, ','); - int32_t wParam = std::stoi(number); - std::getline(command, number, ','); - int32_t lParam = std::stoi(number); + uint32_t message = ReadFromStream(demofile); + int32_t wParam = ReadFromStream(demofile); + int32_t lParam = ReadFromStream(demofile); PumpDemoMessage(type, message, wParam, lParam, progressToNextGameTick); break; } @@ -253,14 +250,19 @@ bool FetchMessage(tagMSG *lpMsg) void RecordGameLoopResult(bool runGameLoop) { - DemoRecording << static_cast(runGameLoop ? DemoMsgType::GameTick : DemoMsgType::Rendering) << "," << gfProgressToNextGameTick << "\n"; + WriteToDemo(static_cast(runGameLoop ? DemoMsgType::GameTick : DemoMsgType::Rendering)); + WriteToDemo(gfProgressToNextGameTick); } void RecordMessage(tagMSG *lpMsg) { if (!gbRunGame || !DemoRecording.is_open()) return; - DemoRecording << static_cast(DemoMsgType::Message) << "," << gfProgressToNextGameTick << "," << lpMsg->message << "," << lpMsg->wParam << "," << lpMsg->lParam << "\n"; + WriteToDemo(static_cast(DemoMsgType::Message)); + WriteToDemo(gfProgressToNextGameTick); + WriteToDemo(lpMsg->message); + WriteToDemo(lpMsg->wParam); + WriteToDemo(lpMsg->lParam); } void NotifyGameLoopStart() @@ -268,8 +270,12 @@ void NotifyGameLoopStart() if (IsRecording()) { char demoFilename[16]; snprintf(demoFilename, 15, "demo_%d.dmo", RecordNumber); - DemoRecording.open(paths::PrefPath() + demoFilename, std::fstream::trunc); - DemoRecording << "0," << gSaveNumber << "," << gnScreenWidth << "," << gnScreenHeight << "\n"; + DemoRecording.open(paths::PrefPath() + demoFilename, std::fstream::trunc | std::fstream::binary); + constexpr uint8_t version = 0; + WriteToDemo(version); + WriteToDemo(gSaveNumber); + WriteToDemo(gnScreenWidth); + WriteToDemo(gnScreenHeight); } if (IsRunning()) { @@ -290,8 +296,8 @@ void NotifyGameLoopEnd() } if (IsRunning()) { - float secounds = (SDL_GetTicks() - StartTime) / 1000.0; - SDL_Log("%d frames, %.2f seconds: %.1f fps", LogicTick, secounds, LogicTick / secounds); + float seconds = (SDL_GetTicks() - StartTime) / 1000.0f; + SDL_Log("%d frames, %.2f seconds: %.1f fps", LogicTick, seconds, LogicTick / seconds); gbRunGameResult = false; gbRunGame = false;