Skip to content

Commit 138e21e

Browse files
committed
Merge pull request #110169 from BlueCube3310/file-access-flush-opti
Optimize data flushing for `FileAccessCompressed` and `FileAccessEncrypted`
2 parents 00699ec + ebdf57f commit 138e21e

File tree

2 files changed

+18
-17
lines changed

2 files changed

+18
-17
lines changed

core/io/file_access_compressed.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,34 +130,37 @@ void FileAccessCompressed::_close() {
130130
f->store_32(0); //compressed sizes, will update later
131131
}
132132

133-
Vector<int> block_sizes;
133+
uint32_t last_block_size = write_max % block_size;
134+
135+
// Temporary buffer for compressed data blocks.
136+
LocalVector<uint8_t> temp_cblock;
137+
temp_cblock.resize(Compression::get_max_compressed_buffer_size(bc == 1 ? last_block_size : block_size, cmode));
138+
uint8_t *temp_cblock_ptr = temp_cblock.ptr();
139+
140+
// Compress and store the blocks.
141+
LocalVector<uint32_t> block_sizes;
134142
for (uint32_t i = 0; i < bc; i++) {
135-
uint32_t bl = i == (bc - 1) ? write_max % block_size : block_size;
143+
uint32_t bl = i == (bc - 1) ? last_block_size : block_size;
136144
uint8_t *bp = &write_ptr[i * block_size];
137145

138-
Vector<uint8_t> cblock;
139-
cblock.resize(Compression::get_max_compressed_buffer_size(bl, cmode));
140-
const int64_t compressed_size = Compression::compress(cblock.ptrw(), bp, bl, cmode);
146+
const int64_t compressed_size = Compression::compress(temp_cblock_ptr, bp, bl, cmode);
141147
ERR_FAIL_COND_MSG(compressed_size < 0, "FileAccessCompressed: Error compressing data.");
142148

143-
f->store_buffer(cblock.ptr(), (uint64_t)compressed_size);
149+
f->store_buffer(temp_cblock_ptr, (uint64_t)compressed_size);
144150
block_sizes.push_back(compressed_size);
145151
}
146152

147153
f->seek(16); //ok write block sizes
148154
for (uint32_t i = 0; i < bc; i++) {
149-
f->store_32(uint32_t(block_sizes[i]));
155+
f->store_32(block_sizes[i]);
150156
}
151157
f->seek_end();
152158
f->store_buffer((const uint8_t *)mgc.get_data(), mgc.length()); //magic at the end too
153-
154-
buffer.clear();
155-
156159
} else {
157160
comp_buffer.clear();
158-
buffer.clear();
159161
read_blocks.clear();
160162
}
163+
buffer.clear();
161164
f.unref();
162165
}
163166

core/io/file_access_encrypted.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ void FileAccessEncrypted::_close() {
140140
}
141141

142142
if (writing) {
143-
Vector<uint8_t> compressed;
143+
LocalVector<uint8_t> compressed;
144144
uint64_t len = data.size();
145145
if (len % 16) {
146146
len += 16 - (len % 16);
@@ -150,10 +150,8 @@ void FileAccessEncrypted::_close() {
150150
ERR_FAIL_COND(CryptoCore::md5(data.ptr(), data.size(), hash) != OK); // Bug?
151151

152152
compressed.resize(len);
153-
memset(compressed.ptrw(), 0, len);
154-
for (int i = 0; i < data.size(); i++) {
155-
compressed.write[i] = data[i];
156-
}
153+
memcpy(compressed.ptr(), data.ptr(), data.size());
154+
memset(compressed.ptr() + data.size(), 0, len - data.size());
157155

158156
CryptoCore::AESContext ctx;
159157
ctx.set_encode_key(key.ptrw(), 256);
@@ -166,7 +164,7 @@ void FileAccessEncrypted::_close() {
166164
file->store_64(data.size());
167165
file->store_buffer(iv.ptr(), 16);
168166

169-
ctx.encrypt_cfb(len, iv.ptrw(), compressed.ptrw(), compressed.ptrw());
167+
ctx.encrypt_cfb(len, iv.ptrw(), compressed.ptr(), compressed.ptr());
170168

171169
file->store_buffer(compressed.ptr(), compressed.size());
172170
data.clear();

0 commit comments

Comments
 (0)