Processing创意编程入门:从基本图形绘制到动态交互艺术
1. 项目概述为什么Processing是创意编程的“瑞士军刀”如果你对用代码画画、做动画或者搞点交互艺术感兴趣但又觉得传统的编程环境太枯燥、门槛太高那你大概率会爱上Processing。这个项目标题“Processing基本图形绘制”听起来很基础但它背后通向的是一个充满无限可能的创意世界。Processing本质上是一个开源的编程语言和集成开发环境它专为电子艺术、视觉设计、新媒体艺术等领域而生核心目标就是让编程变得像素描一样直观让艺术家、设计师、教育工作者甚至编程新手都能快速上手把脑海里的视觉创意变成屏幕上的现实。我最初接触Processing就是被它那种“一行代码一个图形”的即时反馈所吸引。它不像一些大型开发框架需要配置复杂的项目结构处理繁琐的依赖。Processing的IDE集成开发环境开箱即用你写几行代码点一下运行结果立刻在旁边的预览窗口里呈现出来。这种低延迟、高反馈的创作体验对于视觉探索和原型设计来说是无可比拟的。无论是绘制一个简单的圆、一条动态的线条还是构建一个复杂的粒子系统Processing都提供了一套极其简洁且强大的API应用程序编程接口。对于初学者它是理解计算机图形学基础如坐标系、颜色、形状、变换的绝佳沙盒对于有经验的开发者它则是快速实现视觉创意、进行数据可视化或制作交互装置的得力工具。所以这篇内容就是带你从零开始深入Processing的核心绘图功能。我们不会停留在“画个圆”就结束而是要拆解其背后的坐标系系统、颜色模型、形状构建原理并分享如何组合这些基本元素创造出有设计感的静态或动态图形。我会穿插大量我在实际教学和项目开发中积累的实操心得和避坑指南让你不仅能复现效果更能理解“为什么这么做”从而具备举一反三的能力。2. 环境搭建与第一个图形从“Hello World”到“Hello Circle”2.1 Processing开发环境的选择与配置Processing的官方IDE是其最经典的选择它轻量、免费且与Processing语言本质上是Java的简化封装深度集成。下载安装后你几乎不需要任何额外配置。但根据你的需求也有其他选择官方IDE最适合初学者。它包含了代码编辑器、消息控制台和显示窗口所有基础功能一应俱全。它的“速写本”理念鼓励你快速尝试和迭代。Processing作为库对于已经熟悉Java并希望将Processing的图形功能嵌入到更大项目例如使用IntelliJ IDEA或Eclipse的开发者可以将Processing的核心库core.jar导入到你的Java项目中。这提供了更大的灵活性但设置稍复杂。p5.js如果你更倾向于Web开发那么p5.js是绝佳选择。它是Processing理念在JavaScript上的移植语法高度相似可以直接在浏览器中运行便于分享和嵌入网页。我们本篇聚焦于ProcessingJava模式但很多概念是相通的。安装好官方IDE后你会看到一个极其简洁的界面。中间是代码编辑区上方是工具栏运行、停止、新建、打开等下方是控制台。首次运行它会自动创建一个默认的绘图窗口。注意Processing有几种模式如Java、Python等。对于图形绘制我们默认使用最稳定、功能最全的Java模式。在IDE左上角可以确认和切换模式。2.2 理解绘图的基本结构setup()与draw()这是Processing程序的两个核心函数理解它们是如何工作的是写出正确代码的关键。void setup()这个函数只在程序启动时运行一次。它用于进行一次性设置例如定义窗口大小、加载字体或图片、初始化变量等。它是你程序的“准备阶段”。void setup() { size(800, 600); // 设置绘图窗口大小为800像素宽600像素高 background(255); // 将背景色设置为白色一次性的 }这里有个常见误区初学者喜欢在draw()里调用size()这会导致每帧都重置窗口可能引发错误或性能问题。size()必须且通常只在setup()中调用一次。void draw()这个函数在setup()之后会以每秒60帧默认的速率反复、不停地执行。它是你程序的“动画与交互循环”。所有动态效果、实时交互的逻辑都应该放在这里。void draw() { // 这里的代码会每秒执行约60次 ellipse(mouseX, mouseY, 50, 50); // 在鼠标位置画一个圆 }上面这个简单的例子就会实现一个跟着鼠标画圆的效果。因为draw()每帧清空画布并重绘所以圆会不断累积。如果想每帧只显示一个圆就需要在draw()开头用background()重绘背景来“擦除”上一帧。实操心得把setup()想象成舞台的搭建灯光、布景一次搞定而draw()是演员的连续表演。静态图像你可以在setup()里画完所有东西甚至不写draw()函数。动态效果那就在draw()里通过变量变化来改变图形的位置、颜色或形状。2.3 绘制第一个图形深入ellipse()函数让我们运行第一个真正的图形程序。在编辑区输入以下代码void setup() { size(400, 300); } void draw() { background(220); // 浅灰色背景每帧刷新 ellipse(200, 150, 100, 100); // 在(200,150)位置画一个直径100的圆 }点击运行你会看到一个居中的圆。ellipse(x, y, width, height)函数是绘制椭圆当宽高相等时即为圆的核心。这里的前两个参数(200, 150)是椭圆的中心点坐标。关键点解析Processing的坐标系这是第一个需要深刻理解的概念。Processing的绘图窗口左上角是原点(0, 0)。X轴向右为正Y轴向下为正。这与我们数学中常见的笛卡尔坐标系Y轴向上为正不同是计算机图形学的通用惯例源于早期CRT显示器的扫描方式。 所以坐标(200, 150)意味着从窗口左边界向右200像素从窗口上边界向下150像素。size(400,300)创建的窗口其中心点坐标正是(200,150)。3. 核心图形绘制函数全解析从点到面掌握了基本结构后我们来系统学习Processing提供的各种基本图形绘制函数。它们是你构建复杂视觉作品的“积木块”。3.1 点、线、三角形与四边形点point(x, y)绘制单个像素点。默认情况下点很小你可以用strokeWeight()来改变点的尺寸。strokeWeight(5); // 设置点的粗细为5像素 point(100, 100);线line(x1, y1, x2, y2)从点(x1, y1)到点(x2, y2)画一条直线。line(50, 50, 350, 250); // 从(50,50)画到(350,250)的对角线注意事项线的视觉属性颜色、粗细由stroke()和strokeWeight()控制。如果不需要描边可以调用noStroke()。三角形triangle(x1, y1, x2, y2, x3, y3)通过三个顶点坐标定义三角形。四边形quad(x1, y1, x2, y2, x3, y3, x4, y4)通过四个顶点坐标定义四边形。顶点必须按顺序顺时针或逆时针提供否则可能绘制出交叉的“蝴蝶结”形状。3.2 矩形与椭圆理解绘制模式矩形rect(x, y, width, height)和椭圆ellipse(x, y, width, height)是最常用的两个函数。关键的rectMode()和ellipseMode()这两个函数决定了坐标(x, y)在形状中的含义。默认模式下rectMode(CORNER)(x, y)是矩形的左上角。ellipseMode(CENTER)(x, y)是椭圆的中心。 这是导致初学者图形位置“错位”的常见原因你可以改变模式rectMode(CENTER); // 将矩形模式改为中心模式与椭圆默认一致 rect(200, 150, 100, 60); // 现在(200,150)也是这个矩形的中心了 ellipseMode(CORNER); // 将椭圆模式改为角点模式不常用为了让图形定位逻辑统一我个人的习惯是在涉及同时定位矩形和椭圆时会先将rectMode设为CENTER这样所有图形的坐标都代表其中心计算起来非常直观。3.3 弧线与曲线引入数学之美弧arc(x, y, width, height, start, stop)绘制椭圆的一部分。start和stop参数是弧线的起始和结束角度单位是弧度制。Processing提供了radians()函数将角度转换为弧度。// 绘制一个从0度到270度四分之三圆的弧线 arc(200, 150, 100, 100, 0, radians(270));arc()的最后一个可选参数是PIE饼图、CHORD弦或OPEN默认开放弧线可以改变弧线的闭合方式。贝塞尔曲线bezier(x1, y1, cx1, cy1, cx2, cy2, x2, y2)这是绘制平滑曲线的强大工具。(x1, y1)和(x2, y2)是曲线的起点和终点(cx1, cy1)和(cx2, cy2)是两个控制点它们像磁铁一样“吸引”着曲线的形状但并不在曲线上。理解贝塞尔曲线需要一些练习Processing IDE的“工具”菜单下有一个“贝塞尔曲线工具”可以交互式地调整控制点直观感受其工作原理。3.4 顶点形状beginShape()与endShape()绘制任意多边形当内置的基本形状不够用时beginShape()/endShape()组合是你的终极武器。你可以通过vertex(x, y)函数逐个添加顶点绘制任意多边形。beginShape(); vertex(100, 100); vertex(200, 50); vertex(300, 100); vertex(250, 200); vertex(150, 200); endShape(CLOSE); // CLOSE参数使最后一个顶点连接回第一个顶点形成闭合图形你还可以在beginShape()中指定类型如beginShape(TRIANGLES)、beginShape(LINES)等用于批量绘制多个独立三角形或线段这在高级图形渲染中很常用。4. 图形属性控制颜色、描边与填充画出了形状下一步就是给它们上色和定义轮廓。Processing的颜色和样式系统非常灵活。4.1 颜色模型Grayscale, RGB, HSBProcessing主要支持三种颜色模型通过colorMode()函数切换。灰度Grayscale默认模式。单个参数0为黑色255为白色。background(0); // 黑色 fill(255); // 白色填充RGB最常用的模型。三个参数分别代表红、绿、蓝的强度范围通常是0-255。colorMode(RGB); fill(255, 0, 0); // 纯红色 stroke(0, 255, 0); // 纯绿色描边还可以包含第四个透明度参数Alpha范围也是0-255。fill(255, 0, 0, 127); // 半透明的红色HSB色相Hue、饱和度Saturation、亮度Brightness。对于艺术家来说这种模型更符合直觉更容易挑选出和谐的颜色。colorMode(HSB, 360, 100, 100); // 将范围设置为H:0-360, S:0-100, B:0-100 fill(120, 100, 100); // 纯绿色色相120度实操心得在做色彩渐变或根据数据映射颜色时HSB模式非常方便。例如让色相H随着某个变量循环变化可以轻松生成彩虹色系。4.2 填充与描边fill(),stroke(),noFill(),noStroke()fill()设置后续所有图形的内部填充颜色。stroke()设置后续所有图形的轮廓线颜色。noFill()取消填充图形将变成空心。noStroke()取消描边图形将没有轮廓。strokeWeight()设置描边的粗细像素。strokeCap()设置线段端点的样式ROUND圆头,SQUARE方头,PROJECT突出方头。strokeJoin()设置线段连接处的样式MITER尖角,BEVEL斜角,ROUND圆角。一个重要特性状态机Processing的图形属性颜色、描边、变换等设置是“状态性”的。一旦你设置了fill(255,0,0)之后绘制的所有图形都会使用红色填充直到你再次调用fill()改变它。这既是优点避免重复代码也容易导致错误忘记重置状态。清晰的代码结构有助于管理状态。5. 坐标变换移动、旋转与缩放的世界当你需要绘制多个相同但位置、角度、大小不同的图形时一遍遍计算每个顶点的坐标会非常繁琐且容易出错。坐标变换Transformation是解决这个问题的优雅方案。5.1 变换函数translate(),rotate(),scale()translate(x, y)将整个坐标系的原点平移到(x, y)。之后所有绘图的坐标都是相对于这个新原点的。pushMatrix(); // 保存当前坐标系状态 translate(200, 150); // 将原点移到窗口中心 ellipse(0, 0, 50, 50); // 在(0,0)处画圆即窗口中心 popMatrix(); // 恢复之前的坐标系状态这个例子中我们画了一个在窗口中心的圆但使用的是(0,0)坐标。pushMatrix()和popMatrix()是必须配对使用的关键函数它们像书签一样保存和恢复坐标系状态防止变换效果累积影响到后续不想被变换的图形。rotate(angle)以当前坐标系原点为中心旋转整个坐标系。角度单位是弧度。pushMatrix(); translate(width/2, height/2); // 移到中心 rotate(radians(45)); // 旋转45度 rect(0, 0, 100, 50); // 绘制一个旋转了45度的矩形 popMatrix();常见错误忘记先translate()到旋转中心。旋转总是围绕当前原点进行的。如果你想围绕一个图形的中心旋转就必须先把原点平移到那个中心点。scale(sx, sy)缩放坐标系。sx和sy分别代表X轴和Y轴的缩放因子。大于1放大0到1之间缩小。负数会实现镜像翻转。scale(2.0); // 所有后续图形放大两倍 scale(1.0, -1.0); // Y轴镜像图形会上下颠倒5.2 变换的叠加与顺序变换操作的顺序至关重要。不同的顺序会产生完全不同的结果。Processing的变换是“后进先出”的堆栈式应用通过push/popMatrix管理但在同一个上下文中代码的书写顺序决定了变换的应用顺序。例如translate(100, 0); rotate(PI/4);和rotate(PI/4); translate(100, 0);的效果截然不同。前者是先移动再旋转后者是先旋转再移动。理解这个顺序需要把变换想象成在移动、旋转、缩放这个“镜头”坐标系本身而不是在移动物体。实操心得在编写复杂图形或角色时我习惯为每个相对独立的图形单元比如一个机器人的手臂、一个花朵的花瓣包裹一对pushMatrix()和popMatrix()。在这个“沙箱”里我可以放心地进行平移、旋转来定位和调整这个单元而不会干扰到其他部分的绘制。这是模块化图形代码的核心技巧。6. 动态图形与交互基础让画面活起来静态图形只是开始Processing的魅力在于让图形动起来并与用户交互。这一切的核心都在于draw()循环和系统变量。6.1 基于时间的动画frameCount与millis()frameCount一个从程序开始运行时不断递增的整数记录已经渲染了多少帧。非常适合用于制作周期性动画。void draw() { background(0); // 圆的X坐标随帧数增加而右移取模运算使其在窗口宽度内循环 float x frameCount % width; ellipse(x, height/2, 50, 50); }millis()返回程序开始后经过的毫秒数。比frameCount更精确且与帧率无关。适合制作需要精确时间控制的动画或计时器。void draw() { float time millis() / 1000.0; // 转换为秒 float angle time * TWO_PI / 5.0; // 每5秒旋转一周 // 使用angle驱动旋转... }6.2 鼠标与键盘交互mouseX,mouseY,mousePressed,keymouseX,mouseY实时存储当前鼠标光标在窗口内的坐标。void draw() { background(220); // 图形跟随鼠标 ellipse(mouseX, mouseY, 50, 50); // 线段一端固定另一端跟随鼠标 line(0, 0, mouseX, mouseY); }mousePressed,mouseButton判断鼠标状态。void draw() { if (mousePressed) { if (mouseButton LEFT) { fill(255, 0, 0); } else if (mouseButton RIGHT) { fill(0, 0, 255); } ellipse(mouseX, mouseY, 30, 30); } }key,keyPressed处理键盘输入。void draw() { // draw函数内容... } void keyPressed() { if (key r || key R) { // 按下R键重置某些状态 background(255); } }keyPressed()是一个事件函数当有键被按下时自动调用一次适合处理触发型操作。6.3 平滑运动与缓动动画直接使用mouseX或线性变化的变量运动可能会显得生硬。引入“缓动”概念可以让运动更自然。核心思想是让目标位置不是瞬间到达而是每一帧向目标位置移动一小段距离。float circleX 0; float circleY 0; float easing 0.05; // 缓动系数0-1之间越小越平滑但越慢 void draw() { background(255); // 计算目标与当前位置的差值 float dx mouseX - circleX; float dy mouseY - circleY; // 当前位置向目标位置移动差值的 easing 倍 circleX dx * easing; circleY dy * easing; ellipse(circleX, circleY, 50, 50); }这个简单的缓动公式能产生非常柔和的跟随效果是游戏和交互动画中常用的技巧。7. 综合案例创作一个动态图形艺术作品现在我们把前面所有的知识点融合起来创建一个简单的、具有美感的动态图形。这个案例会包含基本形状、颜色变化、坐标变换、时间驱动的动画以及交互。项目目标创建一个由多个旋转的、颜色渐变的六边形组成的动态图案鼠标位置可以影响其旋转速度。int numHexagons 12; float[] angles new float[numHexagons]; // 存储每个六边形的旋转角度 float[] rotationSpeeds new float[numHexagons]; // 存储每个六边形的旋转速度 color[] colors new color[numHexagons]; // 存储每个六边形的颜色 void setup() { size(800, 800); colorMode(HSB, 360, 100, 100); // 使用HSB颜色模式方便生成渐变色 noStroke(); // 初始化数组 for (int i 0; i numHexagons; i) { angles[i] random(TWO_PI); // 随机初始角度 rotationSpeeds[i] random(0.01, 0.03); // 随机旋转速度 colors[i] color(i * (360.0 / numHexagons), 80, 100); // 根据索引分配色相 } } void draw() { background(0, 0, 10); // 深灰色背景 // 计算全局旋转速度因子受鼠标X坐标影响 float globalSpeedFactor map(mouseX, 0, width, 0.5, 2.0); // 绘制多个六边形 for (int i 0; i numHexagons; i) { pushMatrix(); // 为每个六边形创建一个独立的坐标系 // 将原点移动到窗口中心 translate(width/2, height/2); // 计算当前六边形的半径呈环形分布 float radius map(i, 0, numHexagons, 50, 300); // 计算当前六边形在环上的位置 float arcAngle TWO_PI / numHexagons * i; // 先旋转到环上的位置再平移出去 rotate(arcAngle); translate(radius, 0); // 应用自身的旋转动画速度受全局因子和自身速度影响 angles[i] rotationSpeeds[i] * globalSpeedFactor; rotate(angles[i]); // 设置填充色 fill(colors[i]); // 调用自定义函数绘制六边形 drawHexagon(0, 0, 40); // 在当前位置绘制半径为40的六边形 popMatrix(); // 恢复坐标系不影响下一个六边形 } } // 自定义函数绘制一个中心在(x,y)半径为r的六边形 void drawHexagon(float x, float y, float r) { beginShape(); for (int i 0; i 6; i) { float angle TWO_PI / 6 * i; float px x cos(angle) * r; float py y sin(angle) * r; vertex(px, py); } endShape(CLOSE); }代码解析与技巧数据结构我们使用数组来管理多个六边形的状态角度、速度、颜色这是处理多个相似物体的标准做法。颜色生成在setup()中我们利用HSB模式根据六边形的索引i均匀地分配色相值i * (360.0 / numHexagons)从而生成一个平滑的色环渐变。环形布局通过arcAngle计算每个六边形在圆环上的角度然后使用rotate(arcAngle); translate(radius, 0);的组合将它们均匀地排列在一个圆环上。这是一个非常经典的极坐标布局模式。双重旋转每个六边形有两层旋转。第一层rotate(arcAngle)是用于在环上定位的静态旋转。第二层rotate(angles[i])是不断累加的动态旋转产生动画效果。交互映射map(mouseX, 0, width, 0.5, 2.0)函数将鼠标X坐标从[0, width]映射到[0.5, 2.0]用这个值乘以基础旋转速度实现了用鼠标控制整体动画快慢的交互。模块化函数我们将绘制六边形的代码封装成drawHexagon()函数使主draw()循环更清晰也便于复用。函数内部使用三角函数cos()和sin()计算正六边形的六个顶点。运行这段代码你会看到一个色彩斑斓、不断旋转的六边形环鼠标左右移动可以控制旋转速度。这个案例综合运用了形状、颜色、变换、动画、交互和函数封装是一个很好的练习模板。你可以尝试修改参数比如numHexagons六边形数量、colors的生成逻辑、drawHexagon函数里的r半径甚至把六边形换成其他形状来创造出属于自己的独特图案。8. 常见问题与性能优化技巧在学习和使用Processing进行图形创作时你肯定会遇到一些典型问题。这里记录了一些常见坑点和优化建议。8.1 图形闪烁或残留轨迹问题描述在draw()中绘制运动物体时物体后面有拖影或者图形闪烁。原因与解决未清除画布这是最常见原因。draw()每帧执行如果你不覆盖上一帧的内容新图形就会画在旧图形上产生拖影。解决在draw()的第一行或绘制背景图形前调用background()。background()位置不当如果在draw()循环的末尾调用background()会立刻擦除刚画好的内容导致闪烁。解决确保background()在绘制其他内容之前调用。双重缓冲问题罕见极少数情况下可能需要设置size(宽度, 高度, P2D或P3D)来启用更高级的渲染器它们通常有更好的双缓冲支持以减少闪烁。8.2 图形位置或大小不对问题描述图形没有出现在预期位置或者大小异常。排查步骤检查坐标系模式确认rectMode()和ellipseMode()是否是你期望的模式CENTER或CORNER。这是新手最常踩的坑。检查变换堆栈是否忘记了popMatrix()导致平移、旋转、缩放效果累积到了不该影响的图形上确保每个pushMatrix()都有对应的popMatrix()。检查变量值在控制台使用println()输出你用于计算位置的变量如mouseX,mouseY或自定义变量看其值是否符合预期。检查单位rotate()使用的是弧度不是角度。如果你心里想的是角度记得用radians()函数转换。8.3 程序运行越来越卡问题描述动画开始时流畅运行一段时间后变得卡顿。原因与优化内存泄漏对象创建如果在draw()循环内频繁创建新对象如new PVector(),new ArrayList()而没有妥善处理旧对象内存会逐渐耗尽。优化尽量在setup()中初始化对象或在draw()中复用对象。对于临时对象确保其作用域仅限于循环内以便垃圾回收。图形复杂度激增如果你在draw()中不断添加新的、永不消失的图形例如每帧都在mouseX, mouseY画圆且不擦除需要绘制的图形数量会无限增长最终导致卡死。优化使用background()清屏或设定一个图形数量的上限。昂贵的运算在draw()中例如在每帧都进行复杂的图像处理或大型数组排序。优化尝试简化算法或将计算结果缓存起来避免每帧重复计算。8.4 提升绘图性能的实用技巧减少stroke()和fill()的调用状态改变如切换颜色对性能有开销。尽量将相同颜色、样式的图形批量绘制。使用shape()函数如果你有一个用beginShape()/endShape()创建的复杂且不变的图形可以将其存储在PShape对象中然后在draw()里用shape()函数显示。这比每帧重新计算顶点要快得多。PShape complexShape; void setup() { size(500, 500); complexShape createShape(); complexShape.beginShape(); // ... 添加很多顶点 ... complexShape.endShape(); } void draw() { background(255); shape(complexShape, 0, 0); // 高效渲染 }慎用loadPixels()/updatePixels()直接操作像素数组非常强大但也很慢。除非必要否则优先使用内置的绘图函数。帧率控制默认60FPS可能对某些复杂场景过高。可以用frameRate()降低目标帧率如30以节省系统资源。简化draw()逻辑确保draw()函数中的代码尽可能高效。避免在其中进行文件读写、网络请求等阻塞性操作。Processing的基本图形绘制是你进入创意编程世界的坚实第一步。它看似简单但通过组合、变换、动画和交互能衍生出令人惊叹的复杂视觉效果。关键在于多动手实践从模仿开始然后尝试修改参数最后进行自由创作。当你遇到问题时善用Processing自带的参考文档在IDE中选中函数按CtrlShiftF和丰富的线上社区资源。记住编程是一种表达方式而Processing让这种表达变得直观而充满乐趣。

相关新闻

英雄联盟玩家的智能游戏管家:League Akari如何让你的对局胜率提升30%

英雄联盟玩家的智能游戏管家:League Akari如何让你的对局胜率提升30%

英雄联盟玩家的智能游戏管家:League Akari如何让你的对局胜率提升30% 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英…

2026/7/28 15:59:40阅读更多 →
KMS激活工具:Windows和Office永久激活的简单免费方案

KMS激活工具:Windows和Office永久激活的简单免费方案

KMS激活工具:Windows和Office永久激活的简单免费方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活和Office软件激活而烦恼吗?KMS_VL_ALL_AIO智能…

2026/7/28 15:59:40阅读更多 →
MatAnyone:无需绿幕的AI视频抠像革命,3分钟实现电影级效果

MatAnyone:无需绿幕的AI视频抠像革命,3分钟实现电影级效果

MatAnyone:无需绿幕的AI视频抠像革命,3分钟实现电影级效果 【免费下载链接】MatAnyone [CVPR 2025] MatAnyone: Stable Video Matting with Consistent Memory Propagation 项目地址: https://gitcode.com/gh_mirrors/ma/MatAnyone 还在为复杂的视…

2026/7/28 15:59:40阅读更多 →
MongoDB 4.2——持久性

MongoDB 4.2——持久性

持久性1、使用日志机制的成员级别持久性2、使用写关注的集群级别持久性2.1、writeConcern的w和wtimeout选项2.2、writeConcern的j(日志)选项3、使用读关注的集群级别持久性4、使用写关注的事务持久性5、MongoDB不能保证什么6、检查数据损坏1、使用日志机…

2026/7/28 17:15:56阅读更多 →
EncodingChecker:3步解决文件乱码问题的终极指南

EncodingChecker:3步解决文件乱码问题的终极指南

EncodingChecker:3步解决文件乱码问题的终极指南 【免费下载链接】EncodingChecker A GUI tool that allows you to validate the text encoding of one or more files. Modified from https://encodingchecker.codeplex.com/ 项目地址: https://gitcode.com/gh_m…

2026/7/28 17:15:56阅读更多 →
springMVC定义拦截器判断用户是否为管理员

springMVC定义拦截器判断用户是否为管理员

首先是数据库的设计CREATE table tb_user( uId int(11) primary key auto_increment,uName varchar(20) not null,uPassword varchar(20) not null,uPhone varchar(30) not null,uAddress VARCHAR(100) not null,isManager int(1) default 0 -- 1:为管理员 0:不为…

2026/7/28 17:15:56阅读更多 →
早起原来还有这些好处

早起原来还有这些好处

昨天中午吃完午饭散步的时候,看了半佛仙人公众号中推荐的一篇文章《 为什么优秀的人,都把闹钟定在早晨5:57》,感觉写的非常不错,就简单的总结了一下。 早起,是一个非常好的习惯,博主认为这是一件…

2026/7/28 17:15:56阅读更多 →
linux多进程通讯---信号新增API  timerfd

linux多进程通讯---信号新增API timerfd

文章目录定时器说明举例定时器说明 •函数功能:通过文件I/O方式去获取定时器的通知事件 •相关API: –int timerfd_create(int clockid, int flags); –int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec…

2026/7/28 17:15:56阅读更多 →
ChanlunX缠论插件:3分钟让通达信变成你的智能缠论分析助手

ChanlunX缠论插件:3分钟让通达信变成你的智能缠论分析助手

ChanlunX缠论插件:3分钟让通达信变成你的智能缠论分析助手 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对复杂的缠论理论感到无从下手?看着K线图上密密麻麻的走势&…

2026/7/28 17:13:56阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →