所以我有这个小程序(或者草图,如果你喜欢的话)。我的问题是,我该如何表达,当线条移动时,会有点抖动和颤动。这与我的计算机的处理能力有关,还是我应该以不同的方式编码?
这是代码:
int i, j;
void setup() {
size(1440, 900);
background(0);
smooth();
strokeWeight(10);
i = width/2 - (width/2);
j = width;
}
void draw() {
fill(0, 10); // semi-transparent black
stroke(0);
rect(0, 0, width, height); //legger seg lag på lag
if (i < width-200) {
i+=4;
j-=4;
}
else {
i = width/2 - (width/2);
j = width;
}
stroke(255);
line(width/2, height, i, 30);
line(width/2, height, i+40, 30);
line(width/2, height, i+80, 30);
line(width/2, height, i+120, 30);
line(width/2, height, i+160, 30);
line(width/2, height, i+200, 30);
line(width/2, height, j, 30);
line(width/2, height, j-40, 30);
line(width/2, height, j-80, 30);
line(width/2, height, j-120, 30);
line(width/2, height, j-160, 30);
line(width/2, height, j-200, 30);
}
最佳答案
使用 JVisualVM 进行快速配置后事实证明有两个罪魁祸首:
- 渲染线
- 处理抗锯齿透明度
渲染线: 在幕后处理将每条线渲染为形状(beginShape()/endShape()),在本例中使用 LINES。您可以为处理提供帮助,而不是使用多个 beginShape/endShape 调用(每行 1 个),只需对所有行使用一个即可:
beginShape(LINES);
for(int k = 0; k < 200; k+= 40){
vertex(hw, height);vertex(i+k, 30);
vertex(hw, height);vertex(j-k, 30);
}
endShape();
抗锯齿和透明度 使用透明度通常计算量很大,尤其是对于大图像。 运行下面的代码片段,按下鼠标按钮,看看在不使用透明度时,frameRate 如何变化。
抗锯齿的计算成本也很高。不像透明度那么重要,但除此之外,它也有影响。按任意键可在锯齿图形和抗锯齿图形之间切换
Here are a few tweaks to your code:
int i, j;
int hw;
boolean smooth;
void setup() {
size(1440, 900);
background(0);
strokeWeight(10);
hw = width/2;
i = width/2 - (width/2);//isn't this 0 ?
j = width;
}
void draw() {
fill(0,mousePressed ? 255 : 10); // semi-transparent black
noStroke();
rect(0, 0, width, height); //legger seg lag på lag
if (i < width-200) {
i+=4;
j-=4;
}
else {
i = 0;
j = width;
}
stroke(255);
beginShape(LINES);
for(int k = 0; k < 200; k+= 40){
vertex(hw, height);vertex(i+k, 30);
vertex(hw, height);vertex(j-k, 30);
}
endShape();
frame.setTitle((int)frameRate+" fps, smooth: " + smooth);
}
void keyReleased(){
smooth = !smooth;
if(smooth) smooth();
else noSmooth();
}
关于java - 代码颤动(线条有点跳跃,看起来很糟糕),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459904/