2012-01-09 32 views
18

Tôi phải viết một trò chơi cho android, tôi phải chọn giữa canvas hoặc opengl để vẽ. Tôi đã đọc rằng canvas không có tốc độ khung hình tốt, nhưng điều gì là tốt? Hãy tưởng tượng bạn sẽ viết một trò chơi chim giận dữ, khung hình sẽ có đủ khung hình không?trò chơi android, canvas hoặc opengl?

+2

bạn đã đọc qua tài liệu đồ họa trên trang web của nhà phát triển chưa? http://developer.android.com/guide/topics/graphics/index.html tôi sẽ đi với opengl nhưng trong android 3.0 và trên canvas có thể được tăng tốc phần cứng mà sẽ cải thiện hiệu suất – RyanSullivan

+5

Nếu bạn tải xuống ứng dụng thử nghiệm phương pháp sprite từ ở đây http://code.google.com/p/apps-for-android/ xây dựng và cài đặt, nó thực hiện đo điểm chuẩn bằng cách sử dụng các phương thức kết xuất khác nhau. có rất nhiều tiện ích mở rộng mà bạn có thể bật và tắt và xem hiệu ứng – RyanSullivan

Trả lời

1

Nếu bạn đang đi để làm như một trò chơi lớn, bạn chắc chắn nên xem xét sử dụng AndEngine: http://www.andengine.org/

Nếu sử dụng đúng, đó là một trợ giúp lớn. Đáng buồn là không có tài liệu nào trong mã. Nhưng diễn đàn trên trang web là khá ổn. Và ngay cả ở đây trên SO ngày càng có nhiều câu hỏi liên quan đến AndEngine xuất hiện. May mắn có một loạt các ví dụ tốt để giúp bạn bắt đầu.

AndEngine sử dụng OpenGL - vì vậy bạn không phải lo lắng xung quanh với các khung hình có thể thấp khi vẽ trên canvas.

Kiểm tra các ví dụ ứng dụng: https://market.android.com/details?id=org.anddev.andengine.examples

+0

cảm ơn. tôi sẽ có một cái nhìn – seipey

3

Tất cả phụ thuộc vào loại trò chơi bạn cần phải thực hiện.

Xét rằng bạn đang yêu cầu triển khai canvas, tôi đoán bạn đang đề cập đến trò chơi sprites 2D thuần túy.

Nếu sprites không nhiều và số lượng rất thấp, sự thật là khả năng bạn muốn nhận thấy sự khác biệt lớn (xem xét nhiều trò chơi với đồ họa 2D cơ bản sử dụng canvas).

Nếu các vấn đề về hiệu suất hoặc bạn có số lượng sprites rất cao thì sẽ rất đáng để triển khai hệ thống dựa trên OpenGL.

Hãy xem xét việc sử dụng OpenGL, bạn sẽ được hưởng lợi từ phần cứng chuyên dụng của GPU để CPU của bạn sẽ bị giảm tải gánh nặng đồ họa.

Hơn nữa, bạn sẽ được hưởng lợi nhiều linh hoạt hơn nhiều so với triển khai canvas bằng cách sử dụng hiệu ứng pha trộn, ánh sáng, hậu xử lý. Có thực sự không có giới hạn trong những gì bạn có thể làm.

Ví dụ đơn giản là xoay vòng và mở rộng quy mô sử dụng công cụ 3D chẳng hạn như OpenGL rất rẻ và mang lại kết quả tuyệt vời.

Canvas thực sự phải được áp dụng để triển khai đơn giản.

P.S. nếu bạn đi cho OpenGL ES 2.0 và đường ống lập trình, bạn thực sự không có giới hạn trong những gì bạn đạt được (phát sáng, làm mờ và hàng ngàn tùy chọn khác nhau). Giới hạn thực sự là tưởng tượng của chúng tôi trong trường hợp đó.

:)

+0

tôi đã làm việc với opengl trước và bạn là đúng, nó không có giới hạn. Cảm ơn câu trả lời của bạn. – seipey

45

tôi ban đầu đã viết trò chơi của tôi sử dụng Canvas nhưng sau đó cần thiết để chuyển sang OpenGL vì những lý do sau đây:

  • Sử dụng Canvas, sprites của bạn được lưu trữ trên heap (trừ khi bạn đặc biệt cache chúng vào đĩa) điều này đặt một giới hạn về tổng kích thước của tài sản sprite của bạn tùy thuộc vào điện thoại - không tốt! Tôi tìm thấy đây là khoảng 42MB trên điện thoại của tôi - lưu ý đây là kích thước không nén của bitmap. Nếu bạn có nhiều loại thực thể, mỗi loại có các hoạt ảnh khác nhau thì bạn có thể đạt đến kích thước này rất nhanh chóng.

  • OpenGL lưu trữ nội dung sprite của bạn một cách riêng biệt với vùng heap làm tăng bộ nhớ khả dụng một cách đáng kể.

  • Canvas không co giãn rất tốt. Các cuộc gọi .draw (...) nhiều hơn bạn thực hiện, nó sẽ chạy chậm hơn. Mối quan hệ khá tuyến tính.

  • Sử dụng OpenGL, bạn có thể thực hiện các cuộc gọi vẽ cùng nhau để cải thiện hiệu suất.

Có thể đáng sợ bắt đầu với OpenGL khiến Canvas có vẻ hấp dẫn. Tuy nhiên từ kinh nghiệm tôi ước tôi mới bắt đầu với OpenGL. Đề xuất của tôi là 'cắn đạn' và đi với OpenGL nếu bạn đang thực hiện trò chơi.

Để làm cho mọi việc trở nên dễ dàng hơn một chút để bắt đầu, tôi đã viết một số lớp tiện ích hữu ích làm tất cả OpenGL gritty gritty cho bạn. Chúng cho phép bạn thực hiện các lệnh gọi đơn giản .draw (..) tương tự như khi sử dụng Canvas. Các video hướng dẫn sau đây sẽ giúp bạn bắt đầu:

http://www.youtube.com/watch?v=xc93rN2CGNw

EDIT: 03/04/13

Dường như như các thiết bị Android mới và hệ điều hành đi ra Google đã tăng hiệu suất của Canvas . Người dùng lớp tiện ích tôi mô tả ở trên đã trả lời tôi bằng email sau đây sau khi thực hiện một số điểm chuẩn:

Vẽ 500 sprites ở vị trí ngẫu nhiên trên canvas mỗi khung.

Dưới đây là kết quả: Huawei Honor (Gingerbread, lõi đơn 1,4 Ghz): SpriteBatcher: 19-20 FPS, Canvas: 23-24 FPS

Nexus 7 (Jellybean, 4 lõi 1.3 Ghz): SpriteBatcher : 29-30 FPS, Canvas: 57-58 FPS

Bây giờ, trong trả lời của tôi đến thành viên này tôi đã giải thích rằng đây có thể là để làm với sự thiếu hiệu quả trong cách tôi đã viết các SpriteBatcher lớp tiện ích. Tuy nhiên từ kinh nghiệm của riêng tôi với Canvas trở lại trên một Desire HTC chạy Froyo 2.2 tôi có thể nói rằng nó chắc chắn là chậm hơn sprite cho sprite!

Trên các hệ điều hành và thiết bị sau này có thể đã vượt quá hiệu quả nhưng một số điểm trong phản hồi ban đầu của tôi vẫn hợp lệ. Ví dụ, nhận được xung quanh đánh một OutOfMemoryException mà không cần phải nghỉ mát để đệm kết cấu vào đĩa vv

Nếu tôi tìm hiểu thêm, tôi sẽ tiếp tục cập nhật câu trả lời này.

+0

Tôi muốn nhấn mạnh điểm đầu tiên, rằng các Bitmap được lưu trữ trên heap bằng cách tiếp cận Canvas. Điều này có thể rất hạn chế. Trừ khi trò chơi của bạn rất đơn giản (như Pong hoặc Breakout), với vài lần phun và không có hình động, bạn chắc chắn sẽ muốn có nhiều bộ nhớ hơn cho chúng. –

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