2011-09-14 43 views
5

Tôi có dòng mã này:Java: openGL: JOGL: Điều gì xảy ra sau hậu trường khi tôi gọi phương thức display()?

renderableObject.renderObject(gl, glu); 

Điều này dẫn tới một danh sách lớn của các đối tượng được đưa ra bởi OpenGL, tuy nhiên nó chỉ hoạt động khi sử dụng như sau:

@Override 
public void display(GLAutoDrawable drawable) 
    {    
     renderableObject.renderObject(gl, glu); 
    } 

Nếu tôi gọi là dòng bên ngoài phương thức hiển thị ghi đè, tôi nhận được Ngoại lệ nói rằng không có glContext trên luồng hiện tại, thực sự nếu tôi gọi bất kỳ lệnh vẽ gl nào bên ngoài phương pháp này, tôi nhận được ngoại lệ tương tự

lý tưởng là tôi muốn tạo nhiều danh sách hiển thị s một lần, sau đó render chúng mỗi frame với danh sách hiển thị lẻ được tái tạo định kỳ. Tuy nhiên tôi phải đi qua phương thức display() đơn này có nghĩa là tôi sẽ phải kiểm tra mọi frame nếu danh sách hiển thị đã được tạo, hoặc cần thay đổi ... 60 lần một giây! những gì một sự lãng phí năng lượng xử lý khi tôi có thể xử lý chúng một cách riêng biệt một lần khi cần thiết. Vì vậy, bất cứ điều gì gọi phương thức display(), tôi muốn có thể sao chép nó cho phép tôi tạo ra rất nhiều phương pháp hiển thị tùy chỉnh của riêng tôi, mà không phải trải qua một phương pháp này cho mọi thứ!

Vì vậy, có một cuộc gọi gl đơn giản mà tôi có thể tự làm?

Trả lời

2

Rất tiếc vì có vẻ như đây là cách thức hoạt động của nó.

Phía sau hậu trường những gì đang xảy ra là khi GLCanvas bạn đã tạo ra sẽ được vẽ, đằng sau hậu trường, JOGL đang thực hiện toàn bộ công việc. Nó đang tạo ra một GLContext, và làm cho nó hiện tại cho GLCanvas cho luồng hiện tại. Chỉ khi đó được thực hiện, bạn có thể thực hiện cuộc gọi rendering. Một GLContext đã không được thực hiện hiện tại, hoặc một đối tượng GL có nguồn gốc từ nó, là không sử dụng cho bạn. Ngoài ra, GLContext chỉ được thực hiện cho chủ đề và được thực hiện không hiện tại ngay sau khi cuộc gọi hiển thị kết thúc, vì vậy việc treo trên tham chiếu đến nó hoặc GL để sử dụng sau này sẽ không hoạt động.

Hầu như tất cả các ứng dụng JOGL hoạt động theo cách đó. Bạn tạo một GLEventListener và triển khai display() trong nó, trích xuất một GL từ GLAutoDrawable và sử dụng nó để thực hiện các cuộc gọi rendering. Bạn không muốn thực hiện các cuộc gọi rendering ở bất kỳ nơi nào khác, bất kỳ điều gì khác ngoài việc bạn muốn thực hiện các cuộc gọi Graphics2D bên ngoài phương thức paint(). Hầu hết các lập trình viên Java mới bắt đầu cố gắng vẽ từ bên ngoài phương pháp vẽ; điều này là tương tự. Nếu bạn cần kích hoạt một repaint thì bạn làm theo cách tương tự với Java2D: sử dụng invalidate(). (Tất nhiên bạn có thể viết submethods được gọi từ phương thức display(), và lấy GL hoặc GLAutoDrawable làm đối số).

Có nhiều cách để bạn có thể tạo riêng một GLContext và tự làm cho bản thân hiện tại, nhưng chúng hiếm khi cần thiết. Nó gần như luôn luôn tốt hơn để sử dụng cách tiếp cận ở đây.

+1

đằng sau hậu trường JOGL đang thực hiện toàn bộ công việc. Nó đang tạo ra một GLContext, và làm cho nó hiện tại cho GLCanvas cho luồng hiện tại. ------- Tôi không thể tự mình làm điều này? – Troyseph

+0

Sebastian Troy, bạn có thể nhưng những gì nó làm là không thực sự tầm thường. Bạn có thể thực hiện các hoạt động tối thiểu nghiêm ngặt (lấy GLContext từ GLAutoDrawable và làm cho nó hiện tại) nhưng hãy nhớ rằng JOGL chứa rất nhiều điều thú vị và cách giải quyết giúp nó an toàn hơn OpenGL thuần túy trong C hoặc với một ràng buộc khác trong Java, C#, Python, ... Hơn nữa, nó thực sự dễ dàng để làm hỏng hiệu suất của bạn nếu bạn làm điều gì đó xấu. Khi tôi chuyển Ardor3D sang JOGL 2, tôi phát hiện ra hơn makeCurrent() vô dụng được gọi một lần, việc loại bỏ cuộc gọi này đã cho tôi một sự thúc đẩy rất lớn khi v-sync bị tắt. – gouessej

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