ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从零构建桌面宠物应用:Electron与PixiJS实战指南

从零构建桌面宠物应用:Electron与PixiJS实战指南 如果你是一名开发者最近在社交媒体或技术社区里一定被各种“桌宠”应用刷过屏。它们不再是多年前那种简单的像素宠物而是集成了AI对话、行为模拟、甚至能帮你处理简单任务的智能体。很多开发者看到后心痒痒这玩意儿技术栈复杂吗从零开始做一个要多久今天要聊的就是一个从“梦想”到“跑通”的真实案例。我花了些时间把一个构思已久的抽象风格桌宠应用从零搭建并成功调通了初版。这个过程里踩的坑、做的技术选型、以及最终跑起来那一刻的成就感远比单纯看一个炫酷的效果更有价值。这篇文章不会只给你看一个最终效果图然后说“很简单几步搞定”。相反我会完整拆解这个“抽象吧桌宠”初版的核心实现路径。你会看到一个桌宠应用到底由哪些核心模块构成——远不止一个会动的图片。如何用相对主流和轻量的技术栈如Python、Electron、相关图形库快速搭建原型。从零到一的开发流程中那些容易被忽略但至关重要的细节比如跨平台窗口管理、资源加载、事件循环与状态机。一个可运行、可扩展的初版代码框架你可以直接在此基础上添加自己的创意。无论你是想学习桌面GUI开发、对交互式应用感兴趣还是单纯想拥有一个属于自己的、独一无二的桌面伙伴这篇文章都能给你提供一条清晰的实践路线。我们不只是记录一个结果更是复盘一条可复制的路径。1. 桌宠应用的核心不止于“宠物”而是一个“桌面智能体”在动手写代码之前我们必须想清楚我们要构建的究竟是个什么东西如果仅仅是一个在桌面上走来走去的动画精灵那只是一个“动画播放器”。一个现代意义上的“桌宠应用”其内核是一个具有状态、可交互、并可能具备一定自主行为的桌面智能体。它的核心模块可以抽象为以下几层呈现层 (Presentation Layer): 负责将“宠物”的形象展示在屏幕上。这涉及到窗口管理无边框、置顶、穿透点击、图形渲染2D精灵动画、粒子效果和资源管理图片、音频加载。行为逻辑层 (Behavior Logic Layer): 这是桌宠的“大脑”。它定义宠物做什么、何时做。通常由一个状态机驱动状态包括“空闲”、“移动”、“交互”、“执行任务”等。行为由内部定时器、外部事件鼠标、键盘或预设规则触发。交互层 (Interaction Layer): 处理用户与桌宠的沟通。包括鼠标事件点击、拖拽、悬停、键盘快捷键以及更高级的语音或文本输入这通常需要接入AI服务。服务与集成层 (Service Integration Layer): 让桌宠变得“有用”。例如读取系统信息时间、天气、CPU占用、监听剪贴板、与其它应用进行简单通信如收到消息时提醒。这是区分“玩具”和“工具”的关键。对于我们的“抽象吧桌宠”初版目标设定非常务实先实现一个稳定、可交互的图形化外壳并搭建好核心行为逻辑的框架。AI集成、复杂服务可以放在后续迭代。因此技术选型需要围绕图形渲染效率、跨平台能力和开发效率展开。2. 技术选型为什么是Electron Canvas市面上实现桌面应用的技术很多原生开发C/C#/Swift、Qt/PyQt、JavaFX、Flutter Desktop以及基于Web技术的Electron或Tauri。对于桌宠这类对渲染实时性要求较高动画流畅但业务逻辑并不极端复杂且强烈需要快速原型和跨平台的项目我的选择是Electron作为应用外壳配合HTML5 Canvas进行2D渲染。这样选型的核心考量开发效率与生态JavaScript/TypeScript生态庞大动画库如PixiJS、状态管理工具应有尽有。Electron能让我们直接使用Web前端技术栈UI构建速度极快。跨平台一致性Electron“一次编写到处运行”的特性完美覆盖Windows、macOS和Linux三大桌面平台无需为每个平台单独处理底层窗口API。渲染性能足够现代Canvas尤其是配合WebGL的PixiJS对于2D精灵动画和粒子效果绰绰有余。桌宠的图形复杂度远低于大型游戏。强大的原生集成能力通过Electron的Main Process和Node.js我们可以轻松调用系统API实现置顶窗口、读取文件、注册全局快捷键等原生功能这是纯Web应用做不到的。备选方案与对比PyQt/PySidePython语法简洁Qt框架成熟。但跨平台部署相对麻烦且对于复杂动画性能优化需要更多功夫。Tauri比Electron更轻量打包体积小。但生态相对年轻在需要深度系统集成时可能遇到坑且对Rust有要求学习曲线稍陡。原生开发性能最优资源占用最低。但开发周期最长跨平台需要多套代码不适合快速验证想法。结论对于追求快速验证、功能迭代和利用现有Web技能的开发者Electron是目前实现桌宠类应用最平衡、最实用的起点。我们的“抽象吧桌宠”初版也将基于此技术栈构建。3. 环境准备搭建你的开发基座在开始写任何业务代码之前一个稳定、可复现的开发环境是必须的。以下是详细的步骤3.1 安装 Node.js 与 npmElectron基于Node.js所以首先需要安装它。建议使用Node.js 18 LTS或更高版本以获得更好的稳定性和性能。访问官网前往 Node.js 官网 下载安装程序。验证安装打开终端Windows CMD/PowerShell, macOS Terminal, Linux Bash运行以下命令node --version npm --version如果正确显示版本号如v18.xx.x和10.x.x则说明安装成功。3.2 创建项目并初始化我们将创建一个标准的Electron应用项目结构。# 1. 创建一个新的项目目录并进入 mkdir abstract-deskpet cd abstract-deskpet # 2. 初始化npm项目生成package.json文件 npm init -y # 3. 安装Electron作为开发依赖 npm install --save-dev electron3.3 安装核心渲染库PixiJS为了高效地绘制和动画我们的抽象桌宠我们选择PixiJS。它是一个极快的2D渲染引擎使用WebGL或Canvas回退。# 在项目根目录下安装PixiJS npm install pixi.js3.4 项目基础结构创建以下核心文件形成最基本的Electron应用骨架abstract-deskpet/ ├── package.json ├── main.js # Electron 主进程入口文件 ├── preload.js # 预加载脚本用于安全地暴露Node.js API给渲染进程 └── index.html # 应用主窗口的HTML页面现在你的开发环境已经就绪。接下来我们将填充这些文件的内容让应用真正“活”起来。4. 核心流程拆解从窗口到动画一个Electron桌宠应用的启动和运行遵循一个清晰的流程。理解这个流程是后续调试和扩展的基础。流程图解文字描述启动主进程main.js被执行它控制应用的生命周期。创建无边框窗口主进程创建一个无边框、始终置顶、忽略鼠标事件或可控穿透的浏览器窗口。这是桌宠能“浮”在桌面上的关键。加载渲染内容窗口加载index.html和相关的CSS、JavaScript。初始化渲染引擎在渲染进程中初始化PixiJSApplication创建一个Canvas画布。加载资源异步加载桌宠的精灵图Sprite Sheet、音频等资源。创建精灵与状态机用加载的资源创建PixiJSSprite对象并为其绑定一个简单的状态机逻辑定义“空闲”、“移动”等状态及转换条件。进入事件循环内部驱动PixiJS的Ticker游戏循环开始工作每帧更新精灵的位置、动画帧。外部交互监听Canvas上的鼠标事件点击、拖拽改变桌宠的状态如被点击时播放一个“惊讶”动画然后逃跑。进程间通信渲染进程通过preload.js暴露的API与主进程通信以执行如“获取系统空闲时间”、“播放系统通知音”等需要更高权限的操作。这个流程的核心在于“主进程管窗口渲染进程管展示与交互”的分离架构以及“状态机驱动行为”的游戏化设计思想。5. 完整示例一个可运行的抽象桌宠初版让我们把上述流程转化为具体的代码。这是“抽象吧桌宠”最简可行版本的核心实现。5.1 主进程文件 (main.js)这个文件负责创建和管理应用窗口。// main.js const { app, BrowserWindow, screen } require(electron); const path require(path); // 保持对窗口对象的全局引用避免被垃圾回收 let mainWindow; function createWindow() { const { width, height } screen.getPrimaryDisplay().workAreaSize; // 创建浏览器窗口 mainWindow new BrowserWindow({ width: 200, // 桌宠初始宽度 height: 200, // 桌宠初始高度 x: width - 250, // 初始位置屏幕右下角 y: height - 250, frame: false, // 无边框窗口关键 transparent: true, // 窗口透明可选用于非矩形宠物 alwaysOnTop: true, // 始终置顶关键 skipTaskbar: true, // 不在任务栏显示 hasShadow: false, // 无阴影 resizable: false, // 不可调整大小 webPreferences: { preload: path.join(__dirname, preload.js), // 注入预加载脚本 nodeIntegration: false, // 出于安全考虑关闭Node集成 contextIsolation: true, // 开启上下文隔离 } }); // 加载应用的 index.html mainWindow.loadFile(index.html); // 开发环境下打开开发者工具 // mainWindow.webContents.openDevTools({ mode: detach }); // 窗口关闭时触发 mainWindow.on(closed, () { mainWindow null; }); } // Electron 初始化完成并准备创建窗口时调用 app.whenReady().then(() { createWindow(); app.on(activate, () { // 在 macOS 上当点击 dock 图标并且没有其他窗口打开时重新创建一个窗口 if (BrowserWindow.getAllWindows().length 0) createWindow(); }); }); // 所有窗口关闭时退出应用 (macOS 除外) app.on(window-all-closed, () { if (process.platform ! darwin) app.quit(); });关键点解释frame: false和alwaysOnTop: true是桌宠窗口的灵魂实现了“悬浮”效果。transparent: true允许创建不规则形状的窗口但需要图片背景透明。nodeIntegration: false和contextIsolation: true是重要的安全设置强制我们通过preload.js来安全地暴露Node.js能力。5.2 预加载脚本 (preload.js)它是连接主进程Node.js环境和渲染进程浏览器环境的安全桥梁。// preload.js const { contextBridge, ipcRenderer } require(electron); // 向渲染进程window对象暴露一个安全的API contextBridge.exposeInMainWorld(electronAPI, { // 示例获取系统平台 getPlatform: () process.platform, // 示例通过主进程执行一个耗时或需要权限的操作 doSomething: (args) ipcRenderer.invoke(do-something, args), // 示例监听主进程发来的消息 onPetEvent: (callback) ipcRenderer.on(pet-event, (event, ...args) callback(...args)) });5.3 渲染进程HTML与PixiJS核心 (index.html和renderer.js)index.html是渲染进程的入口。!DOCTYPE html html head meta charsetUTF-8 title抽象吧桌宠/title style body { margin: 0; padding: 0; overflow: hidden; /* 隐藏滚动条 */ background: transparent; /* 背景透明 */ user-select: none; /* 禁止文字选择 */ -webkit-app-region: drag; /* 允许窗口拖拽整个body区域 */ } /* 为宠物精灵所在的canvas取消拖拽使其可交互 */ #petCanvas { -webkit-app-region: no-drag; display: block; } /style /head body !-- PixiJS画布将在此处渲染 -- canvas idpetCanvas/canvas !-- 引入PixiJS库和我们的渲染逻辑 -- script src./node_modules/pixi.js/dist/browser/pixi.min.js/script script src./renderer.js/script /body /htmlrenderer.js是桌宠所有视觉和交互逻辑的核心。// renderer.js // 状态枚举 const PetState { IDLE: idle, MOVING: moving, INTERACTING: interacting }; class AbstractDeskPet { constructor() { this.app null; this.petSprite null; this.currentState PetState.IDLE; this.stateTimer 0; this.targetX 0; this.targetY 0; this.speed 2; this.isDragging false; this.dragOffset { x: 0, y: 0 }; this.init(); } async init() { // 1. 初始化PixiJS应用 this.app new PIXI.Application({ view: document.getElementById(petCanvas), width: 200, height: 200, backgroundColor: 0x000000, // 初始背景色加载后透明 backgroundAlpha: 0, // 完全透明背景 antialias: true }); // 2. 加载宠物纹理这里使用一个简单的占位图形实际应加载图片 // 实际项目中你应该准备一张精灵图spritesheet // const texture await PIXI.Assets.load(assets/pet_sheet.png); // 为了演示我们创建一个简单的图形 const graphics new PIXI.Graphics(); graphics.beginFill(0x3498db); // 蓝色 graphics.drawCircle(100, 100, 40); // 画一个圆 graphics.endFill(); // 画两个眼睛 graphics.beginFill(0xffffff); graphics.drawCircle(80, 80, 8); graphics.drawCircle(120, 80, 8); graphics.endFill(); // 画一个微笑的嘴 graphics.lineStyle(4, 0xffffff); graphics.arc(100, 110, 20, 0, Math.PI); const texture this.app.renderer.generateTexture(graphics); this.petSprite new PIXI.Sprite(texture); this.petSprite.anchor.set(0.5); // 将锚点设置到精灵中心 this.petSprite.x this.app.screen.width / 2; this.petSprite.y this.app.screen.height / 2; this.app.stage.addChild(this.petSprite); // 3. 设置初始状态和交互 this.setState(PetState.IDLE); this.setupInteraction(); // 4. 启动游戏循环 this.app.ticker.add((delta) this.update(delta)); } setState(newState) { console.log(Pet state changed: ${this.currentState} - ${newState}); this.currentState newState; this.stateTimer 0; switch (newState) { case PetState.IDLE: // 空闲状态可能播放呼吸动画或随机做一些小动作 // 这里可以设置一个随机计时器之后切换到MOVING break; case PetState.MOVING: // 移动状态随机选择一个目标点 this.targetX Math.random() * this.app.screen.width; this.targetY Math.random() * this.app.screen.height; break; case PetState.INTERACTING: // 交互状态例如被点击时播放一个动画 // 这里可以触发一个动画1秒后回到IDLE setTimeout(() this.setState(PetState.IDLE), 1000); break; } } setupInteraction() { const sprite this.petSprite; sprite.interactive true; sprite.buttonMode true; // 鼠标悬停时显示手型指针 // 鼠标按下开始拖拽 sprite.on(pointerdown, (event) { this.isDragging true; this.setState(PetState.INTERACTING); const pos event.data.getLocalPosition(sprite.parent); this.dragOffset.x sprite.x - pos.x; this.dragOffset.y sprite.y - pos.y; // 临时取消窗口拖拽让canvas处理事件 document.body.style[-webkit-app-region] no-drag; }); // 鼠标移动拖拽 this.app.stage.on(pointermove, (event) { if (!this.isDragging) return; const pos event.data.getLocalPosition(this.app.stage); sprite.x pos.x this.dragOffset.x; sprite.y pos.y this.dragOffset.y; }); // 鼠标释放结束拖拽 this.app.stage.on(pointerup, () { if (this.isDragging) { this.isDragging false; this.setState(PetState.IDLE); // 恢复窗口拖拽 document.body.style[-webkit-app-region] drag; } }); // 鼠标悬停 sprite.on(pointerover, () { // 可以有一些反馈比如轻微放大 sprite.scale.set(1.05); }); sprite.on(pointerout, () { sprite.scale.set(1.0); }); } update(delta) { // delta 是上一帧到这一帧的时间比例用于平滑动画 if (this.isDragging) return; // 拖拽时暂停自主行为 this.stateTimer delta; switch (this.currentState) { case PetState.IDLE: // 空闲5秒后开始移动 if (this.stateTimer 300) { // 300帧约5秒假设60FPS this.setState(PetState.MOVING); } // 可以在这里添加一些轻微的上下浮动动画 this.petSprite.y Math.sin(this.stateTimer * 0.05) * 0.1; break; case PetState.MOVING: // 向目标点移动 let dx this.targetX - this.petSprite.x; let dy this.targetY - this.petSprite.y; let dist Math.sqrt(dx * dx dy * dy); if (dist this.speed) { // 到达目标点切换回空闲 this.petSprite.x this.targetX; this.petSprite.y this.targetY; this.setState(PetState.IDLE); } else { // 向目标点移动 this.petSprite.x (dx / dist) * this.speed; this.petSprite.y (dy / dist) * this.speed; } break; } } } // 当页面加载完成后启动我们的桌宠 document.addEventListener(DOMContentLoaded, () { new AbstractDeskPet(); });6. 运行结果与效果验证代码编写完成后让我们启动应用验证核心功能。6.1 修改package.json启动脚本打开package.json在scripts部分添加启动命令{ name: abstract-deskpet, version: 1.0.0, description: 一个抽象的桌面宠物应用, main: main.js, scripts: { start: electron ., // 添加这一行 test: echo \Error: no test specified\ exit 1 }, devDependencies: { electron: ^28.0.0 }, dependencies: { pixi.js: ^7.3.2 } }6.2 启动应用在项目根目录下运行npm start6.3 预期效果与验证点如果一切顺利你应该能看到窗口出现屏幕右下角会出现一个200x200像素的圆形窗口里面有一个简单的蓝色抽象宠物有眼睛和嘴巴。悬浮特性这个窗口没有标题栏和边框并且始终显示在其他窗口之上。你可以打开浏览器或文档它会浮在上面。自主行为空闲宠物会轻微地上下浮动。移动大约5秒后宠物会随机移动到窗口内的另一个位置。交互功能鼠标悬停鼠标移到宠物上会变成手型宠物会轻微放大。点击拖拽按住宠物可以将其拖到屏幕任意位置。松开后宠物会停止当前行为进入空闲状态。点击反馈点击宠物时它会短暂进入“交互”状态控制台会打印状态变化然后恢复。如何判断成功应用正常启动无报错。宠物能按逻辑空闲-移动-空闲自主行动。所有鼠标交互悬停、拖拽都正常工作。窗口符合无边框、置顶的特性。如果启动失败第一步排查检查终端错误信息。最常见的是electron模块未安装重新运行npm install。检查main.js中loadFile(‘index.html’)的路径是否正确。打开Chrome开发者工具在main.js中取消注释mainWindow.webContents.openDevTools()查看Console面板是否有JavaScript错误。7. 常见问题与排查思路在开发过程中你几乎一定会遇到下面这些问题。这里提供一份排查清单。问题现象可能原因排查方式解决方案应用无法启动提示Cannot find module ‘electron’1.node_modules缺失或损坏。2. 全局安装了electron但项目内未安装。1. 检查项目根目录是否有node_modules文件夹。2. 运行npm list electron查看。1. 删除node_modules和package-lock.json重新运行npm install。2. 确保在项目内执行npm install --save-dev electron。窗口不是无边框或无法置顶main.js中BrowserWindow的配置项错误。检查main.js中new BrowserWindow的参数特别是frame,alwaysOnTop。确保frame: false和alwaysOnTop: true已设置。宠物图形不显示或显示为黑块1. PixiJS纹理加载失败。2. Canvas尺寸或样式问题。3. 图形绘制代码有误。1. 打开开发者工具查看Console和Network面板。2. 检查renderer.js中创建PIXI.Application和Sprite的代码。1. 确保PixiJS库正确引入 (script src”…”)。2. 简化图形代码先用一个纯色矩形测试。拖拽功能无效或拖拽时整个窗口在动CSS样式-webkit-app-region设置冲突。1. 检查index.html中body和#petCanvas的CSS样式。2. 在拖拽事件中动态修改样式是否生效。确保body设置为drag#petCanvas设置为no-drag。在pointerdown事件中临时将body改为no-drag。宠物移动卡顿、不流畅1.update函数逻辑过于复杂或每帧计算量太大。2. 没有使用delta时间进行与帧率无关的移动。1. 在update函数中打印帧时间。2. 检查是否有大量对象在每帧创建。1. 确保移动计算使用delta(this.petSprite.x speed * delta)。2. 对于复杂动画使用精灵图Sprite Sheet和PixiJS的AnimatedSprite。应用CPU占用率过高游戏循环 (app.ticker) 一直在运行即使无事可做。使用系统监控工具查看Electron进程的CPU使用率。优化状态机在长时间空闲时如宠物隐藏时可以暂停或大幅降低ticker的频率。打包后的应用白屏1. 资源文件路径错误使用__dirname或process.resourcesPath。2. 预加载脚本路径错误。1. 在开发者工具中查看加载失败的资源。2. 检查打包配置如electron-builder的files配置。1. 使用path.join(__dirname, ‘../assets/’ )等绝对路径。2. 确保preload.js在打包后能被正确找到。8. 最佳实践与工程建议当你成功运行初版后如果想把它变成一个更健壮、可维护、功能丰富的项目以下建议至关重要。8.1 项目结构优化将代码模块化不要把所有逻辑都堆在renderer.js里。推荐结构abstract-deskpet/ ├── assets/ # 静态资源图片、音频、配置文件 │ ├── sprites/ │ └── sounds/ ├── src/ │ ├── main/ # 主进程代码 │ │ ├── main.js │ │ └── windowManager.js │ ├── renderer/ # 渲染进程代码 │ │ ├── index.html │ │ ├── main.js # 渲染进程入口 │ │ ├── core/ │ │ │ ├── Pet.js # 桌宠类 │ │ │ ├── StateMachine.js # 状态机 │ │ │ └── AssetLoader.js # 资源加载器 │ │ └── utils/ │ └── preload.js # 预加载脚本 ├── package.json └── README.md8.2 使用精灵图与动画不要用代码绘制图形而是使用专业的图像工具如Aseprite, Photoshop制作精灵图。// 在AssetLoader.js中 async loadPetSpriteSheet() { const sheet await PIXI.Assets.load(assets/sprites/pet_sheet.json); // 纹理图集JSON const textures []; for (let i 0; i 4; i) { // 假设有4帧 textures.push(PIXI.Texture.from(pet_frame_${i}.png)); } this.petAnimatedSprite new PIXI.AnimatedSprite(textures); this.petAnimatedSprite.animationSpeed 0.1; this.petAnimatedSprite.play(); }8.3 完善状态机初版的状态机很简单。一个健壮的状态机应该管理状态转换的条件、进入/退出动作。class StateMachine { constructor(states, initialState) { this.states states; this.currentState initialState; this.states[this.currentState].enter(); } transitionTo(newState) { if (this.states[this.currentState].transitions.includes(newState)) { this.states[this.currentState].exit(); this.currentState newState; this.states[this.currentState].enter(); return true; } return false; } update(delta) { this.states[this.currentState].update(delta); } } // 定义状态 const petStates { idle: { enter: () { /* 播放空闲动画 */ }, update: (delta) { /* 检查是否该移动了 */ }, exit: () { /* 停止空闲动画 */ }, transitions: [moving, interacting] }, moving: { ... } };8.4 进程间通信规范化所有与系统相关的操作如读写文件、发送通知、获取系统信息都应通过preload.js暴露的API由主进程处理。// 在 preload.js 中暴露更多API contextBridge.exposeInMainWorld(electronAPI, { showNotification: (title, body) ipcRenderer.invoke(show-notification, {title, body}), getSystemInfo: () ipcRenderer.invoke(get-system-info), }); // 在 main.js 中处理 ipcMain.handle(show-notification, (event, {title, body}) { new Notification({ title, body }).show(); });8.5 性能与资源管理纹理管理使用PIXI.Assets统一加载和缓存纹理避免重复加载。对象池对于频繁创建销毁的对象如对话气泡、粒子使用对象池复用。Ticker管理当桌宠被最小化或隐藏时暂停app.ticker。内存泄漏在PixiJS中移除Sprite时确保调用destroy()并置空引用。8.6 打包与分发使用electron-builder或electron-forge进行打包。npm install --save-dev electron-builder在package.json中配置构建信息然后运行npm run dist即可生成安装包。务必在build配置中正确指定资源文件路径。9. 总结与后续方向至此“抽象吧桌宠”已经从零到一成为了一个真正运行在你桌面上的、可交互的应用程序。我们回顾一下这条路径的核心里程碑明确核心将桌宠定义为“桌面智能体”并拆解出呈现层、行为层、交互层和服务层。技术选型基于开发效率、跨平台和渲染性能选择了Electron PixiJS的组合。环境搭建建立了标准的Node.js/Electron项目结构这是所有功能的基础。窗口魔法通过frame: false和alwaysOnTop: true实现了真正的“悬浮”窗口。赋予生命用PixiJS绘制图形并用一个简单的状态机驱动宠物的空闲、移动等基本行为。建立连接实现了鼠标拖拽、悬停等基础交互让宠物能响应用户。跑通验证成功启动应用并验证了核心功能闭环。这个初版的价值在于它提供了一个完全可运行、可理解、可扩展的骨架。所有复杂的功能都可以在这个骨架上生长。你的下一步可以是什么美化形象用设计师制作的精美精灵图替换简单的几何图形加入走路、睡觉、吃饭等更多动画序列。丰富行为扩展状态机增加更复杂的行为树Behavior Tree让宠物能根据时间、天气、系统状态做出更“智能”的反应。增强交互右键菜单为宠物添加一个功能菜单隐藏、喂食、设置。语音唤醒集成语音识别库让宠物能响应你的语音命令。AI对话接入大语言模型的API如OpenAI、文心一言让宠物能和你进行简单的文字对话。实用功能系统监控让宠物在CPU占用过高时“出汗”在内存不足时“打瞌睡”。消息提醒监听特定的应用或网站来消息时宠物跳出来提醒你。快捷工具点击宠物可以快速打开便签、计算器或执行一个自定义脚本。桌宠应用的魅力就在于它介于“玩具”和“工具”之间。它可以是你在繁忙编码时的一个轻松陪伴也可以是你个性化工作流的一个有趣入口。希望这篇从“梦想”到“调通”的详细记录能为你启动自己的项目提供扎实的助力。建议收藏本文在开发过程中遇到具体问题时再回来查阅对应的章节和排查思路。
返回列表