实现温度系统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:
zhangqing
2025-12-08 18:15:19 +08:00
parent 33d0ff62de
commit dd16f0123a
2 changed files with 62 additions and 4 deletions
+61 -3
View File
@@ -78,9 +78,9 @@ void ADynamicIronBlock::Tick(float DeltaTime)
// 重置计时器
TimeSinceLastUpdate = 0.0f;
// 下载数据并更新顶点颜色(可选,性能开销较大)
// DownloadTemperatureDataFromGPU();
// UpdateVertexColors();
// 从GPU下载温度数据并更新顶点颜色
DownloadTemperatureDataFromGPU();
// 注意: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)"),
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();
}
@@ -848,6 +903,9 @@ void ADynamicIronBlock::DownloadTemperatureDataFromGPU()
}
UE_LOG(LogTemp, Log, TEXT("DynamicIronBlock: Temperature data downloaded from GPU"));
// 更新顶点颜色以反映新的温度
UpdateVertexColors();
});
});
}
+1 -1
View File
@@ -257,7 +257,7 @@ private:
bool bUseBufferA = true; // Ping-Pong标志
float TimeSinceLastUpdate = 0.0f; // 距离上次温度更新的时间
float TemperatureUpdateInterval = 0.1f; // 温度更新间隔(秒)
float TemperatureUpdateInterval = 1.0f; // 温度更新间隔(秒)
// GPU缓冲区是否已准备好(线程安全标志)
std::atomic<bool> bGPUBuffersReady{false};