Какова цель:
Я относительно новичок в многопоточности. Я пытался сделать ландшафт с рендерингом Quad-Tree, который будет рендериться быстро и эффективно. Количество рельефа, отображаемого в настоящее время, значительно отставало бы от пользователя, если бы все было максимально подробно. Вот почему я использовал QuadTree для его рендеринга. Движок также поддерживает ввод и физику, поэтому я решил использовать поток рендеринга. Это вызвало множество проблем.
Проблема(-ы): когда я не запускал потоки, возникало небольшое отставание из-за других систем в движке. Основная причина лагов - загрузка и удаление ландшафта в QuadTree (я даже не уверен, что это оптимальный способ сделать это). Теперь рендеринг происходит очень быстро и вроде не лагает. Когда камера стоит на месте, игра идет нормально. Я оставил игру включенной на час, и никаких сбоев не было обнаружено.
Когда ландшафт загружается, он использует несколько переменных, которые использует код рендеринга. А именно привязка буферов -
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec2), &uvs[0], GL_STATIC_DRAW);
Я считаю, что доступ к этой переменной осуществляется одновременно с другим потоком. Что вызывает сбой. Как это исправить? Я пытался использовать мьютексы, но это, похоже, не работает. Где я могу заблокировать и разблокировать мьютекс, чтобы исправить это?
Другая переменная, которая, похоже, вызывает ту же ошибку, — «IsLeaf».
Другой сбой (std::badAlloc) происходит после загрузки большого количества ландшафта. Несмотря на то, что его убирают. Я предполагаю, что это связано с моим кодом удаления, но я не знаю, что не так.
В настоящее время я добавляю и удаляю плитки, проверяя диапазон с камеры и удаляя/создавая плитку. Я хочу отобразить плитку, на которой я нахожусь, и те, что вокруг нее. Однако это не работает при переходе с одной из 4 основных плиток. Создание с использованием диапазона не работает, так как это диапазон до центра большой плитки, а не меньших. Я также пытался удалять всю карту каждые несколько секунд, и это тоже работает, но с большей задержкой. Есть ли лучший способ сделать созидание и разрушение?
Между разными разрешениями есть зазоры. Можно ли как-то их уменьшить? В настоящее время я отображаю плитки немного больше, чем они должны быть, но это не помогает при значительных изменениях разрешения.
Если у вас есть идеи, как исправить одну из этих ошибок, мы будем очень признательны.
Код (слишком много для загрузки сюда)