Manus에서 모든 스킬 실행
원클릭으로
원클릭으로
원클릭으로 Manus에서 모든 스킬 실행
시작하기mc-add-trace
스타0
포크0
업데이트2026년 5월 30일 04:31
为用户指定的代码范围增加perfetto追踪宏
설치
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SKILL.md
readonly메뉴
为用户指定的代码范围增加perfetto追踪宏
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
提升用户指定文件的代码风格,使其更优雅、复用性更高,并且符合项目规范和最佳实践。
将当前项目的代码与 Minecraft 原版代码对齐,确保功能和逻辑都能准确复刻 Minecraft。
认领并收敛项目代码中的一个TODO
参照mc源码,列出高质量计划,为项目实现新功能
| name | mc-add-trace |
| description | 为用户指定的代码范围增加perfetto追踪宏 |
为用户指定的代码范围增加perfetto追踪宏插桩。下面是一些最佳实践:
std::string ResourcePackList::normalizePath(const std::filesystem::path& path)
{
MC_TRACE_EVENT("client.resource", "ResourcePackList::normalizePath");
std::string result = path.string();
// 统一使用正斜杠
std::replace(result.begin(), result.end(), '\\', '/');
return result;
}
void NetworkClient::handleBlockUpdate(network::PacketDeserializer& deser)
{
auto result = network::BlockUpdatePacket::deserialize(deser);
if (result.failed()) {
spdlog::error("[NetworkClient::handleBlockUpdate] Failed to deserialize block update packet");
return;
}
auto& packet = result.value();
MC_TRACE_INSTANT("client.lighting",
"ReceiveBlockUpdate",
"pos",
fmt::format("({}, {}, {})", packet.x(), packet.y(), packet.z()),
"stateId",
packet.blockStateId(),
[flow = ::perfetto::Flow::ProcessScoped(BlockPos(packet.x(), packet.y(), packet.z()).toId())](
::perfetto::EventContext ctx) { flow(ctx); });
if (m_callbacks.onBlockUpdate) {
m_callbacks.onBlockUpdate(packet.x(), packet.y(), packet.z(), packet.blockStateId());
}
}
void ClientWorld::onLightUpdate(i32 chunkX,
i32 chunkZ,
i32 sectionY,
const std::vector<u8>& skyLight,
const std::vector<u8>& blockLight,
bool /*trustEdges*/
)
{
MC_TRACE_EVENT("client.lighting",
"ClientWorld::onLightUpdate",
"Section",
fmt::format("({}, {}, {})", chunkX, sectionY, chunkZ),
"SkyLightSize",
skyLight.size(),
"BlockLightSize",
blockLight.size(),
[flow = ::perfetto::Flow::ProcessScoped(SectionPos(chunkX, sectionY, chunkZ).toLong())](
::perfetto::EventContext ctx) { flow(ctx); });
const ChunkId id(chunkX, chunkZ);
ClientChunk* chunk = getChunk(id);
if (!chunk || !chunk->data) {
return;
}
ChunkSection* section = chunk->data->getSection(sectionY);
if (!section) {
return;
}
if (!skyLight.empty() && skyLight.size() == NibbleArray::BYTE_SIZE) {
section->skyLightNibble() = NibbleArray(skyLight);
}
if (!blockLight.empty() && blockLight.size() == NibbleArray::BYTE_SIZE) {
section->blockLightNibble() = NibbleArray(blockLight);
}
requestChunkMeshRebuild(id);
}
void MinecraftServer::initializeRegistries(bool registerEntities)
{
MC_TRACE_EVENT("server.initialization", "MinecraftServer::initializeRegistries");
// 注意,下面加trace的方式不推荐,建议进入相关函数,然后在函数内部顶部加trace,这样能避免外层函数全是trace,影响可读性。除非相关逻辑没有被封装为函数,时才可以在外层函数加trace。
// 初始化方块注册表
{
MC_TRACE_EVENT("server.initialization", "MinecraftServer::initializeRegistries::Blocks");
VanillaBlocks::initialize();
}
spdlog::info("Vanilla blocks initialized");
// 初始化物品注册表
{
MC_TRACE_EVENT("server.initialization", "MinecraftServer::initializeRegistries::Items");
Items::initialize();
}
spdlog::info("Vanilla items initialized");
// 初始化附魔注册表
{
MC_TRACE_EVENT("server.initialization", "MinecraftServer::initializeRegistries::Enchantments");
item::enchant::EnchantmentRegistry::initialize();
}
spdlog::info("Enchantments initialized");
// 初始化方块物品注册表
{
MC_TRACE_EVENT("server.initialization", "MinecraftServer::initializeRegistries::BlockItems");
BlockItemRegistry::instance().initializeVanillaBlockItems();
}
spdlog::info("Block items initialized");
// 初始化物品标签(必须在所有物品注册后)
{
MC_TRACE_EVENT("server.initialization", "MinecraftServer::initializeRegistries::ItemTags");
item::tag::ItemTags::initialize();
}
spdlog::info("Item tags initialized");
// 初始化发射器行为注册表
{
MC_TRACE_EVENT("server.initialization", "MinecraftServer::initializeRegistries::DispenseBehaviors");
blocks::DispenseItemBehaviorRegistry::instance().initDefaultBehaviors();
}
spdlog::info("Dispense item behaviors initialized");
}
\src\common\perfetto\TraceCategories.hpp中定义。尽可能复用这个文件中的定义,非必要不要增加定义。使用超出这个文件定义的类别会导致编译失败。类名::函数名的格式。perfetto::EventContext参数,用户可以在lambda中使用这个参数来触发Flow事件。Flow事件可以用来关联不同函数中的事件,方便在perfetto UI中分析调用关系。如果你追踪的函数参数中有可以用来唯一标识调用实例的信息(比如实体ID、区块位置、方块Pos等),建议使用这些信息来构造Flow ID,这样可以在perfetto UI中清晰地看到同一个实体或区块的事件是如何流转的。#include "common/perfetto/TraceEvents.hpp" 如果没有包含,则需要增加这个包含语句。开始修改代码之前,请先列出自己的修改计划,说明你打算在哪些文件的哪些函数中添加追踪宏。
代码编写结束之后,必须使用clang-format对你修改的文件进行格式化:
clang-format -i src\common\xxx\Foo.cpp
clang-format -i src\common\xxx\Foo.hpp
然后进行编译。