Minor refactoring
This commit is contained in:
1 parent
4cc6971542
commit
dca38c986d
6 files changed
+93
-104
No files matched your search
@@ -57,9 +57,11 @@ namespace ZL {
|
||||
return rot;
|
||||
}
|
||||
|
||||
PlanetObject::PlanetObject()
|
||||
PlanetObject::PlanetObject(Renderer& iRenderer, TaskManager& iTaskManager, MainThreadHandler& iMainThreadHandler)
|
||||
: renderer(iRenderer),
|
||||
taskManager(iTaskManager),
|
||||
mainThreadHandler(iMainThreadHandler)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void PlanetObject::init() {
|
||||
@@ -101,7 +103,7 @@ namespace ZL {
|
||||
float movementThreshold = 1.0f;
|
||||
if ((Environment::shipPosition - lastUpdatePos).squaredNorm() < movementThreshold * movementThreshold
|
||||
&& !triangleIndicesToDraw.empty()) {
|
||||
processMainThreadTasks(); // Все равно обрабатываем очередь OpenGL задач
|
||||
//processMainThreadTasks(); // Все равно обрабатываем очередь OpenGL задач
|
||||
return;
|
||||
}
|
||||
lastUpdatePos = Environment::shipPosition;
|
||||
@@ -117,13 +119,13 @@ namespace ZL {
|
||||
planetStones.statuses[triIdx] = ChunkStatus::Generating;
|
||||
|
||||
// Отправляем тяжелую математику в TaskManager
|
||||
taskManager->EnqueueBackgroundTask([this, triIdx]() {
|
||||
taskManager.EnqueueBackgroundTask([this, triIdx]() {
|
||||
// Выполняется в фоновом потоке: только генерация геометрии в RAM
|
||||
float scaleModifier = 1.0f;
|
||||
VertexDataStruct generatedData = planetStones.inflateOneDataOnly(triIdx, scaleModifier);
|
||||
|
||||
// Передаем задачу на загрузку в GPU в очередь главного потока
|
||||
this->EnqueueMainThreadTask([this, triIdx, data = std::move(generatedData)]() mutable {
|
||||
this->mainThreadHandler.EnqueueMainThreadTask([this, triIdx, data = std::move(generatedData)]() mutable {
|
||||
// Проверяем актуальность: если треугольник всё еще в списке видимых
|
||||
auto it = std::find(triangleIndicesToDraw.begin(), triangleIndicesToDraw.end(), triIdx);
|
||||
if (it != triangleIndicesToDraw.end()) {
|
||||
@@ -164,22 +166,7 @@ namespace ZL {
|
||||
triangleIndicesToDraw = std::move(newIndices);
|
||||
|
||||
// 5. Выполняем одну задачу из очереди OpenGL (RefreshVBO и т.д.)
|
||||
processMainThreadTasks();
|
||||
/*
|
||||
float movementThreshold = 1.0f;
|
||||
if ((Environment::shipPosition - lastUpdatePos).squaredNorm() < movementThreshold * movementThreshold && !triangleIndicesToDraw.empty()) {
|
||||
return;
|
||||
}
|
||||
lastUpdatePos = Environment::shipPosition;
|
||||
|
||||
auto newIndices = planetData.getTrianglesUnderCameraNew2(Environment::shipPosition);
|
||||
|
||||
// Сортировка важна для сравнения векторов
|
||||
std::sort(newIndices.begin(), newIndices.end());
|
||||
|
||||
if (newIndices != triangleIndicesToDraw) {
|
||||
triangleIndicesToDraw = std::move(newIndices);
|
||||
}*/
|
||||
//processMainThreadTasks();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
namespace ZL {
|
||||
class TaskManager;
|
||||
class MainThreadHandler;
|
||||
|
||||
class PlanetObject {
|
||||
public:
|
||||
@@ -42,10 +43,12 @@ namespace ZL {
|
||||
|
||||
Vector3f lastUpdatePos;
|
||||
|
||||
TaskManager* taskManager = nullptr;
|
||||
|
||||
// External items, set outside
|
||||
Renderer& renderer;
|
||||
TaskManager& taskManager;
|
||||
MainThreadHandler& mainThreadHandler;
|
||||
public:
|
||||
PlanetObject();
|
||||
PlanetObject(Renderer& iRenderer, TaskManager& iTaskManager, MainThreadHandler& iMainThreadHandler);
|
||||
|
||||
void init();
|
||||
void update(float deltaTimeMs);
|
||||
@@ -56,32 +59,6 @@ namespace ZL {
|
||||
void drawAtmosphere(Renderer& renderer);
|
||||
|
||||
float distanceToPlanetSurface(const Vector3f& viewerPosition);
|
||||
|
||||
std::queue<std::function<void()>> mainThreadTasks;
|
||||
std::mutex mainThreadMutex;
|
||||
|
||||
void EnqueueMainThreadTask(std::function<void()> task) {
|
||||
std::lock_guard<std::mutex> lock(mainThreadMutex);
|
||||
mainThreadTasks.push(task);
|
||||
}
|
||||
|
||||
// Выполнение задач по одной (или пачкой) за кадр
|
||||
void processMainThreadTasks() {
|
||||
std::function<void()> task;
|
||||
|
||||
// Извлекаем только одну задачу, чтобы не блокировать update надолго
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mainThreadMutex);
|
||||
if (!mainThreadTasks.empty()) {
|
||||
task = std::move(mainThreadTasks.front());
|
||||
mainThreadTasks.pop();
|
||||
}
|
||||
}
|
||||
|
||||
if (task) {
|
||||
task(); // Здесь выполняется RefreshVBO или загрузка текстуры
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace ZL
|
||||
Reference in new issue
Block a user