2012-04-12 20 views
8

Tôi đang phát triển trò chơi iP * và tôi sử dụng cả UIKit và OpenGL ES 2.0. Các phần tử UIKit được hiển thị trên khung nhìn OpenGL và chiếm một không gian màn hình đáng kể (tùy ý). Tôi phải thừa nhận rằng Apple đã thực hiện một công việc tuyệt vời và tốc độ khung hình của trò chơi luôn là 60 FPS.Kết hợp các khối hoạt ảnh UIView và hiển thị OpenGL ES

Để đi đến kết luận này tôi đã thực hiện nhiều xét nghiệm liên quan đến việc thực hiện:

  1. tôi đã thêm rất nhiều tĩnh (không di chuyển) UIViews trên quan điểm OpenGL - OK!
  2. Tôi hoạt ảnh bằng mã tùy chỉnh cùng UIViews (đã sửa đổi thuộc tính trung tâm trong phương thức drawFrame của trò chơi của tôi) - OK !.
  3. Tôi đã thêm nhiều phần tử OpenGL ES trong UIViews - OK!
  4. Tôi đã thêm nhiều phần tử OpenGL ES đang di chuyển trong UIViews - OK!

Vì vậy, bây giờ tôi muốn sử dụng Khung hoạt ảnh chính để tạo hoạt ảnh cho các phần tử UIKit. Tôi sử dụng số điện thoại

[UIView animateWithDuration:delay:options:animations:completion:] 

để thực hiện hoạt ảnh (tôi nhắm mục tiêu iOS 4 trở lên).

Vấn đề bây giờ là tỷ lệ khung hình có hành vi lạ này: Đôi khi tôi nhận được 60 fps với nhiều nhiều yếu tố UIKit hiệu ứng động (30 nguyên tố là OK cho tôi) và một số lần khác tỷ lệ khung hình là rõ ràng dưới 60 fps ngay cả với đơn làm hoạt hình phần tử UIKit nhưng tôi không thể đo lường nó bằng Dụng cụ! Hãy để tôi giải thích thêm: Khi tôi mở Công cụ và theo dõi hoạt ảnh lõi và/hoặc trình điều khiển OpenGL, tôi luôn nhận được 60 khung hình/giây. Nhưng rõ ràng là đây không phải là trường hợp, tôi có thể nhìn thấy bằng mắt các hoạt ảnh OpenGL để di chuyển chậm hơn nhiều so với hoạt ảnh UIKit tương ứng ở trên cùng. Nếu tôi loại bỏ các phần tử UIKit khỏi khung nhìn thì tốc độ khung hình sẽ trở lại bình thường. Một tình huống tương tự với một trong những tôi mô tả ở đây xảy ra trong bất kỳ trò chơi OpenGL ES khi người dùng thay đổi âm lượng của thiết bị trong khi chơi trò chơi. Khi xem trong suốt cho thấy khối lượng hiện tại bắt đầu mờ dần và cho đến khi nó hoàn toàn mất dần tốc độ khung hình giảm mạnh, nhưng trong các công cụ (tôi đã thực hiện kiểm tra này quá) nó bị mắc kẹt trên 60 khung hình/giây!

Vì vậy, để tổng hợp: đôi khi tôi nhận được 60 fps thực với hoạt ảnh khối không có thăng trầm khi chạy và một số lần khác tôi nhận được giả 60 khung hình/giây không có thăng trầm.

Bạn có giải pháp nào cho vấn đề này không? Tất cả các thử nghiệm được thực hiện trên iPad 2 và iPhone 3GS với iOS 5.1

Trả lời

9

Tôi đã giải quyết được vấn đề này và bây giờ tôi có thể kết hợp hoạt ảnh dựa trên khối/lõi UIView trong trò chơi OpenGL của mình mà không bị giảm hiệu suất.

Giải pháp là khá đơn giản:

  1. Đối với mỗi UIView mà bạn muốn trong ứng dụng OpenGL của bạn, hãy giữ giới hạn, trung tâm của nó và biến đổi thuộc tính màn hình OpenGL của bạn hệ tọa độ (ví dụ như tạo ra các thuộc tính sau: GLBounds, GLCenter, GLTranform) và cập nhật chúng cho phù hợp bất cứ khi nào bạn thay đổi một trong các thuộc tính UIView tương ứng.
  2. Khi bạn bắt đầu trò chơi, hãy tải UIViews nhưng đặt chúng thành ẩn.Vì vậy, UIKit không vẽ ở phía trên chế độ xem OpenGL (theo cách này, vấn đề thả khung là hoàn toàn được tách ra) .In vẽ bản thân UIViews bằng thuộc tính GL * bạn đã tạo ở bước 1 và sử dụng các họa tiết tương ứng (hình ảnh/màu bạn đã sử dụng cho mọi UIView).
  3. Animate ẩn Thuộc tính UIViews (giới hạn, trung tâm và biến đổi) sử dụng hoạt ảnh khối/lõi tùy thuộc vào hoạt ảnh bạn muốn đạt được (lần lượt cập nhật thuộc tính GL *) và phương pháp vẽ OpenGL của bạn sử dụng GL * các thuộc tính để vẽ UIViews! Để có được các giá trị thực sự cho giới hạn, trung tâm và biến đổi khi một UIView là hoạt hình (và cập nhật các thuộc tính GL *) sử dụng thuộc tính presentationLayer của nó.

Tốt nhất,