如何在Processing(Java)中放大pixels[]的显示效果?
高效放大pixels[]操作的显示尺寸方案
你遇到的问题核心是直接逐像素绘制矩形的软件渲染效率太低,而Processing的scale()是绘图变换,不会改变pixels[]的底层数据尺寸,所以得换思路——用内置的图像缩放功能,它是底层优化过的,帧率能拉上去。
下面给两种最实用的方法:
方法一:用小尺寸PImage做缓冲区,放大后显示
这是最推荐的方案,因为PImage的缩放是硬件加速/底层优化的,比自己画rect快几十倍。
代码示例
PImage smallBuffer; int scaleFactor = 4; // 放大4倍,可按需调整 int smallSize = 100; void setup() { size(smallSize * scaleFactor, smallSize * scaleFactor); smallBuffer = createImage(smallSize, smallSize, RGB); } void draw() { // 1. 操作小缓冲区的pixels数组(你的核心逻辑) smallBuffer.loadPixels(); for (int i = 0; i < smallBuffer.pixels.length; i++) { // 替换成你的逐像素处理代码,比如生成随机色示例 smallBuffer.pixels[i] = color(random(255), random(255), random(255)); } smallBuffer.updatePixels(); // 2. 把小缓冲区放大后绘制到窗口 image(smallBuffer, 0, 0, width, height); }
关键说明
- 你只需要专注操作
smallBuffer的pixels[],它始终是100x100的尺寸,完全不影响你的逐像素逻辑。 image()函数的缩放是底层优化的,帧率能轻松跑到60(默认上限)。- 如果需要交互(比如鼠标点击对应小缓冲区的像素),只需要把鼠标坐标除以缩放比例:
void mousePressed() { int bufferX = mouseX / scaleFactor; int bufferY = mouseY / scaleFactor; if (bufferX >=0 && bufferX < smallSize && bufferY >=0 && bufferY < smallSize) { smallBuffer.loadPixels(); smallBuffer.pixels[bufferY * smallSize + bufferX] = color(255, 0, 0); smallBuffer.updatePixels(); } }
方法二:用PGraphics做离屏渲染
如果需要更复杂的绘图操作(比如除了pixels[]还要画形状),可以用PGraphics做离屏缓冲区,逻辑和方法一类似:
PGraphics smallCanvas; int scaleFactor = 4; int smallSize = 100; void setup() { size(smallSize * scaleFactor, smallSize * scaleFactor); smallCanvas = createGraphics(smallSize, smallSize); } void draw() { smallCanvas.beginDraw(); // 这里可以混合操作pixels[]和绘图函数 smallCanvas.loadPixels(); // 你的逐像素处理逻辑... smallCanvas.updatePixels(); // 也可以在smallCanvas上画形状、文字等 smallCanvas.fill(255, 0, 0); smallCanvas.rect(10, 10, 20, 20); smallCanvas.endDraw(); // 放大显示 image(smallCanvas, 0, 0, width, height); }
为什么你的原方法帧率低?
你循环画S×S的rect,本质是在draw()里执行10000次软件渲染的矩形绘制,每次都要走图形API的调用流程,开销极大。而内置的图像缩放是直接操作像素缓冲区的内存拷贝/插值,效率完全不在一个量级。
内容的提问来源于stack exchange,提问作者cotterjk
相关产品推荐
相关产品推荐

