Tôi đã nghiên cứu và tạo ra các trò chơi nhỏ trong một thời gian, và gần đây tôi đã quyết định rằng tôi sẽ cố gắng phát triển trò chơi cho Android.Cách tốt nhất để tách logic trò chơi khỏi hiển thị cho trò chơi có nhịp độ nhanh cho Android bằng OpenGL?
Đối với tôi, việc nhảy từ mã C++ gốc sang Java Android không khó, nhưng nó khiến tôi đau đầu suy nghĩ về cách duy trì logic tách biệt khỏi hiển thị.
Tôi đã đọc ở đây và trên các trang web khác mà:
Nó là tốt hơn để không tạo ra thread khác cho nó, chỉ vì ý Android chắc chắn không có vấn đề để xử lý.
Ý nghĩa mã sẽ là một cái gì đó như thế này:
public void onDrawFrame(GL10 gl) {
doLogicCalculations();
clearScreen();
drawSprites();
}
Nhưng tôi không chắc chắn nếu điều đó sẽ là phương pháp tốt nhất. Vì tôi không nghĩ tôi thích nó trông như thế nào nếu tôi đặt logic của mình vào phương thức GLRenderer::onDrawFrame
. Theo như tôi biết, phương pháp này có nghĩa là chỉ cần vẽ, và tôi có thể làm chậm khung nếu tôi đặt logic ở đó. Chưa kể rằng nó làm tổn thương các khái niệm về POO trong sự hiểu biết của tôi.
Tôi nghĩ rằng việc sử dụng đề có thể là đường đi, đây là cách tôi đang lên kế hoạch:
Hoạt động chính:
public void onCreate(Bundle savedInstanceState) {
//set fullscreen, etc
GLSurfaceView view = new GLSurfaceView(this);
//Configure view
GameManager game = new GameManager();
game.start(context, view);
setContentView(view);
}
GameManager:
OpenGLRenderer renderer;
Boolean running;
public void start(Context context, GLSurfaceView view) {
this.renderer = new OpenGLRenderer(context);
view.setRenderer(this.renderer);
//create Texturelib, create sound system...
running = true;
//create a thread to run GameManager::update()
}
public void update(){
while(running){
//update game logic here
//put, edit and remove sprites from renderer list
//set running to false to quit game
}
}
và cuối cùng, OpenGLRenderer:
ListOrMap toDraw;
public void onDrawFrame(GL10 gl) {
for(sprite i : toDraw)
{
i.draw();
}
}
Đây là một ý tưởng thô, không hoàn toàn đầy đủ. Mẫu này sẽ giữ cho tất cả được tách ra và trông đẹp hơn một chút, nhưng nó có phải là cách tốt nhất cho hiệu suất không?
Miễn là tôi đã nghiên cứu, hầu hết các ví dụ về trò chơi luồng đều sử dụng canvas hoặc surfaceview, những ví dụ này sẽ không phù hợp với trường hợp của tôi, bởi vì tôi đang sử dụng OpenGLES.
Vì vậy, đây là những câu hỏi của tôi:
Đó là cách tốt nhất để tách Logic trò chơi của tôi từ rendering khi sử dụng OpenGLES? Threading ứng dụng của tôi? Đặt logic trong một phương pháp riêng biệt và chỉ cần gọi nó từ phương pháp vẽ?
Câu trả lời hay Steve, cảm ơn!Tôi nghĩ rằng ngay cả khi tôi không muốn làm hỏng thiết kế, tôi sẽ làm theo # 1. Trò chơi của tôi đang hoạt động, nhưng không có tính toán nặng về nó, như vật lý hoặc rất nhiều kiểm tra va chạm. Chỉ cần để chắc chắn về những suy nghĩ của tôi, cách tiếp cận của tôi về luồng trong câu hỏi sẽ là chính xác nếu tôi chọn nó (thread logic bằng văn bản trong một bản đồ đồng bộ và làm cho thread đọc nó)? –
Ồ, một điều nữa. mọi người nói tôi giới hạn cập nhật logic của tôi thành 30 khung hình/giây, đây là trường hợp để hiển thị quá? Tôi có nên giới hạn toàn bộ chức năng để chờ 33ms cho mỗi lần cập nhật hay chỉ cập nhật logic nếu đã được thông qua 33ms kể từ lần cập nhật cuối cùng? –
Tôi không nghĩ rằng bạn phải hạn chế nó, nhưng có lẽ không mong đợi tốt hơn so với một số điện thoại. Điều này là do tốc độ khung hình của một số điện thoại HDPI đầu tiên (tôi nghĩ vào khoảng thời gian của Droid 1) đã bị giới hạn, có nghĩa là chúng không thể vẽ một màn hình có nhiều pixel hơn khoảng 30 lần mỗi giây. Có lẽ GPU có thể quay khung hình nhanh hơn thế, nhưng CPU không thể di chuyển chúng đến màn hình đủ nhanh. Đây không phải là trường hợp trên điện thoại mới hơn tôi nghĩ. –