2010-11-17 115 views
6

Khi đọc Redbook tôi thấy:Hiểu mối quan hệ giữa glutDisplayFunc và glutPostRedisplay

glutDisplayFunc (void (* func) (void)) là là người đầu tiên và quan trọng nhất sự kiện hàm callback bạn sẽ thấy. Bất cứ khi nào GLUT xác định rằng nội dung của cửa sổ cần phải là được hiển thị lại, hàm gọi lại được đăng ký bởi glutDisplayFunc() là được thi hành. Do đó, bạn nên đặt tất cả các thường trình bạn cần vẽ lại cảnh trong chức năng gọi lại màn hình .

Nếu chương trình của bạn thay đổi các nội dung của cửa sổ, đôi khi bạn sẽ phải gọi glutPostRedisplay(), mà cho glutMainLoop() một di chuyển để gọi màn hình hiển thị callback đăng ký tại cơ hội tiếp theo của nó

Lần nào trong đó glutPostRedisplay() nên được gọi? Từ đoạn này, tôi không hiểu tại sao chức năng của nó là cần thiết.

Trả lời

13

glutDisplayFunc được gọi bất cứ khi nào cửa sổ của bạn phải được vẽ lại. Điều này bao gồm thời gian khi một người gọi glutPostRedisplay :)

Khi nào một cửa sổ cần được vẽ lại?

  • Khi kích thước của nó làm thay đổi
  • khi nó trở nên rõ ràng
  • khi một số bộ phận của nó trở nên hữu hình
  • khi nó được di chuyển
  • vv

Nhưng nếu chức năng hiển thị của bạn vẽ một hình tam giác ở vị trí x; y trong đó x; y; được xác định bởi vị trí chuột? Trong trường hợp này, bạn phải yêu cầu hệ thống vẽ lại cửa sổ bất cứ khi nào con chuột được di chuyển sang phải không? Đó là lý do tại sao bạn sẽ gọi glutPostRedisplay từ MouseFunc(). Trên thực tế, khi bạn gọi glutPostRedisplay, sự kiện vẽ lại được xếp hàng cùng với các sự kiện cửa sổ khác, như các lần nhấp chuột. Về cơ bản những gì mainLoop của bạn có thể chọn các sự kiện từ hàng đợi đó và gọi các trình xử lý của họ

+0

Tôi không hiểu tại sao bạn sẽ không gọi glutDisplayFunc thay vì glutPostRedisplay trong trường hợp bạn đề cập đến xem xét glutPostRedisplay cuối cùng kết thúc gọi glutDisplayFunc. Tầm quan trọng của hàng đợi là gì? Nó có thể trì hoãn hiển thị trong khi chờ đợi một điều kiện không? – andandandand

+2

@omgzor: Trong ví dụ trên, bạn có thể làm điều đó. Nhưng đó không phải là lựa chọn tốt nhất. Bạn thấy đấy, tốt hơn là không gọi nó trực tiếp nhưng đặt nó trong một hàng đợi. Ví dụ: nếu bạn muốn hoạt ảnh và gọi displayFunc trực tiếp từ displayFunc, chương trình của bạn sẽ không phản hồi. Bởi vì bạn sẽ chặn vòng lặp. Đó là lý do tại sao tốt nhất để đăng sự kiện và để cho vòng lặp chính xử lý nó trong lượt của nó –

+0

@omgzor: Nó sẽ không trì hoãn hiển thị. Nó sẽ trì hoãn mọi thứ khác :) –

3

Chức năng bạn chuyển đến glutDisplayFunc chỉ được gọi là cửa sổ được thay đổi kích thước hoặc khi một cửa sổ khác ẩn nó. Ví dụ: nếu bạn sử dụng glutMouseFunc, bạn có thể muốn cập nhật (vẽ lại) nội dung cửa sổ của bạn theo dấu trang đó. Ngoài ra, nếu bạn vẽ hoạt ảnh, bạn cần gọi số glutPostRedisplay từ chức năng chờ của bạn.

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