graphics - 在 P5.js 中快速绘制单个像素
问题描述
我正在尝试在 P5.js 中制作旧的电视静态类型效果,虽然我能够制作效果,但帧速率非常低。
我的方法如下:
- 循环遍历每个像素
- 将笔画设置为随机值
- 调用 point() 函数绘制像素
最初,我直接在绘图函数中执行此操作,但速度非常慢。我每秒不到一帧。所以我切换到以下绘画缓冲区方法:
const SCREEN_WIDTH = 480
const SCREEN_HEIGHT = 480
var ScreenBuffer;
function setup(){
createCanvas(SCREEN_WIDTH, SCREEN_HEIGHT);
ScreenBuffer = createGraphics(SCREEN_WIDTH,SCREEN_HEIGHT);
}
function draw(){
paintBuffer();
image(ScreenBuffer,0,0);
}
function paintBuffer(){
console.log("Painting Buffer")
for(var x = 0; x< SCREEN_WIDTH; x++){
for(var y = 0; y< SCREEN_HEIGHT; y++){
ScreenBuffer.stroke(Math.random() * 255)
ScreenBuffer.point(x,y)
}
}
}
虽然我的性能得到了提升,但它远不及我想要的每秒 30 帧。有一个更好的方法吗?
我可以获得合理性能的唯一方法是用小方块填充屏幕,而不是使用以下代码:
for(var x = 0; x< SCREEN_WIDTH-10; x+=10){
for(var y = 0; y< SCREEN_HEIGHT-10; y+=10){
//ScreenBuffer.stroke(Math.random() * 255)
//ScreenBuffer.point(x,y)
ScreenBuffer.fill(Math.random() * 255);
ScreenBuffer.noStroke()
ScreenBuffer.rect(x,y,10,10)
}
}
但我真的很想要一个像素效果——最好是填满整个屏幕。
解决方案
信不信由你,这实际上是在stroke()
减慢你的草图速度。您可以通过直接设置像素值、使用set()
函数或pixels
直接访问数组来解决此问题。
更多信息可以在参考资料中找到,但这里有一个简单的例子:
function setup() {
createCanvas(500, 500);
}
function draw() {
for (var i = 0; i < width; i++) {
for (var j = 0; j < height; j++) {
var c = random(255);
set(i, j, c);
}
}
updatePixels();
text(frameRate(), 20, 20);
}
您可能考虑的另一种方法是提前生成一些包含静态图像的缓冲区,然后使用这些缓冲区来绘制静态图像。真的没有必要让静态完全动态,所以只做一次工作,然后从使用该createGraphics()
函数创建的图像文件或缓冲区加载。
推荐阅读
- python - 如何在不构建新的 .env 文件的情况下从访问环境变量值中获取文件数据?
- javascript-objects - 从 findOne 发回对象时,Fastify 响应不是打印机
- typescript - 无法将任何类型分配给 localStorage
- javascript - 我从存储库本地安装了一个 node.js 模块,但找不到该模块
- google-cloud-dataflow - 具有事件数量限制的 Apache Beam 会话窗口
- clips - clips6.40 的 CLIPSCRLWrapper.dll 内部是否存在内存泄漏以集成 C#?
- docker - 如何在气流的 KubernetesPodOperator 中使用 --privileged 运行 docker 映像
- python - 删除高级命令对我不起作用
- flutter - 使用 FutureBuilder 我在快照上获取空数据,而不是在构建器函数中获取数据
- snowflake-cloud-data-platform - 雪花 cron 任务错误?(不能在每个月的 x 天做)