处理方程优化反应扩散java
我正在用java(和Processing)处理Gray Scott patterns 我想优化它。 我没有任何GPU加速技能。因此,我尝试优化方程:
U[i][j] += ( U*lapU - uvv + F*(1 - u) ) * 1.38 ;
V[i][j] += ( V*lapV + uvv - (K+F)*v ) * 0.63 ;
但也许还有其他的方法,这里是函数
如果你有任何提高速度的想法
float uvv, u, v, diffU, diffV, F, K, lapU, lapV;
float[] MINI = { 0.00, 0.01, 0.03, 0.005 };
float[] MAXI = { 0.15, 0.08, 0.11, 0.05 };
PImage reactionDiffusion (PImage img) {
int W = img.width, H = img.height;
int[][] offsetW = new int[W][2], offsetH = new int[H][2];
float[][] U = new float[W][H], V = new float[W][H];
float time = millis();
// INITIALISATION
for (int i = 0; i < W; ++i) {
for (int j = 0; j < H; ++j) {
U[i][j] = 0.15 ;
V[i][j] = 0.7 ;
}
}
// init parameters
float[][][] fkuv = new float[W][H][4];
for (int i = 0; i<W; ++i){
for (int j = 0; j<H; ++j){
fkuv[i][j][0] = map( i, 0, H, MINI[0], MAXI[0] );
fkuv[i][j][1] = map( j, 0, W, MAXI[1], MINI[0] );
fkuv[i][j][2] = map(150,0,200,0,MAXI[2]);
fkuv[i][j][3] = map(50,0,200,0,MAXI[3]);
}
}
//Set up offsets
for (int i=0; i < W; ++i) { offsetW[i][0] = i-1; offsetW[i][1] = i+1; }
for (int i=0; i < H; ++i) { offsetH[i][0] = i-1; offsetH[i][1] = i+1; }
offsetW[0][0] = 0; offsetW[W-1][1] = W-1;
offsetH[0][0] = 0; offsetH[H-1][1] = H-1;
for (int n = 0; n< 2000 ; ++n){ // itérations
for (int i = 0; i < W; ++i) {
for (int j = 0; j < H; ++j) {
F = fkuv[i][j][0] ;
K = fkuv[i][j][1] ;
u = U[i][j];
v = V[i][j];
uvv = u*v*v;
lapU = U[offsetW[i][0]][j] +U[offsetW[i][1]][j] +U[i][offsetH[j][0]] +U[i][offsetH[j][1]] -4*u;
lapV = V[offsetW[i][0]][j] +V[offsetW[i][1]][j] +V[i][offsetH[j][0]] +V[i][offsetH[j][1]] -4*v;
U[i][j] += ( U*lapU - uvv + F*(1 - u) ) * 1.38 ;
V[i][j] += ( V*lapV + uvv - (K+F)*v ) * 0.63 ;
}
}
}
img.loadPixels();
int pShift;
for (int i = 0; i < W; i++) {
for (int j = 0; j < H; j++) {
pShift = int( U[i][j]*255 ) ;
img.pixels[j*W+i] = 0xff000000 | (pShift << 16) | (pShift << 8) | pShift ;
}
}
img.updatePixels();
println("time : "+ ( millis()-time ) /1000) ;
return img;
}
谢谢
# 1 楼答案
您可以在this answer中找到一些优化技巧
在GPU加速方面,你不需要学习所有东西。您应该能够理解顶点着色器和片段着色器之间的区别以及如何使用统一变量。看看这个awesome PShader tutorial
处理中也有片段PShader示例。 一旦掌握了窍门,就可以将反应扩散从shadertoy移植到处理中(只需非常小的调整)
下面是一个非常粗略的移植this shader示例
BufA。frag
着色器。frag
此外,您应该签出toxiclibs。它已经实现了与simutils包中的GrayScott类相同的文件
下面是一个例子: