2010-10-14 37 views
87

Tôi có một ứng dụng sẽ hiển thị một loạt hình ảnh trong trình chiếu. Những hình ảnh đó sẽ là một phần của gói, do đó được phân phối với ứng dụng.Khi nào sử dụng PNG hoặc JPG trong phát triển iPhone?

Tất cả những hình ảnh hình ảnh hoặc chụp ảnh vv

Tôi đã đọc rằng nó ưa thích để sử dụng PNG là định dạng hình ảnh, nhưng nhìn thấy rằng phiên bản JPG sẽ nhỏ hơn nhiều, tôi thà được sử dụng cái đó.

Có nguyên tắc nào định dạng để sử dụng và trong trường hợp nào không?

+0

Tôi muốn thêm rằng hình ảnh ban đầu đều ở định dạng JPG nếu đã có sự khác biệt. – Maverick

Trả lời

128

PNG là điểm ảnh hoàn hảo (không bị mất) và cần thêm rất ít năng lượng CPU để hiển thị. Tuy nhiên, PNG lớn có thể mất nhiều thời gian hơn để đọc từ bộ nhớ hơn so với các định dạng hình ảnh được nén và do đó sẽ chậm hơn để hiển thị.

JPG nhỏ hơn để lưu trữ, nhưng bị mất (số tiền phụ thuộc vào mức nén) và hiển thị chúng yêu cầu thuật toán giải mã phức tạp hơn nhiều. Nhưng chất lượng hình ảnh và nén điển hình thường khá đủ cho ảnh.

Sử dụng JPG cho các bức ảnh và cho bất cứ điều gì lớn, và PNG cho bất cứ điều gì nhỏ và/hoặc thiết kế để hiển thị "điểm ảnh hoàn hảo" (ví dụ như các biểu tượng nhỏ) hoặc là một phần của một lớp phủ trong suốt ghép vv

+48

+1. Ngoài ra, PNG hỗ trợ tính minh bạch, mà JPEG không. – Cameron

+1

Tôi chưa thấy bất kỳ dữ liệu nào về hiệu suất giải mã JPEG vs PNG và iPNG. Đôi khi định dạng nén nhiều hơn là tốt hơn do giảm yêu cầu I/O; Tôi không biết ổ đĩa flash của iPhone có tốc độ nhanh như thế nào. Và tôi * chắc chắn * sẽ không nói giải nén PNG đòi hỏi năng lượng "rất ít"; tệp Other.artwork dường như là dữ liệu bitmap thô, có lẽ vì chi phí CPU/bộ nhớ của giải nén PNG là quá nhiều đối với các thành phần giao diện người dùng thường được sử dụng. –

+2

Trong dự án hiện tại của tôi, chúng tôi có các tệp png rất lớn vì yêu cầu minh bạch. IO đĩa lớn hơn rất nhiều so với thời gian dành giải mã một jpeg. Hãy nhớ rằng PNG cũng được nén, chỉ cần sử dụng một thuật toán khác. – John

1

Tôi nghĩ nếu bạn muốn sử dụng trong suốt, bạn không có lựa chọn nào ngoại trừ PNG. Tuy nhiên, nếu nền của bạn mờ đục thì bạn có thể sử dụng JPG. Đó là sự khác biệt duy nhất tôi có thể thấy

+3

Điều này không giải quyết bất kỳ cân nhắc hiệu suất nào của JPG so với PNG. – daveMac

19

Apple tối ưu hóa hình ảnh PNG được bao gồm trong gói ứng dụng iPhone của bạn. Trong thực tế, iPhone sử dụng một mã hóa đặc biệt trong đó các byte màu được tối ưu hóa cho phần cứng. XCode xử lý mã hóa đặc biệt này cho bạn khi bạn xây dựng dự án của mình. Vì vậy, bạn sẽ thấy những lợi ích bổ sung khi sử dụng PNG trên iPhone khác với kích thước của chúng. Vì lý do này, bạn nên sử dụng PNG cho bất kỳ hình ảnh nào xuất hiện như một phần của giao diện (trong giao diện bảng, nhãn, v.v.).

Để hiển thị hình ảnh toàn màn hình như ảnh, bạn vẫn có thể gặt hái lợi ích với PNG vì chúng không bị mất và chất lượng hình ảnh phải tốt hơn JPG không đề cập đến việc sử dụng tài nguyên bằng cách giải mã hình ảnh. Bạn có thể cần giảm chất lượng của JPG để thấy lợi ích thực sự về kích thước tệp nhưng sau đó bạn hiển thị hình ảnh không tối ưu.

Kích thước tệp chắc chắn là một yếu tố nhưng cũng có những cân nhắc khác khi chơi cũng như khi chọn định dạng hình ảnh.

+5

[Trong tiêu chuẩn của tôi] (http://imageoptim.com/tweetbot.html) Tối ưu hóa Xcode thực sự làm cho các tệp chậm hơn, có khả năng vì đĩa I/O, không phải CPU là nút cổ chai. – Kornel

+1

"Apple tối ưu hóa hình ảnh PNG được bao gồm trong gói ứng dụng iPhone của bạn" - Điều này có nghĩa là PNG tải xuống động không được tối ưu hóa? – Robert

+1

Không, PNG được tải xuống động không được tối ưu hóa. Việc tối ưu hóa về cơ bản chỉ là trao đổi thứ tự byte từ RGBA thành BGRA, đó là những gì mà chip đồ họa của iPhone sử dụng trong nội bộ. Thông tin thêm tại đây: http://graphicsoptimization.com/blog/?p=259 –

7

Chỉ cần nghĩ rằng tôi muốn chia sẻ một chút dữ liệu hiệu suất nén ...

tôi đang làm một số mẫu của một người xem 360 độ - một băng chuyền nơi người dùng có thể quay thông qua một loạt các bức ảnh chụp từ khác nhau các góc, để tạo ấn tượng về việc xoay vòng một đối tượng một cách trơn tru.

Tôi đã tải dữ liệu hình ảnh vào một mảng của NSData để lấy tệp i/o ra khỏi phương trình, nhưng tạo NSImage khi đang di chuyển. Thử nghiệm ở tốc độ khung hình tối đa gần (~ 25 khung hình/giây) và xem trong Ứng dụng tôi thấy ứng dụng rõ ràng là CPU bị ràng buộc và có khoảng 10% tải CPU hiển thị ~ 275 kb png so với ~ 75 kb jpg.

Tôi không thể nói chắc chắn nhưng tôi đoán là giới hạn CPU chỉ là từ việc thực hiện chương trình chung và di chuyển tất cả dữ liệu trong bộ nhớ, nhưng việc giải nén hình ảnh đó được thực hiện trên GPU. Dù bằng cách nào và JPG so vớiĐối số hiệu suất PNG có vẻ ưu tiên JPG, đặc biệt là khi kích thước tệp nhỏ hơn (và do đó kích thước của các đối tượng trong bộ nhớ ít nhất trong một số phần của chuỗi) được xem xét.

Tất nhiên mọi tình huống là khác nhau, không có sự thay thế để thử nghiệm ...

+2

GPU không thể giải nén PNG. Định dạng deflate nó sử dụng không phù hợp với loại GPU song song cho phép. Tôi đoán rằng việc giải mã JPG có thể được tăng tốc một phần GPU, vì có sự chuyển đổi không gian màu. – Kornel

5

tôi đã tìm thấy sự khác biệt lớn trong hiệu suất hoạt hình khi sử dụng JPEG vs png. Ví dụ, đặt ba jpeg có kích thước màn hình cạnh nhau trong một UIScrollView và cuộn theo chiều ngang trên một kết quả iPhone4 trong lag và một hình ảnh động giật giật khó chịu. Với các png không trong suốt có cùng kích thước, cuộn sẽ mượt mà. Tôi không bao giờ sử dụng jpegs, ngay cả khi hình ảnh lớn.

8

Cocoanetics blog published a nice iOS performance benchmark của JPG ở các mức chất lượng khác nhau và PNG, có và không cần nghiền.

Từ kết luận của mình:

Nếu bạn hoàn toàn cần một kênh alpha hoặc phải đi với PNG sau đó nó là khuyến khích để cài đặt các công cụ pngcrush trên máy chủ web của bạn và có nó xử lý tất cả PNG của bạn. Trong hầu hết các trường hợp khác, chất lượng cao Các tệp JPEG kết hợp các kích thước tệp nhỏ hơn (tức là truyền nhanh hơn) với việc nén và hiển thị nhanh hơn .

Nó chỉ ra rằng PNGs là tuyệt vời cho hình ảnh nhỏ mà bạn sẽ sử dụng cho các yếu tố giao diện người dùng, nhưng chúng không hợp lý để sử dụng cho bất kỳ ứng dụng màn hình đầy đủ như danh mục hoặc tạp chí. Ở đó bạn sẽ muốn để chọn chất lượng nén từ 60 đến 80% tùy thuộc vào tài liệu nguồn của bạn.

Xét về việc hiển thị tất cả để hiển thị, bạn sẽ muốn treo lên Trường hợp UIImage mà từ đó bạn đã vẽ một lần vì những phiên bản này có phiên bản không nén của được lưu trữ trong đó. Và khi bạn không tạm dừng hình ảnh để một hình ảnh lớn xuất hiện trên màn hình, bạn sẽ có để buộc giải nén cho một vài hình ảnh trước. Tuy nhiên, hãy lưu ý rằng những điều này sẽ mất một lượng RAM lớn và nếu bạn đang sử dụng số , điều đó có thể khiến ứng dụng của bạn bị chấm dứt. NSCache là nơi tuyệt vời để đặt các hình ảnh được sử dụng thường xuyên vì điều này tự động xử lý việc xóa hình ảnh khi RAM trở nên khan hiếm.

Thật không may là chúng tôi không có bất kỳ cách nào để biết liệu hình ảnh vẫn cần giải nén hay không. Ngoài ra, hình ảnh có thể có đã xóa phiên bản chưa nén mà không thông báo cho chúng tôi về hiệu ứng này. Đó có thể là một Radar tốt để tăng tại trang báo cáo lỗi của Apple . Nhưng may mắn khi truy cập hình ảnh như được hiển thị ở trên không mất thời gian nếu hình ảnh đã được giải nén. Vì vậy, bạn chỉ có thể làm điều đó không chỉ chỉ "đúng lúc" mà còn "chỉ trong trường hợp".

+0

Chính xác, và JPEGMini và ImageOptim làm cho jpegs thực sự nhỏ! –

11

Có một điều quan trọng cần suy nghĩ về với PNG. Nếu một PNG được bao gồm trong Xcode của bạn, nó sẽ được tối ưu hóa cho iOS. Điều này được gọi là PNG nghiền nát. Nếu PNG của bạn được tải xuống vào thời gian chạy nó sẽ không bị nghiền nát. PNG bị hỏng chạy tương tự như JPG 100%. JPG chất lượng thấp hơn chạy tốt hơn các JPG chất lượng cao hơn. Vì vậy, từ một quan điểm hiệu suất từ ​​nhanh nhất đến chậm nhất nó sẽ đi JPG chất lượng thấp, chất lượng cao JPG, PNG nghiền nát, PNG.

Nếu bạn cần tải xuống PNG, bạn nên xem xét nghiền PNGs trên máy chủ trước khi tải xuống.

http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/

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