2009-02-02 62 views
8

Ngôn ngữ đích là C/C++ và chương trình chỉ hoạt động trên Linux, nhưng các giải pháp độc lập nền tảng được ưu tiên rõ ràng. Tôi chạy Xorg, XVideo và OpenGL.Cách nhanh nhất để vẽ một mảng 2D của ba màu trên màn hình là gì?

Tôi có thể mong đợi bao nhiêu FPS trên 1024x768 trên Intel Core 2 Duo với đồ họa Intel? (CHỈ số lượng bản vẽ, xem xét các mảng sẵn sàng trong RAM; không cần chẩn đoán chính xác)

+0

"Mảng ba màu 2D" là gì? Một máy tính hiện đại đẹp, với một số tăng tốc phần cứng sẽ có thể đặt khá một vài hình tam giác trên một màn hình với tốc độ hơn 30 khung hình/giây, mà không lưu trữ bất cứ thứ gì trong VRAM. Tuy nhiên, việc sử dụng VRAM dễ sử dụng và sẽ tăng tốc độ đó thậm chí cao hơn. –

+0

một bộ ba RGB. Đối với mỗi pixel tôi có 3 giá trị (một màu đỏ, một màu xanh lá cây và một màu xanh dương) –

+0

Phiên bản SDL http: // stackoverflow.com/questions/28279242/how-to-render-a-pixel-array-hiệu quả nhất-to-a-cửa sổ-trong-c –

Trả lời

9

Cách nhanh nhất để vẽ một mảng 2D của ba màu:

  1. Sử dụng phao (không byte, không kép) lưu trữ. Mỗi bộ ba bao gồm 3 phao từ 0,0 đến 1,0 mỗi cái. Đây là định dạng được triển khai tối ưu nhất bởi GPU (nhưng sử dụng greyscale GL_LUMINANCE lưu trữ khi bạn không cần màu - nhanh hơn nhiều!)
  2. Tải lên mảng tới một kết cấu với glTexImage2D
  3. Hãy chắc chắn rằng các tham số GL_TEXTURE_MIN_FILTER kết cấu được thiết lập để GL_NEAREST
  4. Ánh xạ các kết cấu cho một quad thích hợp.

Phương pháp này là nhanh hơn một chút so với glDrawPixels (mà đối với một số lý do có xu hướng được thực hiện nặng) và rất nhiều nhanh hơn so với sử dụng blitting mẹ đẻ của nền tảng.

Ngoài ra, nó cung cấp cho bạn tùy chọn lặp lại bước 4 mà không cần bước 2 khi bản đồ pixmap của bạn không thay đổi, tất nhiên là nhanh hơn nhiều.

thư viện cung cấp chỉ làm chậm blitting bản địa bao gồm:

  • Windows GDI
  • SDL trên X11 (trên Windows nó cung cấp một OpenGL backend nhanh khi sử dụng HW_SURFACE)
  • Qt

Đối với FPS bạn có thể mong đợi, vẽ một kết cấu 1024x768 trên Intel Core 2 Duo với đồ họa Intel: khoảng 60FPS nếu kết cấu thay đổi mọi khung hình và> 100FPS nếu không.

Nhưng hãy tự mình thực hiện và xem;)

+0

Các họa tiết kết cấu SDL trên X11 cũng có vẻ sử dụng tăng tốc phần cứng hiện nay. Xem thêm: http://stackoverflow.com/questions/21392755/difference-between-surface-and-texture-sdl-general và thử ví dụ 'test/testspriteminimal.c' trên phiên bản 2.0 trong Ubuntu 15.10, nvidia-settings nói mức sử dụng GPU lên tới 100% và FPS trông cao. –

0

Tôi có thể mong đợi bao nhiêu FPS trên 1024x768?

Câu trả lời cho câu hỏi đó phụ thuộc vào quá nhiều yếu tố không thể nói được.

+0

Ok, hãy chính xác rằng: - các câu như 'từ 60 đến 100 FPS' hoặc 'chắc chắn dưới 30 FPS' là ok - chỉ vẽ số lượng, tưởng tượng tất cả các mảng đã sẵn sàng trong RAM (không được lưu trữ hoặc trong bộ nhớ thẻ video) –

+1

Vâng, bạn chắc chắn sẽ nhận được một cái gì đó giữa 0 và ∞ fps. – Bombe

+0

Không trả lời được câu hỏi. – Luc

1

Nếu bạn đang cố gắng đổ pixel đến màn hình, có thể bạn sẽ muốn sử dụng các mặt nạ sdl's 'bề mặt'. Để có hiệu suất cao nhất, hãy cố gắng sắp xếp dữ liệu đầu vào theo cách bố trí tương tự với bề mặt đầu ra. Nếu có thể, hãy tránh chỉ định từng pixel trên bề mặt một lần.

SDL không phải là giao diện phần cứng, mà là lớp di động hoạt động tốt trên nhiều lớp hiển thị khác, bao gồm DirectX, OpenGL, DirectFB và xlib, vì vậy bạn có khả năng di chuyển rất tốt và một lớp rất mỏng trên các công nghệ đó, vì vậy bạn phải trả rất ít chi phí thực hiện trên đầu trang của những công nghệ đó.

tùy chọn
1

khác ngoài việc SDL (như đã đề cập)

  • Cairo bề mặt với vẻ hào nhoáng (trong C, hoạt động trên tất cả các plaforms nhưng tốt nhất trong Linux)
  • QT Canvas (trong C++, multiplaform)
  • OpenGL raw API hoặc QT OpenGL (Bạn cần biết OpenGL)
  • Xlib/XCB thuần túy nếu bạn muốn xem xét các biểu mẫu không phải là opengl

Đề nghị của tôi

  1. QT nếu bạn thích C++
  2. Cairo nếu bạn thích C
6

Tôi đã làm điều này một khi trở lại sử dụng C và OpenGL, và có hiệu suất rất tốt bằng cách tạo ra một toàn màn hình có kích thước quad, và sau đó sử dụng bản đồ kết cấu để chuyển bitmap lên mặt của quad.

Dưới đây là một số mã ví dụ, hy vọng bạn có thể sử dụng nó.

#include <GL/glut.h> 
#include <GL/glut.h> 

#define WIDTH 1024 
#define HEIGHT 768 

unsigned char texture[WIDTH][HEIGHT][3];    

void renderScene() {  

    // render the texture here 

    glEnable (GL_TEXTURE_2D); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    glTexImage2D (
     GL_TEXTURE_2D, 
     0, 
     GL_RGB, 
     WIDTH, 
     HEIGHT, 
     0, 
     GL_RGB, 
     GL_UNSIGNED_BYTE, 
     &texture[0][0][0] 
    ); 

    glBegin(GL_QUADS); 
     glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0, -1.0); 
     glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0, -1.0); 
     glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0, 1.0); 
     glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0, 1.0); 
    glEnd(); 

    glFlush(); 
    glutSwapBuffers(); 
} 

int main(int argc, char **argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 

    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(WIDTH, HEIGHT); 
    glutCreateWindow(" "); 

    glutDisplayFunc(renderScene); 

    glutMainLoop(); 

    return 0; 
} 
+0

Tôi muốn giới thiệu kỹ thuật này. Hai điểm nhỏ: 1) tùy thuộc vào GPU, không hỗ trợ hai kích thước kết cấu có thể không được hỗ trợ. 2) cho các khung tiếp theo, tốt hơn là sử dụng glTexSubImage() trên kết cấu hiện có, vì lý do hiệu suất. – codelogic

+0

OpenGL không hoạt động theo cách này nữa. Bạn có thể thoát ra trong một số trường hợp với việc mô phỏng đường ống chức năng cố định nhưng nó không phải là một ý tưởng hay. Các công cụ GL mới là một cải tiến tuyệt vời trên những thứ cũ nhưng đáng buồn là thiết lập là loại cường độ cao. –

1

câu hỏi "số lượng fps tôi có thể mong đợi" không thể được trả lời một cách nghiêm túc. thậm chí nếu bạn đặt tên cho ông nội của người đã làm bố cục bộ vi xử lý. nó phụ thuộc vào tooooo nhiều biến.

  • bạn cần render bao nhiêu ba?
  • chúng có thay đổi giữa các khung không?
  • với tốc độ nào (bạn sẽ không nhận thấy thay đổi nếu nó thường xuyên hơn 30 lần một giây)?
  • tất cả các pixel có thay đổi toàn bộ thời gian hay chỉ một số pixel ở một số khu vực không?
  • bạn có nhìn vào các pixel mà không bị biến dạng phối cảnh không?
  • bạn có luôn thấy tất cả các pixel không?
  • tùy theo phiên bản của trình điều khiển OpenGL bạn sẽ nhận được kết quả khác nhau

này có thể tiếp tục mãi mãi, câu trả lời phụ thuộc absolutly trên thuật toán của bạn. nếu bạn dính vào cách tiếp cận opengl bạn cũng có thể thử các phần mở rộng khác nhau (ví dụ: http://www.opengl.org/registry/specs/NV/pixel_data_range.txt), để xem liệu nó có phù hợp với nhu cầu của bạn tốt hơn không; mặc dù phương thức glTexSubImage() đã đề cập khá nhanh.

Các vấn đề liên quan