diff --git a/src/vht/GraphicsPipeline.cppm b/src/vht/GraphicsPipeline.cppm
index f6a8481..296a225 100644
--- a/src/vht/GraphicsPipeline.cppm
+++ b/src/vht/GraphicsPipeline.cppm
@@ -28,6 +28,7 @@ export namespace vht {
         std::shared_ptr<vht::Device> m_device;
         std::shared_ptr<vht::RenderPass> m_render_pass;
         std::vector<vk::raii::DescriptorSetLayout> m_descriptor_set_layouts;
+        vk::raii::PipelineCache m_pipeline_cache{ nullptr };
         vk::raii::PipelineLayout m_pipeline_layout{ nullptr };
         vk::raii::Pipeline m_pipeline{ nullptr };
     public:
@@ -47,8 +48,34 @@ export namespace vht {
     private:
         void init() {
             create_descriptor_set_layout();
+            create_pipeline_cache();
             create_graphics_pipeline();
+            save_pipeline_cache();
         }
+
+        void create_pipeline_cache() {
+            vk::PipelineCacheCreateInfo pipelineCacheInfo;
+            std::vector<char> data;
+            if (std::ifstream in("pipeline_cache.data", std::ios::binary | std::ios::ate);
+                in
+            ) {
+                const std::size_t size = in.tellg();
+                in.seekg(0);
+                data.resize(size);
+                in.read(data.data(), size);
+                pipelineCacheInfo.setInitialData<char>(data);
+                std::println("Pipeline cache loaded from file.");
+            }
+            m_pipeline_cache = m_device->device().createPipelineCache(pipelineCacheInfo);
+        }
+
+        void save_pipeline_cache() const {
+            // std::vector<::uint8_t>
+            const auto cacheData = m_pipeline_cache.getData();
+            std::ofstream out("pipeline_cache.data", std::ios::binary);
+            out.write(reinterpret_cast<const char*>(cacheData.data()), cacheData.size());
+        }
+
         // 创建描述符集布局
         void create_descriptor_set_layout() {
             vk::DescriptorSetLayoutBinding uboLayoutBinding;
@@ -161,7 +188,7 @@ export namespace vht {
             create_info.renderPass = m_render_pass->render_pass();
             create_info.subpass = 0;
 
-            m_pipeline = m_device->device().createGraphicsPipeline( nullptr, create_info );
+            m_pipeline = m_device->device().createGraphicsPipeline( m_pipeline_cache, create_info );
         }
     };
 }
