在将VolatileImage(从BufferedImage创建)绘制到JPanel时遇到了一些CPU问题。 在我的应用程序中,我正在从网络摄像头读取图像数据。这些图像的分辨率为1920 * 1080像素,从网络摄像头读取的逻辑允许大约30 FPS。这发生在一个自己的线程中。 在从网络摄像头读取的循环中,我得到一个BufferedImage并将其绘制到VolatileImage中。然后我调用JPanel的重绘方法来绘制VolatileImage。 网络摄像头输出平稳而快速。问题是CPU。它的CPU使用率为95%-100%。
我已经尝试过不重新绘制每个网络摄像头帧,但每30毫秒只会重新绘制一次。 CPU使用率是相同的。 如果我不重新绘制JPanel(因此没有显示图像),但只读取相机中的帧并将它们存储在bufferedImage中,则CPU使用率保持较低。因此绘图部分是CPU消耗部分。不是从网络摄像头读取帧。
这是我的JPanel的paintComponent方法(没什么特别的......)
public void paintComponent(Graphics g) {
g.drawImage(cameraModel.volatileImage, 0, 0, null);
}
这是从网络摄像头请求帧的方法:
public void run() {
running = true;
while(running){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
dartCamPanel.repaint();
if (camera.read(frame)){
ByteBuffer bb = frame.createBuffer();
bb.get(byteBuffer, 0, bb.capacity());
volatileContext.drawImage(bufferedImage, 0, 0, null);
}
}
}
我做错了什么?