diff --git a/src/vht/Drawer.cppm b/src/vht/Drawer.cppm
index a00249f..282064e 100644
--- a/src/vht/Drawer.cppm
+++ b/src/vht/Drawer.cppm
@@ -14,6 +14,7 @@ import CommandPool;
 import InputAssembly;
 import UniformBuffer;
 import Descriptor;
+import QueryPool;
 
 export namespace vht {
 
@@ -47,6 +48,7 @@ export namespace vht {
         std::shared_ptr<vht::InputAssembly> m_input_assembly{ nullptr };
         std::shared_ptr<vht::UniformBuffer> m_uniform_buffer{ nullptr };
         std::shared_ptr<vht::Descriptor> m_descriptor{ nullptr };
+        std::shared_ptr<vht::QueryPool> m_query_pool{ nullptr };
         std::vector<vk::raii::Semaphore> m_image_available_semaphores;
         std::vector<vk::raii::Semaphore> m_render_finished_semaphores;
         std::vector<vk::raii::Fence> m_in_flight_fences;
@@ -63,7 +65,8 @@ export namespace vht {
             std::shared_ptr<vht::CommandPool> command_pool,
             std::shared_ptr<vht::InputAssembly> input_assembly,
             std::shared_ptr<vht::UniformBuffer> uniform_buffer,
-            std::shared_ptr<vht::Descriptor> descriptor
+            std::shared_ptr<vht::Descriptor> descriptor,
+            std::shared_ptr<vht::QueryPool> query_pool
         ):  m_data_loader(std::move(data_loader)),
             m_window(std::move(window)),
             m_device(std::move(device)),
@@ -73,7 +76,8 @@ export namespace vht {
             m_command_pool(std::move(command_pool)),
             m_input_assembly(std::move(input_assembly)),
             m_uniform_buffer(std::move(uniform_buffer)),
-            m_descriptor(std::move(descriptor)) {
+            m_descriptor(std::move(descriptor)),
+            m_query_pool(std::move(query_pool)) {
             init();
         }
 
@@ -128,6 +132,14 @@ export namespace vht {
             }
             // 更新飞行中的帧索引
             m_current_frame = (m_current_frame + 1) % MAX_FRAMES_IN_FLIGHT;
+
+            m_device->graphics_queue().waitIdle();
+            static int counter = 0;
+            if( ++counter % 2500 == 0 ){ // 2500 帧输出一次，可自行调整
+                m_query_pool->print_delta_time(); // 输出单次绘制耗时
+                m_query_pool->print_statistics();
+                m_query_pool->print_occlusion();
+            }
         }
 
     private:
@@ -161,6 +173,27 @@ export namespace vht {
         void record_command_buffer(const vk::raii::CommandBuffer& command_buffer, const std::uint32_t image_index) const {
             command_buffer.begin( vk::CommandBufferBeginInfo{} );
 
+            command_buffer.resetQueryPool( m_query_pool->occlusion(), 0, 1 );
+            command_buffer.beginQuery(m_query_pool->occlusion(), 0);
+
+            command_buffer.resetQueryPool( m_query_pool->statistics(), 0, 1 );
+            command_buffer.beginQuery(m_query_pool->statistics(), 0); // 绑定管线统计信息查询
+
+            command_buffer.resetQueryPool( m_query_pool->timestamp(), 0, 2 );
+            command_buffer.writeTimestamp( // 在管线顶部写入时间戳
+                vk::PipelineStageFlagBits::eTopOfPipe,
+                m_query_pool->timestamp(), // 查询池
+                0   // 查询池内部的查询索引
+            );
+            // 你可以使用 `writeTimestamp2` ，这需要启用 `synchronization2` 特性
+            // command_buffer.writeTimestamp2(
+            //     vk::PipelineStageFlagBits2::eNone,
+            //     m_query_pool->timestamp(), // 查询池
+            //     0   // 查询池内部的查询索引
+            // );
+            // 重置查询池，起始索引 0， 数量 1
+
+
             vk::RenderPassBeginInfo render_pass_begin_info;
             render_pass_begin_info.renderPass = m_render_pass->render_pass();
             render_pass_begin_info.framebuffer = m_render_pass->framebuffers()[image_index];
@@ -210,6 +243,14 @@ export namespace vht {
             command_buffer.drawIndexed(static_cast<std::uint32_t>(m_data_loader->indices().size()), 1, 0, 0, 0);
 
             command_buffer.endRenderPass();
+
+            command_buffer.writeTimestamp( // 在命令最后写入时间戳
+                vk::PipelineStageFlagBits::eBottomOfPipe,
+                m_query_pool->timestamp(), 1 // 索引 1
+            );
+            command_buffer.endQuery(m_query_pool->statistics(), 0);
+            command_buffer.endQuery(m_query_pool->occlusion(), 0);
+
             command_buffer.end();
         }
     };
