实现温度系统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;
|
||||
|
||||
// 下载数据并更新顶点颜色(可选,性能开销较大)
|
||||
// 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();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user