GlBufferData, похоже, хранит данные вершин в оперативной памяти.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 GlBufferData, похоже, хранит данные вершин в оперативной памяти.

Сообщение Anonymous »

Я создаю средство рендеринга, подобное Minecraft, с помощью C++ и OpenGL.
Это означает, что я разделяю мир на фрагменты и загружаю/выгружаю новые фрагменты при перемещении по миру.
Когда фрагмент загружается, я создаю сетку для него и загрузите сетку во VRAM с помощью glBufferData.
Проблема в том, что использование OpenGL значительно увеличивает использование оперативной памяти (удаление вызова glBufferData позволяет избежать увеличение использования памяти). Я также заметил, что увеличение использования оперативной памяти равно использованию видеопамяти моей программы. Это действительно очень много, учитывая, что я знаю, что мне никогда не понадобятся данные вершин обратно в ЦП. Я просто рендерю его, пока он не будет удален из VRAM.
На всякий случай вот код:

Код: Выделить всё

struct ChunkMesh {
GLuint vao{};
GLuint vbo{};
int vertexCount{};
};

class ChunkMeshManager {
ChunkStorage &m_chunkStorage;
ChunkMesher &m_mesher;

std::unordered_map m_meshes;
public:
void update(const ChunkDelta &delta) {
for (auto &pos: delta.m_toLoad) {
if (m_meshes.contains(pos)) {
throw std::runtime_error("Mesh already loaded");
}
ChunkMesh mesh;

glGenVertexArrays(1, &mesh.vao);
glBindVertexArray(mesh.vao);

glGenBuffers(1, &mesh.vbo);
glBindBuffer(GL_ARRAY_BUFFER, mesh.vbo);
auto vertices = m_mesher.getMesh(
m_chunkStorage.getChunk(pos),
pos,
m_chunkStorage.getChunkPtr(pos - glm::ivec3(CHUNK_SIZE, 0, 0)),
m_chunkStorage.getChunkPtr(pos + glm::ivec3(CHUNK_SIZE, 0, 0)),
m_chunkStorage.getChunkPtr(pos - glm::ivec3(0, CHUNK_SIZE, 0)),
m_chunkStorage.getChunkPtr(pos + glm::ivec3(0, CHUNK_SIZE, 0)),
m_chunkStorage.getChunkPtr(pos - glm::ivec3(0, 0, CHUNK_SIZE)),
m_chunkStorage.getChunkPtr(pos + glm::ivec3(0, 0, CHUNK_SIZE))
);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_STATIC_DRAW);
mesh.vertexCount = vertices.size();

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, m_position));
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, m_textureCoords));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, m_normal));
glEnableVertexAttribArray(2);

m_meshes.emplace(pos, mesh);
}

for (auto &pos: delta.m_toUnload) {
if (!m_meshes.contains(pos)) {
throw std::runtime_error("Trying to unload non-existing mesh");
}
ChunkMesh &mesh = m_meshes.at(pos);
glDeleteVertexArrays(1, &mesh.vao);
glDeleteBuffers(1, &mesh.vbo);
m_meshes.erase(pos);
}
}

ChunkMeshManager(ChunkStorage &chunkStorage, ChunkMesher &chunkMesher) : m_chunkStorage(chunkStorage),
m_mesher(chunkMesher) {}

void forEachMesh(const std::function &cb) {
for (auto &[pos, mesh]: m_meshes) {
cb(mesh);
}
}
};
Можно ли что-нибудь сделать (или исправить), чтобы он не использовал так много оперативной памяти?

Подробнее здесь: https://stackoverflow.com/questions/784 ... ata-in-ram
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»