Sfoglia il codice sorgente

feat:重写渲染逻辑,使用多线程渲染图像

yang yi 2 settimane fa
parent
commit
ab47c0a006

+ 45 - 0
src/main/java/space/anyi/render/First.java

@@ -1,6 +1,11 @@
 package space.anyi.render;
 
 import space.anyi.render.core.Render;
+import space.anyi.render.utils.PPMUtil;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * @ProjectName: render
@@ -15,6 +20,9 @@ import space.anyi.render.core.Render;
  * vec2 p=(FC.xy*2.-r)/r.y,l,v=p*(1.-(l+=abs(.7-dot(p,p))))/.2;for(float i;i++<8.;o+=(sin(v.xyyx)+1.)*abs(v.x-v.y)*.2)v+=cos(v.yx*i+vec2(0,i)+t)/i+.7;o=tanh(exp(p.y*vec4(1,-1,-2,0))*exp(-4.*l.x)/o);
  */
 public class First extends Render {
+    private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(6);
+    private AtomicInteger count;
+
     public First() {
         super();
     }
@@ -98,4 +106,41 @@ public class First extends Render {
 
         return imageData;
     }
+
+    @Override
+    public void render() {
+        int width = getWidth();
+        int height = getHeight();
+        int fps = getFps();
+        int duration = getDuration();
+        int totalFrames = getTotalFrames();
+        String outputDir = getOutputDir();
+        System.out.println("开始生成分形动画...");
+        System.out.println("分辨率: " + width + "x" + height);
+        System.out.println("帧率: " + fps + " Hz");
+        System.out.println("时长: " + duration + " 秒");
+        System.out.println("总帧数: " + totalFrames);
+        System.out.println("输出目录: " + outputDir);
+        PPMUtil.createDirectory(outputDir);
+        count = new AtomicInteger(0);
+        for (int frame = 0; frame < totalFrames; frame++) {
+            float time = frame / (float) fps; // 计算当前时间(秒)
+            final int tempFrame = frame;
+            fixedThreadPool.execute(()->{
+                float[] imageData = generateFrame(width, height, time);
+                PPMUtil.saveAsPPM(imageData, width, height, outputDir + "/frame_" + String.format("%05d", tempFrame) + ".ppm");
+                myNotify();
+            });
+        }
+    }
+    private void myNotify() {
+        int frame = count.incrementAndGet();
+        int totalFrames = getTotalFrames();
+        // 显示进度
+        double progress = (frame + 1) * 100.0 / totalFrames;
+        System.out.printf("进度: %.1f%% (帧 %d/%d)%n", progress, frame + 1, totalFrames);
+        if (frame >= totalFrames) {
+            fixedThreadPool.shutdown();
+        }
+    }
 }

+ 9 - 1
src/main/java/space/anyi/render/core/Render.java

@@ -120,6 +120,14 @@ public abstract class Render implements GLSL {
     }
 
     protected float dot(float[] a, float[] b) {
-        return a[0] * b[0] + a[1] * b[1];
+        float result = 0;
+        for (int i = 0; i < a.length; i++) {
+            if (i==0){
+                result = a[i] * b[i];
+            }else{
+                result += a[i] * b[i];
+            }
+        }
+        return result;
     }
 }