From 858e493b52006f953bd3711aa2c6401b0796e9cb Mon Sep 17 00:00:00 2001 From: Eladash <18193363+elad335@users.noreply.github.com> Date: Mon, 1 Jan 2024 09:13:16 +0200 Subject: [PATCH] Savestates/vm: Improve saving performance --- rpcs3/Emu/Memory/vm.cpp | 8 ++++---- rpcs3/util/serialization.hpp | 10 +++------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 3b2ee3fe89..4397dffc53 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -1665,13 +1665,13 @@ namespace vm ar.breathe(); - for (usz iter_count = 0; size; iter_count++, ptr += byte_of_pages) + for (usz iter_count = 0; size; iter_count += sizeof(u32), ptr += byte_of_pages * sizeof(u32)) { - size -= byte_of_pages; + const u32 bitmap = read_from_ptr>(bit_array, iter_count); - const u8 bitmap = bit_array[iter_count]; + size -= byte_of_pages * sizeof(bitmap); - for (usz i = 0; i < byte_of_pages;) + for (usz i = 0; i < byte_of_pages * sizeof(bitmap);) { usz block_count = 0; diff --git a/rpcs3/util/serialization.hpp b/rpcs3/util/serialization.hpp index ca410d0096..16b164c69e 100644 --- a/rpcs3/util/serialization.hpp +++ b/rpcs3/util/serialization.hpp @@ -109,11 +109,7 @@ public: // Reserve memory for serialization void reserve(usz size) { - // Is a NO-OP for deserialization in order to allow usage from serialization specializations regardless - if (is_writing()) - { - data.reserve(data.size() + size); - } + data.reserve(data.size() + size); } template requires (std::is_convertible_v, const void*>) @@ -136,9 +132,9 @@ public: if (is_writing()) { - ensure(pos >= data_offset); + ensure(pos == data_offset + data.size()); const auto ptr = reinterpret_cast(memory_provider()); - data.insert(data.begin() + (pos - data_offset), ptr, ptr + size); + data.insert(data.end(), ptr, ptr + size); pos += size; return true; }