实现温度系统CPU-GPU双向同步及调试功能
功能改进: - HeatRegion后自动上传温度数据到GPU - Tick中GPU计算后自动下载温度数据到CPU - DownloadTemperatureDataFromGPU回调中自动更新顶点颜色 调试功能: - HeatRegion后输出距离Hit点最近的4个体素温度 - 包含体素坐标、距离和温度信息,便于调试温度计算 配置优化: - 温度更新间隔从0.1秒调整为1.0秒,降低性能开销 技术细节: - 使用异步任务确保线程安全 - GPU数据上传前检查缓冲区就绪状态 - 完整的CPU↔GPU温度数据同步流程 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -78,9 +78,9 @@ void ADynamicIronBlock::Tick(float DeltaTime)
|
|||||||
// 重置计时器
|
// 重置计时器
|
||||||
TimeSinceLastUpdate = 0.0f;
|
TimeSinceLastUpdate = 0.0f;
|
||||||
|
|
||||||
// 下载数据并更新顶点颜色(可选,性能开销较大)
|
// 从GPU下载温度数据并更新顶点颜色
|
||||||
// DownloadTemperatureDataFromGPU();
|
DownloadTemperatureDataFromGPU();
|
||||||
// UpdateVertexColors();
|
// 注意:UpdateVertexColors()会在DownloadTemperatureDataFromGPU的回调中异步调用
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,6 +481,61 @@ void ADynamicIronBlock::HeatRegion(FVector WorldCenter, float Radius, float Temp
|
|||||||
UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Heated %d voxels in region (center: %s, radius: %.2f)"),
|
UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Heated %d voxels in region (center: %s, radius: %.2f)"),
|
||||||
AffectedVoxels, *LocalCenter.ToString(), Radius);
|
AffectedVoxels, *LocalCenter.ToString(), Radius);
|
||||||
|
|
||||||
|
// 调试:输出距离Hit点最近的4个体素的温度
|
||||||
|
struct FVoxelDebugInfo
|
||||||
|
{
|
||||||
|
FIntVector Coord;
|
||||||
|
float Distance;
|
||||||
|
float Temperature;
|
||||||
|
};
|
||||||
|
TArray<FVoxelDebugInfo> NearestVoxels;
|
||||||
|
|
||||||
|
// 查找最近的体素
|
||||||
|
for (int32 Z = MinZ; Z <= MaxZ; ++Z)
|
||||||
|
{
|
||||||
|
for (int32 Y = MinY; Y <= MaxY; ++Y)
|
||||||
|
{
|
||||||
|
for (int32 X = MinX; X <= MaxX; ++X)
|
||||||
|
{
|
||||||
|
FVector VoxelCenter = GridOrigin + FVector(
|
||||||
|
(X + 0.5f) * VoxelSizeCM.X,
|
||||||
|
(Y + 0.5f) * VoxelSizeCM.Y,
|
||||||
|
(Z + 0.5f) * VoxelSizeCM.Z
|
||||||
|
);
|
||||||
|
float Distance = FVector::Dist(VoxelCenter, LocalCenter);
|
||||||
|
|
||||||
|
int32 Index = GetTemperatureIndex(X, Y, Z);
|
||||||
|
FVoxelDebugInfo Info;
|
||||||
|
Info.Coord = FIntVector(X, Y, Z);
|
||||||
|
Info.Distance = Distance;
|
||||||
|
Info.Temperature = TemperatureGrid[Index].Temperature;
|
||||||
|
|
||||||
|
NearestVoxels.Add(Info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按距离排序
|
||||||
|
NearestVoxels.Sort([](const FVoxelDebugInfo& A, const FVoxelDebugInfo& B) {
|
||||||
|
return A.Distance < B.Distance;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 输出最近的4个体素
|
||||||
|
UE_LOG(LogTemp, Warning, TEXT("=== Nearest 4 Voxels to Hit Point ==="));
|
||||||
|
for (int32 i = 0; i < FMath::Min(4, NearestVoxels.Num()); ++i)
|
||||||
|
{
|
||||||
|
const FVoxelDebugInfo& Info = NearestVoxels[i];
|
||||||
|
UE_LOG(LogTemp, Warning, TEXT(" Voxel[%d,%d,%d] Distance=%.2fcm Temperature=%.1f°C"),
|
||||||
|
Info.Coord.X, Info.Coord.Y, Info.Coord.Z, Info.Distance, Info.Temperature);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将更新后的温度数据上传到GPU
|
||||||
|
if (bGPUBuffersReady.load(std::memory_order_acquire))
|
||||||
|
{
|
||||||
|
UploadTemperatureDataToGPU();
|
||||||
|
UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature data uploaded to GPU after HeatRegion"));
|
||||||
|
}
|
||||||
|
|
||||||
// 更新顶点颜色以显示温度变化
|
// 更新顶点颜色以显示温度变化
|
||||||
UpdateVertexColors();
|
UpdateVertexColors();
|
||||||
}
|
}
|
||||||
@@ -848,6 +903,9 @@ void ADynamicIronBlock::DownloadTemperatureDataFromGPU()
|
|||||||
}
|
}
|
||||||
|
|
||||||
UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature data downloaded from GPU"));
|
UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature data downloaded from GPU"));
|
||||||
|
|
||||||
|
// 更新顶点颜色以反映新的温度
|
||||||
|
UpdateVertexColors();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ private:
|
|||||||
|
|
||||||
bool bUseBufferA = true; // Ping-Pong标志
|
bool bUseBufferA = true; // Ping-Pong标志
|
||||||
float TimeSinceLastUpdate = 0.0f; // 距离上次温度更新的时间
|
float TimeSinceLastUpdate = 0.0f; // 距离上次温度更新的时间
|
||||||
float TemperatureUpdateInterval = 0.1f; // 温度更新间隔(秒)
|
float TemperatureUpdateInterval = 1.0f; // 温度更新间隔(秒)
|
||||||
|
|
||||||
// GPU缓冲区是否已准备好(线程安全标志)
|
// GPU缓冲区是否已准备好(线程安全标志)
|
||||||
std::atomic<bool> bGPUBuffersReady{false};
|
std::atomic<bool> bGPUBuffersReady{false};
|
||||||
|
|||||||
Reference in New Issue
Block a user