2012-10-01 8 views
6

Xin chào các bạn, tôi đang làm một trò chơi với libGDX và tôi thực sự muốn tạo chuỗi trò chơi để tôi chạy vòng lặp vẽ và vòng lặp logic trên các chủ đề riêng biệt. với vòng lặp paintcomponent và vòng chạy runnablejava Chủ đề trong libGDX

Tôi có kinh nghiệm với luồng trong c nhưng không quá nhiều trong java cách duy nhất tôi có thể tạo chuỗi là tạo một lớp mở rộng chuỗi và sau đó tạo chạy vòng lặp trong đó

nhưng điểm tạo vòng lặp chạy là cho phép mỗi màn hình tính toán logic một cách tự do vì vậy tôi sẽ cần một số lớp abstractscreen có lớp tùy chỉnh lớp quảng cáo thực hiện

Im hỏi nếu có một cách đơn giản hơn hoặc nhiều tiêu chuẩn thực hiện đề cho tình trạng này

Trả lời

11

Thư viện libGDX đã chạy một chuỗi hiển thị riêng biệt cho các cập nhật ngữ cảnh OpenGL. Xem http://code.google.com/p/libgdx/wiki/TheArchitecture#The_Graphics_Module

Chúng tôi đã biết rằng chuỗi giao diện người dùng không được thực thi liên tục mà chỉ được lên lịch chạy bởi hệ điều hành nếu sự kiện cần được gửi đi (khoảng: p). Đó là lý do tại sao chúng tôi khởi tạo chuỗi thứ hai mà chúng tôi thường gọi là chuỗi hiển thị. Chủ đề này được tạo ra bởi mô-đun Đồ họa mà bản thân nó được khởi tạo bởi Ứng dụng khi khởi động.

Phương pháp ApplicationListener.render() trên đối tượng trò chơi chính của bạn sẽ được gọi bởi làm cho chủ đề này một lần cho mỗi refresh màn hình (vì vậy nó nên được khoảng 60hz), do đó chỉ cần đặt cơ thể của vòng lặp làm cho bạn trong việc thực hiện của bạn của phương pháp này .

Bạn có thể tạo chuỗi nền bổ sung (ví dụ: đối với logic trò chơi) theo phương pháp create của ApplicationListener của bạn (đảm bảo làm sạch nó theo phương pháp dispose). Khác với chủ đề render, tôi không nghĩ rằng bất kỳ chủ đề nào tồn tại từ trước sẽ là đúng nơi cho logic trò chơi.

Để liên lạc giữa các chuỗi, bạn có thể sử dụng bất kỳ phương pháp đồng bộ hóa Java hiện có nào. Tôi đã sử dụng Java ArrayBlockingQueue<> để gửi yêu cầu đến một chuỗi nền. Và tôi đã sử dụng Gdx.app.postRunnable() để lấy chủ đề nền của mình để đẩy dữ liệu đến chuỗi hiển thị (các Runnables như vậy được chạy trên khung tiếp theo, trước khi được gọi là render()).

+0

có lẽ tôi đã không rõ ràng Im biết rằng render là một chủ đề và nó lặp đi lặp lại liên tục.nhưng tôi đang tìm xem liệu tôi có thể có một chuỗi riêng biệt cho logic trò chơi thực tế hay không. nếu libGDX tạo một chuỗi mới cho kết xuất, làm cách nào để truy cập vào chuỗi gốc hoặc chuỗi gốc? – Mintybacon

+0

@Mintybacon Tôi đã cập nhật câu trả lời của mình với một số chi tiết khác về các tùy chọn liên lạc giữa các luồng. Hi vọng điêu nay co ich. –

0

Không chắc chắn những gì bạn có ý nghĩa, nhưng nó là tiêu chuẩn mà các bản vẽ trên màn hình (phản ánh những thay đổi màn hình) được thực hiện bởi một sợi đơn, chuyên dụng (ví dụ xem Swing framework). Điều này là bởi vì nó là khá khó khăn để cho nhiều chủ đề vẽ trên màn hình mà không có điều rối tung lên - chỉ có vài triển khai thực hiện điều này. Do đó, nếu bạn đang có kế hoạch để thực hiện các khung giao diện chính mình, phương pháp tiếp cận bản vẽ ren duy nhất sẽ được giới thiệu.

Đối với logic nghiệp vụ của bạn, nó phụ thuộc vào nhiều thứ. Một cách tiếp cận rất đơn giản có thể thực sự tạo ra một luồng mới cho mỗi hoạt động. Những chủ đề này sau đó có thể gửi kết quả cho chủ đề GUI đã nói. Vấn đề với cách tiếp cận này là hiệu quả của bạn có thể giảm đáng kể nếu nhiều hoạt động được thực hiện đồng thời cùng một lúc, bởi vì trong Java, mỗi luồng ánh xạ tới một chuỗi hệ điều hành gốc. Bạn có thể sử dụng các nhóm luồng để tránh điều đó. Thư viện chuẩn Java cung cấp các nhóm luồng là ThreadPoolExecutor hoặc nếu bạn muốn trừu tượng hóa cao hơn một chút, ExecutorService.

+0

Cảm ơn Ill nhìn vào ThreadPoolExecutor và lấy lại cho bạn! – Mintybacon