- 博客(55)
- 资源 (2)
- 收藏
- 关注
原创 Vulkan模型查看器设计:相机类与三维变换
Camera.hpublic:// 相机位置// 相机前向向量// 相机上方向// 相机右向量// 世界坐标系上方向float yaw;// 偏航角// 俯仰角float fovy;// 垂直视场角float near;// 近面float far;// 远面// 移动速度// 鼠标敏感度// 相机移动方向// 操作模式// 初始化// 获取视图矩阵// 获取投影矩阵// 设置交互模式// 处理键盘操作// 处理了鼠标移动// 处理缩放。
2025-06-27 20:02:56
1010
原创 Vulkan多管线渲染与绘制世界坐标轴Axis
可以在初始化过程中设置多套不同的管线缓存起来,然后在绘制帧的时候绑定需要的管线进行绘制,这比每次绘制的时候重新创建管线性能要好得多。绘制的时候应该根据不同类型的管线对模型实例进行分组绘制,每绑定一种图形管线,就把那种图形管线对应的模型实例都放到一个集合中进行批量绘制,这样总体下来性能影响可以忽略不计。我们现在就之前配置的线段管线绘制一个简单的世界坐标轴,从原点位置发射的三条射线组成,而且缩放场景时坐标轴适当自动缩放以保证在合适大小便于观察。属性用于存放线段类型的网格对象,原来的。存储三角形类型的网格对象。
2025-06-27 11:57:04
978
原创 【大厂机试题解法笔记】分解连续正整数组合/ 分解正整数
题目要求将一个正整数n分解为m(m>1)个连续正整数之和,并输出m最小的分解。例如输入21,最短分解是21=10+11(m=2)。若无法分解,则输出"N"。 关键思路是:寻找满足n = k + (k+1) + ... + (k+m-1) = m(2k+m-1)/2的最小m>1。通过数学推导,当m满足n/m - (m-1)/2为正整数时,即为有效分解。时间复杂度O(√n)。 示例输入21输出21=10+11,因为这是最短的连续分解(m=2)。其他分解如1+...+6(m=6)和
2025-06-25 16:10:41
451
原创 【大厂机试题解法笔记】可以组成网络的服务器
在一个机房中,服务器的位置标识在 n*m 的整数矩阵网格中,1 表示单元格上有服务器,0 表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网。请你统计机房中最大的局域网包含的服务器个数。第一行输入两个正整数,n 和 m,0 < n, m <= 100之后为 n * m 的二维数组,代表服务器信息最大局域网包含的服务器个数。输出:3说明:[0][0]、[1][0]、[1][1]三台服务器相互连接,可以组成局域网。
2025-06-25 14:41:18
235
原创 【大厂机试题解法笔记】图像物体的边界
给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个物体,2个物体相邻的格子为边界,求像素1代表的物体的边界个数。像素1代表的物体的边界指与像素5相邻的像素1的格子,边界相邻的属于同一个边界,相邻需要考虑8个方向(上,下,左,右,左上,左下,右上,右下)。其他约束地图规格约束为:0<M<1000<N<100。
2025-06-24 18:08:28
919
原创 【大厂机试题解法笔记】高效货运
老李是货运公司承运人,老李的货车额定载货重量为 wt。老李每次发车时载货总重量刚好为货车额定的载货重量 wt,车上必须同时有货物 A 和货物 B ,货物A、B不可切割。老李单次满载运输可获得的最高利润是多少?单次满载运输的最高利润。
2025-06-23 15:31:48
968
原创 Vulkan 通过 CMake 集成 Dear ImGUI
Vulkan 基础准备:完成VkInstanceVkDeviceSwapChain等渲染器核心组件初始化,特别注意描述符池需预留足够空间给 ImGUI 与主渲染。ImGUI 初始化:通过创建上下文,配置 IO(如中文字体、交互支持),设置主题样式,再初始化 GLFW + Vulkan 后端。字体上传:需用独立命令缓冲,上传后通过保证同步,避免渲染异常。主循环集成:每帧调用NewFrame、构建 UI(如)、Render,最后在 Vulkan 命令缓冲中调用绘制 UI。
2025-06-23 11:46:30
630
原创 Vulkan 学习笔记15—Mipmap 与多重采样
定义:Mipmap 是图像预先计算的缩小版本,每个层级宽高为前一层的一半,用作细节级别(LOD)。作用远离相机的对象使用较小层级采样,提升渲染速度。避免莫尔条纹等伪影。存储方式:在 Vulkan 中存储于VkImage的不同 mip 级别,级别 0 为原始图像,后续层级构成 mip 链。作用:解决几何图形边缘锯齿状走样问题,通过每个像素使用多个采样点计算最终颜色。原理:普通渲染使用单个采样点,MSAA使用多个采样点(如2/4/8倍),采样数越多效果越好但性能开销越大。核心流程。
2025-06-22 19:38:17
725
原创 Vulkan 学习笔记14—模型加载(OBJ、glTF)
这段代码定义了一个名为的结构体,用于表示 3D 场景中的一个可渲染网格对象。几何数据存储:使用vertices和indices存储网格的几何形状纹理管理:通过textures向量管理与网格关联的纹理空间变换:使用控制网格在场景中的位置、旋转和缩放Vulkan 资源:包含用于渲染的 GPU 缓冲区和内存句柄构造函数:提供灵活的初始化方式,支持自定义或默认参数当前 vulkan 渲染器实现了obj、gltf、glb 模型的正常渲染,但并不包含光照相关信息,光照在后续笔记中记录。
2025-06-22 15:44:05
1009
原创 Vulkan学习笔记13—推送常量
Vulkan规范中,推送常量是可通过API写入并在着色器中访问的小块数据。其优势在于允许应用程序设置着色器参数,而无需创建缓冲区或频繁修改/绑定描述符集,提升数据更新效率。本节使用推送常量替换 UBO 传递 MVP 变换矩阵。
2025-06-20 12:17:25
1031
原创 Vulkan 学习笔记12—深度缓冲
当多个3D几何体未按深度排序时,后绘制的片段会覆盖先绘制的片段(如两个正方形因索引顺序导致显示错乱)。通过上述步骤,可在Vulkan中实现正确的深度缓冲机制,解决3D几何体的渲染顺序问题,确保场景深度关系准确。顶点着色器需接收3D坐标并通过模型-视图-投影矩阵转换为裁剪坐标。(模板分量用于 模板测试:与深度测试结合使用的附加测试。将2D几何体扩展为3D时,需在Vertex结构体中添加。当前代码分支:10_depth_buffer。在 vkInit 函数中调用。在重建交换链函数中调用。
2025-06-19 15:30:43
845
原创 Vulkan学习笔记11—纹理映射
概念与作用图像视图是对图像的一种“视图”抽象,定义了如何访问图像数据(如格式、维度、子资源范围)。所有图像(包括纹理和交换链图像)必须通过图像视图访问。创建流程关键参数image:关联的VkImage对象。viewType:视图类型(如format:数据格式(如:指定访问的Mip级别和数组层(通常为全范围)。代码示例// 设置Mip级别和数组层范围...代码优化抽象通用函数。
2025-06-19 12:03:09
928
原创 Vulkan学习笔记10—统一缓冲区
gl_Position 计算引入了模型 - 视图 - 投影变换链,其结果的 w 分量(通常由透视投影矩阵生成)可能不为 1,这会触发透视除法(NDC = 裁剪坐标 /w),是实现近大远小透视效果的关键。在 recordCommandBuffer 函数的 vkCmdDrawIndexed 调用前添加 vkCmdBindDescriptorSets 将每一帧的正确描述符集绑定到着色器中的描述符。指定将绑定到描述符的实际缓冲区或图像资源,就像帧缓冲指定要绑定到渲染通道附件的实际图像视图一样。
2025-06-18 15:36:59
910
原创 Vulkan学习笔记9—暂存缓冲与索引缓冲
索引缓冲区是指向顶点缓冲区的指针数组,可重新排列顶点数据,实现数据重用。以矩形为例,若顶点缓冲区含 4 个唯一顶点,索引缓冲区前 3 个索引定义右上角三角形,后 3 个索引定义左下角三角形,避免顶点重复存储。即使是绘制一个简单的矩形,也会发生这种情况。当前顶点缓冲功能正常,但 CPU 可访问的内存类型可能并非显卡读取的最优选择。本节将创建多个缓冲区,提取缓冲区创建逻辑为辅助函数。编写一个函数,用于将内容从一个缓冲区复制到另一个缓冲区,称为。最后通过缓冲区复制命令,将数据从暂存缓冲区迁移至顶点缓冲区。
2025-06-18 09:36:58
534
原创 Vulkan学习笔记8—顶点输入描述与顶点缓冲
可见缓冲区并使用 memcpy 将顶点数据直接复制到其中的最简单方法开始,之后我们将了解如何使用暂存缓冲区将顶点数据复制到高性能内存中。创建一个VkTypes.h头文件,添加顶点数据结构体 Vertex,顶点/颜色都作为属性,这称为交错顶点属性。当前代码分支为 06_vertexInputdescription_vertexbuffer。一切正常,Validation Layer 也没有输出错误日志!用内存中的顶点缓冲区替换顶点着色器中硬编码的顶点数据。
2025-06-17 16:41:41
901
原创 Vulkan学习笔记7—分层重构
这个渲染器接口的设计目的是将 Vulkan 的复杂初始化、渲染和清理过程封装成简单易用的函数,使上层应用程序可以方便地使用 Vulkan 进行渲染,而不必关心底层实现细节。VkContext 结构体的设计目的是将 Vulkan API 的核心对象集中管理,形成一个完整的渲染上下文。这个接口是构建 Vulkan 渲染系统的基础,可以在此基础上实现更复杂的渲染功能,如多线程渲染、动态资源管理等。这个封装是 Vulkan 应用程序的基础,后续可以在此基础上构建更复杂的渲染功能。
2025-06-16 21:24:03
684
原创 【大厂机试题多种解法笔记】查找单入口空闲区域
有了上面的 DFS 解法基础,BFS 实现就很简单了,只用修改下搜索的方式,队列存储要遍历的元素,迭代访问队列中的每个元素进行统计直至队列为空,bfs 函数直接返回单入口区域大小,对于非单入口区域返回 0。空闲区域是由连通的'O'组成的区域,位于边界的'O'可以构成入口.单入口空闲区域即有且只有一个位于边界的'O'作为入口的由连通的'O'组成的区域.如果两个元素在水平或垂直方向相邻,则称它们是“连通”的。若有多个符合要求,则输出区域大小最大的,若多个符合要求的单入口区域的区域大小相同,
2025-06-15 23:44:54
775
原创 【大厂机试题解法笔记】字符串加密
给出原文字符串 str,通过对字符串的每个字母进行改变来实现加密,加密方式是在每一个字母str[i] 偏移特定数组元素 a[i] 的量。数组 a 的前三位已经赋值:a[0]=1,a[1]=2,a[2]=4,当 i>=3 时,数组元素 a[i]=a[i-1]+a[i-2]+a[i-3]。例如:原文abcde加密后bdgkr,其中偏移量分别是1,2,4,7,13。输入描述:第一行是整数n,表示n组测试数据。每组数据包含一行,原文str(只含有小写字母,长度大于 0 小于 50)。
2025-06-15 16:20:06
342
原创 【大厂机试题解法笔记】对称美学
仔细看题目描述“第 i 个字符串 = 第 i - 1 号字符串取反 + 第 i - 1 号字符串”,这个表明如果第 k 个字符位于当前字符串的后半部分,就可以把问题转换为求 第 i -1 号字符串的 第 k - 2^(i-1)/2 个字符。因为第 i 个字符的后半部分等于第 i - 1 号字符,观察发现第 i 号字符的数量 = 2 * 第 i - 1 号字符数量 = 2 ^ ( i -1)。就是第 i 个字符串 = 第 i - 1 号字符串取反 + 第 i - 1 号字符串;第 1 个字符串:R。
2025-06-15 12:55:19
688
原创 【大厂机试题解法笔记】恢复数字序列
给出了有序序列的长度,因此可从整数 1 开始选取连续的给定长度的数字序列和打乱序列进行匹配,如果是组成成分完全相同的序列就终止选取序列循环,返回枚举序列的起点数字,即序列中最小数字。定义一个数组,索引 0~9 对应的值为索引表示的数字出现的频率,预先计算目标字符串的频率数组 matchFreqs,每次移动窗口左边界时开始更新选取的数字序列频率数组 freqs,并比较 matchFreqs 和 freqs 频率是否完全匹配,匹配则找到结果,然后窗口左边界值。输出一个数字,为序列中最小的数字。
2025-06-14 20:40:51
508
原创 Vulkan学习笔记6—渲染呈现
录制一个命令缓冲区将场景绘制到图像上(vkBeginCommandBuffer、vkEndCommandBuffer)它是用于对 CPU(也称为主机)上的执行进行排序的。将该图像呈现到屏幕上进行呈现,将其返回到交换链(vkQueuePresentKHR)从交换链获取图像(vkAcquireNextImageKHR)从交换链获取图像(vkAcquireNextImageKHR)呈现交换链图像(vkQueuePresentKHR)执行在获取的图像上绘制的命令。用于控制GPU上的同步操作。GPU执行需显式同步。
2025-06-13 21:38:58
567
原创 Vulkan学习笔记5—帧缓冲和命令缓冲
帧缓冲(Framebuffer)是图形渲染管线的最终输出目标,用于存储渲染后的图像数据。它本质上是一个由颜色附件、深度附件、模板附件等组成的集合,这些附件对应 GPU 内存中的特定区域,用于记录像素的颜色值、深度值等信息。在渲染过程中,GPU 将图元处理结果写入帧缓冲,最终通过显示设备输出图像。
2025-06-13 09:30:47
477
原创 Vulkan学习笔记4—图形管线基础
输入汇编器(Input assembler)从您指定的缓冲区收集原始顶点数据,并且还可以使用索引缓冲区来重复某些元素,而无需复制顶点数据本身。顶点着色器(Vertex shader)为每个顶点运行,通常应用变换将顶点位置从模型空间转换为屏幕空间。它还将每个顶点的数据传递到管线中。细分着色器(Tessellation)允许您根据某些规则细分几何图形以提高网格质量。这通常用于使附近的砖墙和楼梯等表面看起来不那么平坦。几何着色器(Geometry shader)
2025-06-12 17:57:12
1087
原创 Vulkan学习笔记3—物理设备-逻辑设备-窗口表面-交换链-图像视图
物理设备:代表 GPU 硬件,查询能力(队列、表面支持等)。逻辑设备:管理资源与队列(图形 / 呈现队列),提交命令。窗口表面:连接 Vulkan 与系统窗口,定义呈现目标。交换链:管理后台图像缓冲区,配置格式 / 呈现模式。图像视图:为图像定义使用方式(如颜色附件、纹理)。
2025-06-12 14:56:52
346
原创 Vulkan学习笔记2—画三角形基本步骤和验证层
创建一个 VkInstance选择一个支持的显卡 (VkPhysicalDevice)创建用于绘制和呈现的 VkDevice 和 VkQueue创建一个窗口、窗口表面和交换链将交换链图像包装到 VkImageView 中创建一个指定渲染目标和用法的渲染通道为渲染通道创建帧缓冲区设置图形管线为每个可能的交换链图像分配并记录带有绘制命令的命令缓冲区通过获取图像、提交正确的绘制命令缓冲区并将图像返回到交换链来绘制帧// 标记是否为同一队列族public:void run();
2025-06-12 10:57:10
347
原创 Vulkan学习笔记1—环境搭建
如果嫌这样麻烦,你可以单独把glm库clone下来复制到extern目录下,但是不会自动加入当前项目的子模块管理中,提交代码时如果不在.gitignore中标记忽略会把整个子模块源码提交了。下载vulkan sdk安装,由于安装的是Windows exe,环境变量是自动设置的,如果是通过压缩包解压放到某个目录需要自行配置环境变量。可以下载到Windows预编译的文件,也可以自己下载源码编译,我这里是之前用CMake工具编译的文件,依赖包放到extern目录下统一管理。
2025-06-11 14:15:12
1037
原创 【大厂机试解法笔记】项目排期
项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。第一行输入为M个需求的工作量,单位为天,用逗号隔开。例如:X1 X2 X3 … Xm。表示共有M个需求,每个需求的工作量分别为X1天,X2天…Xm天。其中0<M<30;0<Xm<200第二行输入为项目组人员数量N最快完成所有工作的天数。
2025-06-10 11:55:43
1065
原创 【大厂机试题解法笔记】报文响应时间
0b01110000对应十进制是112,所以 exp = code & 112,如果嫌十进制表示的112有点大,可以用十六进制0x70。IGMP 协议中,有一个字段称作最大响应时间 (Max Response Time) ,HOST收到查询报文,解折出 MaxResponseTime 字段后,需要在 (0,MaxResponseTime] 时间 (s) 内选取随机时间回应一个响应报文,如果在随机时间内收到一个新的查询报文,则会根据两者时间的大小,选取小的一方刷新回应时间。HOST发送响应报文的时间。
2025-06-09 18:58:19
743
原创 【大厂机试题解法笔记】食堂供餐
最低供餐速度,这个速度要满足食堂在当前单位时间做的盒饭数量满足下一轮员工取餐量。如果食堂库存盒饭满足所有员工取餐量则最低供餐速度是 0,直接返回结果0, 最大单位供餐数量 Max 肯定是所有员工数量总和减去库存数量。第 3 行为 N 个正整数,用空格分隔,依次表示开餐时间内按时间顺序每个单位时间进入食堂取餐的人数 Pi。需要满足排队时间为 0,必须保证取餐员工到达食堂时,食堂库存盒饭数量不少于本次来取餐的人数。为将员工取餐排队时间降低为 0,食堂的供餐速度必须要足够快。,可能会跳过真正的最小解。
2025-06-09 16:46:17
611
原创 【大厂机试题解法笔记】在规定时间内获得最大报酬
规定时间内可获得的最大报酬,有工作时间限制,而且每项工作可选,判断是动态规划01背包问题,把工作时长比作背包容量,每项工作比作物品,工作花费时间比作物品体积,工作对应的报酬比作物品价值,即求物品放入背包能获得的最大价值。耗时时间(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和,那么请你帮小明安。小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的。t代表该工作消耗的时长(单位h,t>0),w代表该项工作的报酬。排一下工作,保证小明在指定的工作时间内工作收入最大化。
2025-06-09 15:36:58
644
原创 【大厂机试题解法笔记】矩阵匹配
二分枚举的范围是 1 到矩阵元素的最大值。即使枚举到的 kth 不是矩阵中的元素也无需担心,因为最终我们要找到的第 K 大元素必然是矩阵中的某个值,只有当枚举到矩阵中的某个元素时,才能满足找到足够多 ≤kth 元素的要求。以当前位置搜索下一个元素就不是从当前位置周边展开搜索了,这样代码也不好写,试想我可以搜索周围四个角的位置元素,它们和当前位置不同行不同列,但是未必和之前搜索过的数字也不同行不同列,那么正确的做法是不是从头开始遍历整个矩阵,排除和已经访问过数字同行或同列的数字,其余就是可以访问的数字。
2025-06-09 14:05:55
1121
原创 【Vulkan项目实战笔记】3D Tiles渲染器1-脚手架搭建
CesiumNative + Dear ImGui + Vulkan 1.3 三维地理可视化系统。
2025-06-08 14:17:56
1973
原创 【大厂机试题解法笔记】区间交集
任意两个给定区间的交集,称为公共区间 (如 [1,2],[2,3] 的公共区间为 [2,2],[3,5],[3,6] 的公共区间为 [3,5])。公共区间之间若存在交集,则需要合并 (如 [1,3],[3,5] 区间存在交集 [3,3],需合并为 [1,5])。区间元素为 X: -10000<=X<=10000。1、区间元素均为数字,不考虑字母、符号等异常输入。给定一组闭区间,其中部分区间存在交集。区间数为 N: 0<=N<=1000;按升序排列输出合并后的区间列表。2、单个区间认定为无公共区间。
2025-06-06 18:56:55
386
原创 【大厂机试题解法笔记】最差产品奖
固定大小数字区间在一串数字序列上从左到右移动,求区间中最小数字。通过左右指针控制窗口收缩和扩张,收缩时窗口最左侧元素移出,扩张时外部元素移入窗口最右侧。第二行,产品的评分序列,比如 [12,3,8,6,5],产品数量 N 范围是 0 < N <10000。评选的标准是依次找到从当前产品开始前 M 个产品中最差的产品,请给出最差产品的评分序列。评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。第一行,数字 M,表示评分区间的长度,取值范围是 0<M<10000。
2025-06-06 17:50:14
435
原创 【大厂机试题多种解法笔记】人气最高的店铺
某购物城有 m 个商铺,现决定举办一场活动选出人气最高店铺。活动共有 n 位市民参与,每位市民只能投一票,但 1 号店铺如果给该市民发放 q 元的购物补贴,该市民会改为投 1 号店铺。请计算 1 号店铺需要最少发放多少元购物补贴才能成为人气最高店铺(即获得的票数要大于其他店铺),如果 1 号店铺本身就是票数最高店铺,返回 0。输入描述第一行为小写逗号分割的两个整数 n,m,其中:第一个整数 n 表示参与的市民总数第二个整数 m 代表店铺总数1 ≤ n,m ≤ 3000第 2 到 n + 1 行
2025-06-06 16:33:16
516
原创 【大厂机试题解法笔记】观看文艺演出问题
区间问题,每场演出有个开始时间和结束时间,先按结束时间对每场演出子区间从小到大排序,再遍历每场演出,如果当前演出开始时间大于上一场演出结束时间+15分钟,则把当前场次演出加入结果统计。为了庆祝党成立100周年,某公园将举行多场文艺表演,很多演出都是同时进行,一个人只能同时观看一场演出,且不能迟到早退,由于演出分布在不同的演出场地,所以连续观看的演出最少有15分钟的时间间隔,小明是一个狂热的文艺迷,想观看尽可能多的演出, 现给出演出时间表,请帮小明计算他最多能观看几场演出。第一行为一个数 N,表示演出场数。
2025-06-06 11:19:12
393
原创 【机试题解法笔记】寻找最大价值的矿堆
以矩阵中的每个不为0的位置作为起点深度优先搜索矿堆,遇到0就回退,用visited数组记录访问过的矿堆,统计路径上的矿产价值总和。在多轮的不同的起点DFS结果中选取最大的矿堆价值即为最终结果。给你一个由 '0'(空地)、'1'(银矿)、'2'(金矿) 组成的的地图,矿堆只能由上下左右相邻的金矿或银矿连接形成。:将输入的多行字符串按行分割,再将每行字符串分割为字符数组,并转换为数字数组,形成二维网格。假设银矿价值 1,金矿价值 2,请你找出地图中最大价值的矿堆并输出该矿堆的价值。标记当前位置为已访问。
2025-06-06 10:20:31
245
原创 【大厂机试题多种解法笔记】小明减肥
小明有n个可选运动,每个运动有对应卡路里,想选出其中k个运动且卡路里和为t。k,t,n都是给定的。求出可行解数量输入描述第一行输入n t k第二行输入 每个运动的卡路里 按照空格进行分割备注0<n<10t>0,0<k<=n每个运动量的卡路里>0输出描述求出可行解数量示例1:输入4 3 21 1 2 3输出2说明可行解为2,选取{0,2},{1,2}两种方式。可以使用回溯法来枚举所有可能的k个运动的组合,并统计满足条件的组合数量。输入处理:读取输入的n、t、k和卡路里数组。回溯搜索:从第
2025-06-06 09:42:06
355
原创 【大厂机试题解法笔记】部门人力分配
要求完成所有需求最大人力肯定不会大于所有需求人力之和,这是最大边界 r,那么问题就是在最小边界 l 和最大边界 r 中进行二分查找,找到最小能满足要求的人力。这种方法的时间复杂度主要由排序操作决定,为 O (N log N),二分查找的时间复杂度为 O (log S),其中 S 是需求总和,每次检查的时间复杂度为 O (N),因此总的时间复杂度为 O (N log N + N log S),可以高效处理题目给定的输入范围。使用双指针法,左指针指向最小的需求,右指针指向最大的需求。
2025-06-06 09:10:24
722
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人