CocosCreator截图功能全解析:从RenderTexture到本地保存的完整实现
1. 项目概述为什么我们需要在CocosCreator中截图在游戏开发中截图功能远不止是“按个键保存一张图”那么简单。无论是用于玩家分享、游戏内相册、举报反馈还是实现动态小地图、角色头像实时生成、战斗回放等高级功能将游戏画面精准地捕获并保存到本地都是一个高频且核心的需求。CocosCreator 3.6.1 版本提供了强大的图形接口但官方文档往往点到为止从RenderTexture到一张实实在在躺在用户手机相册里的PNG文件中间隔着好几个“坑”。很多开发者尤其是刚接触图形渲染的朋友可能会觉得不就是用相机拍一下然后存起来吗但实际操作起来你会发现一系列问题截图出来为什么是黑的为什么在Web平台和原生平台表现不一致如何把GPU上的纹理数据高效地转换成Base64字符串又如何安全地写入到用户的文件系统这个过程涉及到渲染管线、异步操作、平台差异和文件系统API任何一个环节没处理好功能就可能失效。今天我就结合自己踩过的坑手把手带你走通CocosCreator 3.6.1 截图保存的完整流程。我们将从最核心的RenderTexture讲起一步步拆解如何捕获画面、转换数据、编码为PNG并最终保存到不同平台Web、微信小游戏、原生App的本地存储中。目标是让你看完就能做出一个稳定、高效的截图模块。2. 核心原理与工具选型RenderTexture与数据流转在动手写代码之前我们必须搞清楚截图功能的“数据流水线”。简单来说流程是游戏画面 - 渲染到离屏纹理RenderTexture - 读取像素数据Pixel Data - 编码为图片格式如PNG - 保存到本地文件。其中RenderTexture和readPixels方法是承上启下的关键。2.1 RenderTexture你的“虚拟相机胶片”RenderTexture顾名思义是一种渲染纹理。你可以把它理解为一台虚拟相机的“胶片”或“数字传感器”。普通相机把画面渲染到屏幕Frame Buffer而我们将一台相机的targetTexture设置为某个RenderTexture时它渲染的内容就会“拍”到这张纹理上而不是屏幕上。为什么不用直接截屏因为直接截屏如cc.director.getScene().capture捕获的是最终屏幕合成后的结果可能包含UI、可能分辨率受设备限制且无法灵活控制。使用RenderTexture你可以精准控制只截取特定相机比如一个专门拍摄3D场景的相机的内容排除UI干扰。任意尺寸可以创建任意宽高的RenderTexture不受屏幕分辨率限制实现高清截图。离屏渲染在后台完成渲染不影响主画面性能适合连续截图或生成缩略图。在CocosCreator中创建和使用一个RenderTexture的基本流程如下// 1. 动态创建RenderTexture const renderTexture new RenderTexture(); renderTexture.reset({ width: 1024, // 纹理宽度 height: 768, // 纹理高度 }); // 2. 将其赋值给相机 const cameraComp this.getComponent(Camera); // 或通过property获取 cameraComp.targetTexture renderTexture; // 3. 可选将RenderTexture显示在UI上用于预览 const spriteFrame new SpriteFrame(); spriteFrame.texture renderTexture; this.previewSprite.spriteFrame spriteFrame;这里有几个关键参数需要注意width/height决定了截图的分辨率。建议使用2的幂次方如512, 1024以获得更好的兼容性但非2的幂次方在现代设备上通常也支持。reset方法用于初始化或重置RenderTexture的属性。必须在创建后调用reset来分配GPU资源。注意当相机targetTexture被设置后该相机渲染的内容将不再显示在屏幕上。如果你需要相机既渲染到纹理又显示在屏幕上通常需要复制一个相机一个用于渲染到纹理离屏另一个用于正常显示。2.2 从GPU到CPUreadPixels的奥秘RenderTexture存在于GPU显存中我们的JavaScript代码无法直接操作。readPixels方法就是那座连接GPU和CPU的桥梁。它允许我们从指定的RenderTexture或Frame Buffer中读取一块矩形区域的像素数据并将其复制到一个CPU端的ArrayBufferView通常是Uint8Array中。const width renderTexture.width; const height renderTexture.height; // 创建一个足够大的Uint8Array来容纳RGBA数据 (每个像素4个字节) const pixelData new Uint8Array(width * height * 4); // 关键调用读取像素 renderTexture.readPixels(0, 0, width, height, pixelData);执行完这行代码后pixelData这个数组里就按行主序存储了从(0,0)到(width, height)区域内每个像素的RGBA值。每个像素占用4个连续的位置[R, G, B, A]。这里有一个巨大的“坑”不同平台、不同GPU的纹理数据存储顺序可能不同。最常见的差异是Y轴翻转。在WebGL和某些图形API中纹理的坐标原点(0,0)通常在左下角而我们通常认为的图片数据原点在左上角。直接读取出来的数据如果保存为图片很可能是上下颠倒的。这就是为什么在官方文档的Material示例中会看到一个CC_HANDLE_RT_SAMPLE_FLIP宏来处理UV翻转。但在我们通过readPixels读取数据后也需要手动处理这个问题。一个常见的做法是在将数据转换为Base64或保存前将每一行数据进行上下翻转。2.3 数据编码从RGBA到PNG拿到Uint8Array格式的RGBA数据后我们需要将其编码成标准的图片文件格式最常用的就是PNG。浏览器环境提供了CanvasAPI可以方便地完成这个转换但在小游戏或原生平台我们需要寻找其他方案。核心思路是将RGBA像素数据绘制到一个离屏的Canvas上然后利用Canvas的toDataURL或toBlob方法导出Base64字符串或Blob对象。// 在Web平台下的编码示例 function encodePixelsToPNGDataURL(pixels: Uint8Array, width: number, height: number): string { // 1. 创建离屏Canvas const canvas document.createElement(canvas); canvas.width width; canvas.height height; const ctx canvas.getContext(2d)!; // 2. 创建ImageData对象 const imageData ctx.createImageData(width, height); // 注意这里可能需要处理Y轴翻转将pixels的数据正确填入imageData.data // 假设pixels数据已经是正确的原点在左上角 imageData.data.set(pixels); // 3. 将ImageData绘制到Canvas ctx.putImageData(imageData, 0, 0); // 4. 导出为DataURL (格式为 data:image/png;base64,ivborw0kggoaaaansuheug...) const dataURL canvas.toDataURL(image/png); return dataURL; }得到的dataURL是一个很长的字符串以data:image/png;base64,开头后面跟着Base64编码的图片数据。这个字符串可以直接赋值给Image元素的src进行预览也可以进一步处理用于保存。实操心得canvas.toDataURL(‘image/png’)的压缩质量是默认的无法调整。如果你对图片大小有要求例如用于网络上传可以考虑使用canvas.toBlob(callback, ‘image/png’, quality)但注意quality参数仅对JPEG格式有效PNG是无损压缩。对于需要极致压缩的场景可以引入第三方JavaScript PNG编码库如UPNG.js、png.js但会增大包体。3. 完整实现流程从截图到保存的每一步理解了原理我们开始搭建完整的截图流程。我将它分为四个阶段初始化准备、触发截图与渲染、像素读取与编码、平台适配与保存。3.1 阶段一初始化准备场景与相机设置一个健壮的截图系统最好使用一个专用的相机和RenderTexture避免干扰主游戏渲染。步骤1创建截图专用相机节点在场景中创建一个空节点命名为“CaptureCamera”。为其添加Camera组件。调整相机的位置、视角和裁剪平面确保其能拍摄到你想要截取的游戏内容例如整个3D场景。关键设置ClearFlags通常设置为Solid Color并选择一个纯色背景如黑色或透明黑。确保截图背景干净。Visibility设置相机的可见性层级Culling Mask。例如如果你只想截取3D场景而不想截取UI就只勾选3D层的节点。TargetTexture先留空我们将在代码中动态赋值。步骤2准备一个用于接收截图数据的Sprite可选如果你想在游戏内提供一个实时预览可以在UI层创建一个Sprite节点用于显示RenderTexture的内容。这在你制作“拍照系统”时非常有用。步骤3编写管理脚本创建一个TypeScript脚本例如ScreenCaptureManager.ts并挂载到场景中的某个常驻节点上如GameManager。import { _decorator, Component, Camera, RenderTexture, SpriteFrame, Sprite, director } from cc; const { ccclass, property } _decorator; ccclass(ScreenCaptureManager) export class ScreenCaptureManager extends Component { // 关联场景中的专用相机 property(Camera) captureCamera: Camera | null null; // 关联预览用的Sprite可选 property(Sprite) previewSprite: Sprite | null null; // 动态创建的RenderTexture private _renderTexture: RenderTexture | null null; // 截图尺寸 private readonly CAPTURE_WIDTH 1024; private readonly CAPTURE_HEIGHT 768; onLoad() { this.initRenderTexture(); } // 初始化RenderTexture initRenderTexture() { if (!this.captureCamera) { console.error(Capture camera is not assigned!); return; } // 销毁旧的纹理避免内存泄漏 if (this._renderTexture) { this._renderTexture.destroy(); } // 创建并配置新的RenderTexture this._renderTexture new RenderTexture(); this._renderTexture.reset({ width: this.CAPTURE_WIDTH, height: this.CAPTURE_HEIGHT, }); // 赋值给相机 this.captureCamera.targetTexture this._renderTexture; // 如果设置了预览Sprite则显示 if (this.previewSprite) { const spriteFrame new SpriteFrame(); spriteFrame.texture this._renderTexture; this.previewSprite.spriteFrame spriteFrame; } } }3.2 阶段二触发截图与异步渲染截图不能在任意时刻触发。必须确保当前帧的渲染指令已经提交并且相机已经将内容绘制到RenderTexture上。最可靠的方式是使用director.once(‘render-frame-end’, …)或scheduleOnce在下一帧执行读取操作。// 在ScreenCaptureManager类中添加方法 public captureScreenshot(): void { if (!this._renderTexture) { console.warn(RenderTexture not initialized.); return; } // 方案1在下一帧读取确保渲染完成 this.scheduleOnce(() { this._readPixelsFromTexture(); }, 0); // 方案2更精确地在一帧渲染结束后读取推荐 // director.once(Director.EVENT_AFTER_DRAW, this._readPixelsFromTexture, this); } private _readPixelsFromTexture(): void { const width this.CAPTURE_WIDTH; const height this.CAPTURE_HEIGHT; const pixelBuffer new Uint8Array(width * height * 4); // 核心读取像素数据 this._renderTexture!.readPixels(0, 0, width, height, pixelBuffer); // 处理数据如翻转Y轴并编码 this._processAndEncodePixels(pixelBuffer, width, height); }注意事项readPixels是一个同步的阻塞调用并且会将GPU数据回读到CPU。对于大尺寸纹理如4K这个操作可能比较耗时会造成主线程卡顿。在实际项目中如果对流畅度要求高可以考虑降低截图分辨率。将截图操作放在用户操作的自然间隙如动画播放时。在Web Worker中进行耗时的编码操作但readPixels本身必须在主线程。3.3 阶段三像素处理与PNG编码从readPixels拿到的数据需要经过处理才能变成正确的图片。关键处理Y轴翻转如前所述我们需要将行序颠倒。下面是一个简单的翻转函数private _flipYPixels(pixels: Uint8Array, width: number, height: number): Uint8Array { // 创建一个新的数组存放翻转后的数据 const flippedPixels new Uint8Array(pixels.length); const bytesPerRow width * 4; for (let row 0; row height; row) { const srcRowStart row * bytesPerRow; const dstRowStart (height - 1 - row) * bytesPerRow; flippedPixels.set(pixels.subarray(srcRowStart, srcRowStart bytesPerRow), dstRowStart); } return flippedPixels; }Web平台编码在Web平台我们可以利用Canvas API这是最标准、性能最好的方式。private _processAndEncodePixels(pixels: Uint8Array, width: number, height: number): void { // 1. 翻转Y轴 const flippedPixels this._flipYPixels(pixels, width, height); // 2. 创建离屏Canvas进行编码 const canvas document.createElement(canvas); canvas.width width; canvas.height height; const ctx canvas.getContext(2d); if (!ctx) { console.error(Failed to get 2d context.); return; } const imageData ctx.createImageData(width, height); imageData.data.set(flippedPixels); // 将处理后的数据填入 ctx.putImageData(imageData, 0, 0); // 3. 导出为DataURL const pngDataURL canvas.toDataURL(image/png); console.log(PNG DataURL generated, length:, pngDataURL.length); // 4. 触发保存流程 this._saveImageData(pngDataURL); }3.4 阶段四平台适配与本地保存这是最后一步也是最复杂的一步因为不同平台Web、微信小游戏、原生的文件系统API完全不同。Web平台浏览器浏览器出于安全限制不能直接写入用户磁盘。通常有两种方式下载链接创建一个隐藏的标签触发下载。private _saveImageData(dataURL: string, filename: string screenshot.png): void { const link document.createElement(a); link.href dataURL; link.download filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); }展示与手动保存将DataURL显示在img标签上让用户右键另存为。或者使用window.open(dataURL)在新标签页打开图片。微信小游戏平台微信小游戏环境没有document对象不能使用标签。需要使用微信小游戏提供的wxAPI。将DataURL转换为临时文件路径微信的FileSystemManager可以写入临时文件。// 注意需要先判断平台在微信小游戏环境下执行 if (typeof wx ! undefined) { // 1. 将DataURL的Base64部分解码成二进制数据 const base64Data dataURL.split(,)[1]; const fileBuffer wx.base64ToArrayBuffer(base64Data); // 2. 获取文件系统管理器 const fs wx.getFileSystemManager(); const tempFilePath wx.env.USER_DATA_PATH /${Date.now()}.png; // 3. 写入临时文件 fs.writeFile({ filePath: tempFilePath, data: fileBuffer, encoding: binary, // 重要指定为二进制写入 success: () { console.log(截图已保存到临时文件:, tempFilePath); // 4. 可以调用wx.saveImageToPhotosAlbum保存到相册需要用户授权 wx.saveImageToPhotosAlbum({ filePath: tempFilePath, success: () { console.log(已保存到相册); }, fail: (err) { console.error(保存相册失败:, err); } }); }, fail: (err) { console.error(写入文件失败:, err); } }); }重要提示wx.saveImageToPhotosAlbum需要用户授权且只能在由用户触发的回调中调用如按钮的tap事件。因此更好的流程是先写入临时文件 - 弹窗提示用户 - 用户点击确认按钮 - 在按钮回调中调用保存到相册。原生平台Android/iOS在CocosCreator打包的原生应用中你需要通过JSBJavaScript Binding调用原生代码来实现文件保存。CocosCreator提供了jsb模块和FileUtils的封装但直接写入相册通常需要原生侧代码。 一个常见的折中方案是将Base64数据通过JSB传递给原生层由原生代码Java/Objective-C完成图片解码和写入系统相册的操作。这涉及到原生插件开发超出了本文范围但核心思路是建立一条JS到原生的通信通道。4. 常见问题、优化与高级技巧即使按照上述流程走通在实际项目中你仍会遇到各种问题。这里我总结了一份“避坑指南”和优化建议。4.1 常见问题排查速查表问题现象可能原因解决方案截图全黑1. 相机targetTexture设置后相机本身或拍摄的物体被禁用或未渲染。2. RenderTexture尺寸为0。3. 相机ClearFlags设置为Depth_Only或None且场景没有渲染任何物体。1. 确保相机节点和需要渲染的节点都处于激活状态。2. 检查reset方法传入的width/height是否大于0。3. 将ClearFlags改为Solid Color并检查颜色。截图颜色异常/错位1. 像素数据读取后未处理Y轴翻转。2.readPixels读取的区域超出了纹理边界。3. 纹理格式不匹配如使用了HDR格式。1. 在编码前务必调用_flipYPixels函数。2. 确保读取的x, y, width, height参数在纹理尺寸内。3. 创建RenderTexture时使用默认格式或确保编码时能处理该格式。Web平台保存无反应1.download属性在部分浏览器或同源策略下受限。2. DataURL过长某些浏览器有长度限制。1. 尝试使用window.open(dataURL)方式。2. 考虑使用canvas.toBlob生成Blob URL (URL.createObjectURL(blob))进行下载兼容性更好。微信小游戏保存失败1.wx.saveImageToPhotosAlbum未获得用户授权。2. 临时文件路径错误或磁盘已满。3. Base64解码失败。1. 引导用户授权并在授权成功的回调中执行保存。2. 使用wx.env.USER_DATA_PATH作为安全路径前缀。3. 确保传入wx.base64ToArrayBuffer的是纯Base64字符串不含data:image/png;base64,前缀。截图性能卡顿1. 高分辨率截图如4K导致readPixels和编码耗时过长。2. 频繁截图。1. 降低截图分辨率或分帧处理将读取、编码、保存拆到多帧完成。2. 加入截图冷却时间避免连续触发。4.2 性能优化与内存管理复用RenderTexture除非截图尺寸需要动态变化否则在初始化时创建一个固定尺寸的RenderTexture并复用。频繁创建和销毁RenderTexture会引发GPU内存分配与回收可能导致卡顿。降低分辨率对于用于缩略图或网络分享的截图完全不需要原生分辨率。将CAPTURE_WIDTH和CAPTURE_HEIGHT设置为512x512或更低能极大减少readPixels的数据量和后续编码的时间。延迟与非阻塞操作将耗时的PNG编码操作特别是大图放到setTimeout或requestIdleCallback中避免阻塞主线程渲染。在微信小游戏或原生平台甚至可以探索在Worker中进行编码需注意Worker环境无法直接操作Canvas。及时清理内存toDataURL生成的Base64字符串和toBlob生成的Blob对象都会占用内存。在完成保存或上传后及时将相关变量置为null以便垃圾回收。对于Blob URL记得调用URL.revokeObjectURL()来释放引用。4.3 高级技巧截图UI与全屏截图有时你需要截取包含UI的完整屏幕。有几种思路方案A使用主相机UI相机合并为UI也创建一个相机将其targetTexture设置为另一个RenderTexture。然后通过着色器或Canvas 2D将两个RenderTexture的内容叠加绘制到最终Canvas上。这种方法最灵活但实现复杂。方案B使用引擎的cc.director.getScene().capture如果版本支持。这是一个更高级的API可以直接捕获当前屏幕内容。你需要查阅对应版本的引擎源码或文档确认其可用性和用法。方案CWeb平台特供在截图流程的最后一步不读取RenderTexture而是直接使用html2canvas这样的第三方库对整个document.body或游戏Canvas父节点进行截图。这能100%捕获屏幕所见但兼容性和性能需要测试且不适用于原生平台。我个人在需要截取纯游戏内容时首选RenderTexture方案因为它最可控、性能可预期。当需要包含原生平台上的系统UI如手机状态栏时则必须依赖原生插件提供的截图能力。最后别忘了在你的截图功能上线前在不同分辨率、不同性能的设备上进行充分的测试。截图功能虽小却串联起了渲染、数据、平台三大模块是检验一个前端开发者综合能力的好课题。希望这篇超详细的攻略能帮你扫清障碍一次搞定。

相关新闻

Embarcadero Dev-C++ 6.3 保姆级安装与配置指南

Embarcadero Dev-C++ 6.3 保姆级安装与配置指南

1. 项目概述:为什么我们需要一个“新”的Dev-C? 如果你是C或C语言的初学者,或者是一位需要轻量级IDE来完成教学、小型项目开发的程序员,那么“Dev-C”这个名字你一定不陌生。它曾经是无数人踏入编程世界的第一扇门,以其…

2026/8/10 16:04:49 阅读更多 →
3分钟掌握TranslucentTB:让Windows任务栏焕然一新的终极指南

3分钟掌握TranslucentTB:让Windows任务栏焕然一新的终极指南

3分钟掌握TranslucentTB:让Windows任务栏焕然一新的终极指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 还在为Windows系…

2026/8/10 16:04:49 阅读更多 →
Windows 11终极优化指南:3分钟让系统焕然一新的Win11Debloat

Windows 11终极优化指南:3分钟让系统焕然一新的Win11Debloat

Windows 11终极优化指南:3分钟让系统焕然一新的Win11Debloat 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter …

2026/8/10 16:04:49 阅读更多 →

最新新闻

JavaQuestPlayer终极指南:如何快速上手这款强大的QSP游戏引擎

JavaQuestPlayer终极指南:如何快速上手这款强大的QSP游戏引擎

JavaQuestPlayer终极指南:如何快速上手这款强大的QSP游戏引擎 【免费下载链接】JavaQuestPlayer Quest Soft Player in java 项目地址: https://gitcode.com/gh_mirrors/ja/JavaQuestPlayer JavaQuestPlayer是一款专为QSP游戏设计的Java运行引擎,…

2026/8/10 16:48:03 阅读更多 →
Basalt多传感器高精度标定:从原理到实践的技术深度解析

Basalt多传感器高精度标定:从原理到实践的技术深度解析

Basalt多传感器高精度标定:从原理到实践的技术深度解析 【免费下载链接】basalt-mirror Mirror of the Basalt repository. All pull requests and issues should be sent to https://gitlab.com/VladyslavUsenko/basalt 项目地址: https://gitcode.com/gh_mirror…

2026/8/10 16:48:03 阅读更多 →
当Windows安装程序“自作主张“时:In-Place_Upgrade_Helper如何帮你夺回控制权

当Windows安装程序“自作主张“时:In-Place_Upgrade_Helper如何帮你夺回控制权

当Windows安装程序"自作主张"时:In-Place_Upgrade_Helper如何帮你夺回控制权 【免费下载链接】In-Place_Upgrade_Helper Helper-Tool for Windows 10/11/Server In-Place-upgrades and changing between Windows Editions 项目地址: https://gitcode.co…

2026/8/10 16:48:03 阅读更多 →
基于stm32的脉搏血氧仪设计

基于stm32的脉搏血氧仪设计

目录 一、设计概述 1 二、设计方案 2 1、设计任务 2 1.对传感器输出的模拟信号进行AD转换 2 2.在屏幕显示脉搏波形 2 3.测量并显示心率与体温 2 4.可与上位机通过USB接口通信 2 5.按键与屏幕多级菜单设计进行人机交互 2 6.自动检测设备连接状态 2 7.数据通过ESP01S上传到服务器…

2026/8/10 16:48:03 阅读更多 →
基于Dev-C++与SDL的水下迷宫游戏开发:从项目结构到核心机制解析

基于Dev-C++与SDL的水下迷宫游戏开发:从项目结构到核心机制解析

1. 项目概述:从零到一的水下迷宫探险最近在整理硬盘时,翻出了一个多年前用Dev-C和SDL库捣鼓出来的“水下迷宫游戏”项目包。这可不是一个简单的教学Demo,而是一个功能相对完整、包含了地图编辑器、关卡系统、音效和粒子效果的“准产品级”小游…

2026/8/10 16:48:03 阅读更多 →
如何在Windows上免费运行iPhone应用:ipasim跨平台iOS模拟器完整指南

如何在Windows上免费运行iPhone应用:ipasim跨平台iOS模拟器完整指南

如何在Windows上免费运行iPhone应用:ipasim跨平台iOS模拟器完整指南 【免费下载链接】ipasim iOS emulator for Windows 项目地址: https://gitcode.com/gh_mirrors/ip/ipasim 你是否曾经想过在Windows电脑上体验iOS应用?现在,通过ipa…

2026/8/10 16:47:03 阅读更多 →

日新闻

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南 【免费下载链接】graphql-css A blazing fast CSS-in-GQL™ library. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-css GraphQL-CSS是一个基于GraphQL的CSS-in-GQL™库&#xff0…

2026/8/10 0:00:02 阅读更多 →
告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.com/…

2026/8/10 0:00:02 阅读更多 →
BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾经因为游戏插件的复杂…

2026/8/10 0:00:02 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/10 1:05:29 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/10 1:05:29 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/10 1:05:29 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/10 1:05:29 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →