1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Use LocalVector for RingBuffer

Updated RingBuffer to use LocalVector instead of Vector, to avoid _copy_on_write overhead when writing to the buffer.
This commit is contained in:
aaronp64
2025-05-21 13:50:10 -04:00
parent be3ecaeb3c
commit 2a02cabe4d

View File

@@ -30,11 +30,11 @@
#pragma once #pragma once
#include "core/templates/vector.h" #include "core/templates/local_vector.h"
template <typename T> template <typename T>
class RingBuffer { class RingBuffer {
Vector<T> data; LocalVector<T> data;
int read_pos = 0; int read_pos = 0;
int write_pos = 0; int write_pos = 0;
int size_mask; int size_mask;
@@ -142,7 +142,7 @@ public:
Error write(const T &p_v) { Error write(const T &p_v) {
ERR_FAIL_COND_V(space_left() < 1, FAILED); ERR_FAIL_COND_V(space_left() < 1, FAILED);
data.write[inc(write_pos, 1)] = p_v; data[inc(write_pos, 1)] = p_v;
return OK; return OK;
} }
@@ -159,7 +159,7 @@ public:
int total = end - pos; int total = end - pos;
for (int i = 0; i < total; i++) { for (int i = 0; i < total; i++) {
data.write[pos + i] = p_buf[src++]; data[pos + i] = p_buf[src++];
} }
to_write -= total; to_write -= total;
pos = 0; pos = 0;
@@ -199,7 +199,7 @@ public:
data.resize(int64_t(1) << int64_t(p_power)); data.resize(int64_t(1) << int64_t(p_power));
if (old_size < new_size && read_pos > write_pos) { if (old_size < new_size && read_pos > write_pos) {
for (int i = 0; i < write_pos; i++) { for (int i = 0; i < write_pos; i++) {
data.write[(old_size + i) & mask] = data[i]; data[(old_size + i) & mask] = data[i];
} }
write_pos = (old_size + write_pos) & mask; write_pos = (old_size + write_pos) & mask;
} else { } else {