cuốn sách gpt4 ai đã làm

Xoay hiệu quả hiển thị đang hoạt động hoặc cách kết hợp hiển thị đang hoạt động với các tiện ích gui

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 19:03:35 26 4
mua khóa gpt4 Nike

Tiếp tục câu hỏi trước , Tôi đang tìm cách tốt nhất để kết hợp hiển thị đang hoạt động với các trường văn bản trong Java. Tôi đã thử một số tùy chọn, sử dụng BufferStrategy, VolatileImage hoặc ghi đè update() và Paint() trong AWT tiêu chuẩn, nhưng cuối cùng tôi lại sử dụng Swing.

Tôi đăng trạng thái hiện tại ở đây phòng trường hợp bất kỳ ai có thông tin chi tiết mới dựa trên ví dụ về mã của tôi và có thể những người khác đang phát triển các ứng dụng tương tự có thể hưởng lợi từ những phát hiện của tôi.

Mục tiêu là hoàn thành ba kỳ công sau:

  • Hiển thị các đối tượng hoạt hình trên bộ đệm nền chỉ được cập nhật khi cần thiết
  • Sử dụng hộp văn bản ở đầu kết quả được hiển thị
  • Thay đổi kích thước cửa sổ mà không gặp vấn đề gì

Dưới đây là mã cho một ứng dụng demo được phát triển với sự trợ giúp tuyệt vời từ stackoverflowerthần rác rưởi .
Hai lưu ý:

1) Việc làm mới nghiêm ngặt các khu vực hoạt ảnh mà bước trước đó không hợp lệ dường như dễ gây ra lỗi hình ảnh, vì vậy tôi đã từ bỏ. Điều này có nghĩa là bây giờ tôi vẽ lại toàn bộ vùng đệm nền cho mỗi khung hình.

2) Hiệu quả của việc vẽ BufferedImage lên màn hình phụ thuộc rất nhiều vào nền tảng. Việc triển khai Mac dường như không hỗ trợ tăng tốc phần cứng một cách thích hợp, điều này khiến cho việc vẽ lại hình nền cho cửa sổ đầu ra trở thành một công việc tẻ nhạt, tất nhiên tùy thuộc vào kích thước cửa sổ.

Tôi đã tìm thấy các kết quả sau trên iMac lõi kép 2,93 GHz của mình:

Mac OS 10.5:
640 x 480: 0,9 ms, 8 - 9%
1920 x 1100: 5 ms, 35 - 40%

Windows XP:
640 x 480: 0,05 mili giây, 0%
1920 x 1100: 0,05 mili giây, 0%

huyền thoại:
Kích thước màn hình: thời gian trung bình để vẽ một khung hình, mức sử dụng CPU của ứng dụng.

Theo như tôi biết, mã bên dưới là cách hiệu quả nhất để đạt được mục tiêu của tôi. Mọi thông tin chi tiết, tối ưu hóa hoặc kết quả thử nghiệm mới đều được hoan nghênh!

Trân trọng, Matisse

nhập java.awt.Color;
nhập java.awt.Dimension;
nhập java.awt.EventQueue;
nhập java.awt.Graphics;
nhập java.awt.Graphics2D;
nhập java.awt.GraphicsConfiguration;
nhập java.awt.GraphicsDevice;
nhập java.awt.GraphicsEnvironment;
nhập java.awt.GridLayout;
nhập java.awt.Rectangle;
nhập java.awt.Transparency;
nhập java.awt.event.ActionEvent;
nhập java.awt.event.ActionListener;
nhập java.awt.event.ComponentAdapter;
nhập java.awt.event.ComponentEvent;
nhập java.awt.event.MouseAdapter;
nhập java.awt.event.MouseEvent;
nhập java.awt.image.BufferedImage;
nhập javax.swing.JFrame;
nhập javax.swing.JPanel;
nhập javax.swing.JTextField;
nhập javax.swing.Timer;

lớp công khai SwingTest mở rộng các triển khai JPanel
Trình nghe hành động,
Có thể chạy được
{
riêng tư cuối cùng dài serialVersionUID = 1L;

bộ đệm nền BufferedImage riêng tư;
boolean repaintbackground = true;

riêng tư cuối cùng tĩnh initWidth = 640;
riêng tư tĩnh cuối cùng initHeight = 480;
bán kính int tĩnh cuối cùng = 25;
riêng cuối cùng Bộ hẹn giờ t = Bộ hẹn giờ mới (20, cái này);
riêng tư cuối cùng Hình chữ nhật trực tràng = Hình chữ nhật mới();

riêng tư tổng thời gian dài = 0;
khung int riêng tư = 0;
thời gian trung bình dài riêng tư = 0;

public static void main(String[] args) {
EventQueue.invokeLater(new SwingTest());
}

công khai SwingTest() {
siêu (đúng);
this.setPreferredSize(New Dimension(initWidth, initHeight));
this.setLayout(null);
this.setOpaque(false);
this.addMouseListener(New MouseHandler());
}

@Ghi đè
công khai void run() {
JFrame f = JFrame mới("SwingTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.addComponentListener(new ResizeHandler());

/* Panel bổ sung này với GridLayout là cần thiết để đảm bảo
bảng nội dung của chúng tôi được thay đổi kích thước phù hợp với cửa sổ.*/
JPanel p = JPanel mới(new GridLayout());
p.add(cái này);
f.add(p);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);

createBuffer();
t.start();
}

@Ghi đè
public void actionPerformed(ActionEvent e) {
this.repaint();
}

@Ghi đè
protected void PaintComponent(Graphics g) {
bắt đầu dài = System.nanoTime();
super.paintComponent(g);

if (backgroundBuffer == null) createBuffer();
nếu (repaintbackground) {

/* Sơn lại nền có thể yêu cầu các thao tác hiển thị phức tạp,
vì vậy chúng tôi không muốn thực hiện việc này ở mọi khung hình.*/
repaintBackground(backgroundBuffer);
sơn lại nền = sai;
}

/* Sơn lại bộ đệm nền được kết xuất trước ở mỗi khung hình
dường như không thể tránh khỏi.
vùng bị vô hiệu và chỉ sơn lại phần đó của bộ đệm nền
hình ảnh đã thất bại */
g.drawImage(backgroundBuffer, 0, 0, null);
repaintBall(g, BackgroundBuffer, this.getWidth(), this.getHeight());
repaintDrawTime(g, System.nanoTime() - bắt đầu);
}

void repaintBackground(Bộ đệm BufferedImage) {
Graphics2D g = buffer.createGraphics();
int width = buffer.getWidth();
int chiều cao = buffer.getHeight();

g.clearRect(0, 0, chiều rộng, chiều cao);
vì (int i = 0; i < 100; i++) {
g.setColor(Màu mới(0, 128, 0, 100));
g.drawLine(width, Height, (int)(Math.random() * (width - 1)), (int)(Math.random() * (height - 1)));
}
}

void repaintBall(Đồ họa g, Bộ đệm hình ảnh đệm, chiều rộng int, chiều cao int) {
thời gian gấp đôi = 2* Math.PI * (System.currentTimeMillis() % 3300) / 3300.;
orth.setRect((int)(Math.sin(time) * width/3 + width/2 - bán kính), (int)(Math.cos(time) * chiều cao/3 + chiều cao/2) - bán kính, bán kính * 2, bán kính * 2);

g.setColor(Color.BLUE);
g.fillOval(orth.x, orth.y, orth.width, orth.height);
}

void repaintDrawTime(Đồ họa g, frameTime dài) {
if (khung == 32) {avgTime = tổng thời gian/32; tổng thời gian = 0; khung = 0;}
khác {totalTime += frameTime; khung ++;
g.setColor(Color.white);
Chuỗi s = String.valueOf(avgTime / 1000000d + "ms");
g.drawString(s, 5, 16);
}

void createBuffer() {
int width = this.getWidth();
int chiều cao = this.getHeight();

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
Cấu hình đồ họa gc = gs.getDefaultConfiguration();
nềnBuffer = gc.createCompatibleImage(chiều rộng, chiều cao, Độ trong suốt.OPAQUE);

repaintbackground = true;
}

lớp riêng MouseHandler mở rộng MouseAdapter {

@Ghi đè
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
Trường JTextField = JTextField mới("test");
Thứ nguyên d = field.getPreferredSize();
field.setBounds(e.getX(), e.getY(), d.width, d.height);
thêm (trường);
}
}

lớp riêng ResizeHandler mở rộng ComponentAdapter {

@Ghi đè
public void thành phầnResized(ComponentEvent e) {
super.comComponentResized(e);
System.out.println("Đã thay đổi kích thước thành " + getWidth() + " x " + getHeight());
createBuffer();
}
}
}

câu trả lời hay nhất

Tôi có một vài suy nghĩ:

  1. bạn đã cải thiệnsơn lạiDrawTime() Rất dễ đọc, nhưng nó làđiểm chuẩn vi môvà tùy thuộc vàothất thườngHệ điều hành máy chủ. Tôi không thể không tự hỏi liệu XP có phải là hệ thống không độ phân giải đồng hồ hạn chế sản phẩm. Tôi thấy kết quả rất khác nhau trên Windows 7 và Ubuntu 10.

  2. Nếu bạn không sử dụng bố cục trống, bạn không cần các bảng bổ sung; JPanel Bố cục mặc định là FlowLayout,f.add(cái này) Chỉ cần thêm nó vào mặc định của khung Trung tâm BorderLayout.

  3. Việc gọi hàm tạo nhiều lần có thể tốn thời gian.

    Xem xét thay thế

    g.setColor(Màu mới(0, 128, 0, 100));

    riêng tư tĩnh cuối cùng Màu màu = Màu mới (0, 128, 0, 100);
    ...
    g.setColor(màu);

    Hoặc, một cách đơn giản bảng tra cứu màu sắc , có thể hữu ích, ví dụ:

    riêng tư cuối cùng Queue clut = new LinkedList();

Về java - Hiệu quả hiển thị hoạt động của Swing hoặc cách kết hợp hiển thị hoạt động với các tiện ích gui, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/3289336/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress