2011-11-07 25 views
9

Tôi có trò chơi OpenGL có kết cấu nặng mà tôi muốn điều chỉnh dựa trên lượng RAM thiết bị có. Các kết cấu có độ phân giải cao nhất tôi đã hoạt động tốt trên iPhone 4 hoặc iPad2, nhưng các thiết bị trước đó bị hỏng ở giữa tải họa tiết. Tôi có phiên bản có độ phân giải thấp của các họa tiết này, nhưng tôi cần phải biết khi nào nên sử dụng chúng. Chiến lược hiện tại của tôi là phát hiện các thiết bị cũ cụ thể hơn (3GS có màn hình có độ phân giải thấp; iPad không có máy ảnh), sau đó chỉ tải cấu hình độ phân giải cao cho IPad2 trở lên và iPhone 4 trở lên - và tôi giả sử tôi sẽ cần phải làm một cái gì đó cho iPod touch. Nhưng tôi muốn sử dụng tính năng phát hiện nhiều hơn các mô hình thiết bị mã hóa cứng, vì việc phát hiện mô hình rất mỏng manh so với các thay đổi trong tương lai đối với các API và phần cứng.Trả lời tính khả dụng của RAM trong iOS

Một khả năng khác mà tôi đang xem xét là tải cấu trúc có độ phân giải cao trước, sau đó thả và thay thế chúng bằng lo-res vào thời điểm tôi nhận được cảnh báo bộ nhớ thấp. Tuy nhiên, tôi không chắc mình sẽ có cơ hội phản ứng; Tôi đã nhận thấy rằng ứng dụng thường chết trước khi bất kỳ thông báo nào xuất hiện trên bảng điều khiển gỡ lỗi.

Làm cách nào để phát hiện xem thiết bị tôi đang chạy có RAM không đủ để tải phiên bản có độ phân giải cao của họa tiết của tôi không?

Quay lại một bước, có một số kỹ thuật thích ứng khác mà tôi có thể sử dụng cụ thể cho bộ nhớ kết cấu OpenGL không?

Ghi chú:

  1. tôi đã tìm kiếm và tắt SO cho câu trả lời liên quan đến phát hiện RAM có sẵn, nhưng tất cả đều về cơ bản tư vấn cho profiling sử dụng bộ nhớ và loại bỏ chất thải (giảm thiểu thời gian tồn tại của temporaries, và tất cả những gì guff). Tôi đã làm nhiều như tôi có thể, và không có cách nào tôi sẽ siết chặt các cấu trúc hi res vào các thiết bị cũ.

  2. PVRTC không phải là một tùy chọn. Các họa tiết có chứa dữ liệu được sử dụng bởi các trình đổ bóng phân mảnh và phải được lưu trữ theo định dạng không mất dữ liệu.

+0

Lưu ý rằng bạn có thể có được cả hai tổng ram và số liệu thống kê ram miễn phí như chi tiết trong chủ đề này [bộ nhớ miễn phí trên iOS] (http://stackoverflow.com/questions/5012886). Ngoài ra, tôi đã thử nghiệm mã trên iPhone 4 của tôi và nó hoạt động tốt! –

Trả lời

11

Để nhận được tổng số (tối đa) RAM vật lý của thiết bị sử dụng [NSProcessInfo processInfo].physicalMemory.

Xem Documentation.

0

Theo như tôi biết 3 điều quan trọng nhất người ta có thể làm là -

  1. thực hiện - (void)didReceiveMemoryWarning và trả lời khi iOS gửi cảnh báo 1 & 2.
  2. hồ sơ mã trong Instruments cố gắng tìm rò rỉ & tốt hơn các cách tối ưu để thực hiện.
  3. Phát hiện loại thiết bị & có thể sử dụng thông tin đó.
  4. Sử dụng một số dạng nén kết cấu như PVRTC để tiết kiệm dung lượng.

Tôi nghĩ bạn đang làm hầu hết trong số họ. Có một điều thậm chí không biết chính xác có bao nhiêu thiết bị iOS RAM có. Apple không công bố thông số kỹ thuật cho thiết bị iOS.

Ngoài ra, không thể giả định rằng chỉ sau khi nói 100mb mức tiêu thụ, bạn sẽ nhận được cảnh báo mem. Các cảnh báo mà iOS cung cấp thay đổi tùy thuộc vào trạng thái hiện tại của thiết bị & những ứng dụng khác đang chạy & số lượng bộ nhớ mà chúng đang tiêu thụ. Vì vậy, nó được khôn lanh.

Tôi có thể đề nghị 2 phải đọc phần - Best Practices for Working with Texture DataTuning Your OpenGL ES Application

2

Điều quan trọng nhất nghĩ rằng bạn cần biết để quản lý bộ nhớ trong trường hợp này là thời tiết để sử dụng độ phân giải cao hay thấp kết cấu. Cách đơn giản nhất tôi sử dụng là kiểm tra điều này

CGFloat scale = [[UIScreen mainScreen] scale]; 
if ((scale > 1.0) || (self.view.frame.size.width > 320)) { 
     highRes = TRUE; 
} 

Điều này hoạt động cho tất cả các thiết bị cho đến nay và phải là bằng chứng trong tương lai, thiết bị mới sẽ sử dụng độ phân giải cao. Bạn cũng có thể tính toán ngay tại đó tỉ lệ khung hình (giúp sau này ipad vs iphone)

aspect = self.view.frame.size.width/self.view.frame.size.width 

Không tải highres đầu tiên nó giết thời gian ứng dụng tải của bạn, trên 3G của tôi hầu hết khởi động của tôi là dành tải (thậm chí các kết cấu có độ phân giải thấp), chỉ cần kiểm tra ngay từ đầu và không chạm vào các công cụ tô điểm.

Trên các thiết bị cũ, chương trình sẽ chết mà không có cảnh báo do kết cấu lớn, có thể có liên quan đến trình gỡ rối không thể bẫy tiêu thụ bộ nhớ video và tự chết.

Để tối ưu hóa tốt hơn, hãy cân nhắc tô màu cho bạn để kiểm tra kích thước họa tiết thấp nhất đang được sử dụng (chỉ khi bạn sử dụng đối tượng 3D).

Quên vấn đề kích thước RAM video, bộ nhớ thực sự được chia sẻ, vì vậy bạn đang cạnh tranh cho bộ nhớ hệ thống, trên các thiết bị cũ hơn bạn có giới hạn MB để sử dụng, nhưng đó vẫn là bộ nhớ hệ thống.

Về quản lý bộ nhớ, có nhiều cách để thực hiện, đơn giản nhất nên đánh dấu các kết cấu được tải và họa tiết cần thiết, khi cảnh báo bộ nhớ xuất hiện, đổ kết cấu được tải nhưng không cần thiết.

+0

Cảm ơn bạn đã phản hồi chi tiết. Tôi không thể chấp nhận điều này, bởi vì nó không trả lời câu hỏi cốt lõi về cách phát hiện RAM thay vì sử dụng tính năng phát hiện (Hoặc bạn ngụ ý rằng điều đó là không thể hoặc không đáng để theo đuổi?), Nhưng +1 để chỉ ra 'scale> 1.0' để phát hiện iPhone 4. Tôi đã không nghĩ về điều đó. –

+0

Cách duy nhất bạn có thể thử và phát hiện bộ nhớ mà không cần bẻ khóa là cố gắng lấp đầy tất cả và đo lường số tiền bạn có. Cũng kể từ khi bộ nhớ được chia sẻ với tất cả các ứng dụng khác mà có thể chạy (sytems những người thân, như thư, vv) thậm chí biết số lượng bộ nhớ vật lý không có giá trị nhiều. Đó là lý do tại sao tôi nói để quên con đường đó, nó không phải là nền tảng vững chắc mà bạn đang tìm kiếm. – led42

+0

Từ ngữ của bạn không rõ ràng về việc liệu tôi có nên không nghĩ đến bộ nhớ video riêng biệt hay không hay bỏ qua việc đo RAM. Tôi không quan tâm đến các ứng dụng đang chạy khác; theo kinh nghiệm, các thiết bị có 256 MB luôn bị lỗi, trong khi những thiết bị có 512 MB không bao giờ làm. Ngoài ra, thử nghiệm được đề xuất của bạn không thành công với iPod Touch mới nhất - võng mạc & 256 MB - nhấn mạnh nỗi sợ của tôi về sự mong manh của việc phát hiện mô hình. Ngẫu nhiên, việc tìm kiếm giải pháp cho sự cố iPod Touch đã dẫn tôi đến một câu trả lời có thể, mà tôi sẽ đăng bài riêng biệt. –

7

Tổng số RAM vật lý có sẵn qua sysctl(), như được ghi trong this blog post và được thực hiện như một API sạch đẹp here (xem triển khai totalMemory trong tệp .m tương ứng).

tôi đã dỡ bỏ mã của blog cho tiện lợi và hậu thế:

#include <sys/sysctl.h> 

size_t phys_mem() 
{ 
int mib[] = { CTL_HW, HW_PHYSMEM }; 
size_t mem; 
size_t len = sizeof(mem); 
sysctl(mib, 2, &mem, &len, NULL, 0); 
return mem; 
} 

Tôi không biết nếu Apple sẽ chấp nhận một ứng dụng mà sử dụng sysctl() theo cách này. Tài liệu được ghi lại nhưng chỉ dành cho Mac OS X.

+1

Bạn đã bao giờ cập nhật điều này trong ứng dụng App Store chưa? – Nate

+2

@Nate: Có. [Your World] (http://itunes.apple.com/us/app/your-world/id412566625?mt=8) tải một trái đất 96 megapixel trên các thiết bị có hơn 384 MB; nếu không, nó sẽ quay trở lại phiên bản 24 megapixel. Không có gì đặc biệt về con số; nó chỉ là một nửa giữa các thiết bị có thể, và những người không thể. –

+2

Chỉ cần sử dụng [NSProcessInfo processInfo] .physicalMemory – Steve

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