Tránh nén tài nguyên


13

Tôi đang sử dụng .pngs cho kết cấu của mình và đang sử dụng một hệ thống tệp ảo trong một .ziptệp cho dự án trò chơi của tôi. Điều này có nghĩa là kết cấu của tôi được nén và giải nén hai lần. Các giải pháp cho vấn đề nén kép này là gì? Một giải pháp tôi đã nghe nói là sử dụng .tgas cho kết cấu, nhưng có vẻ như đã lâu rồi, vì tôi đã nghe điều đó. Một giải pháp khác là thực hiện giải nén trên GPUvà vì nhanh, hãy quên đi chi phí hoạt động.


2
Liên quan: nếu bạn đã sử dụng jpeg, thì rất nhiều chương trình zip với định dạng riêng của họ có thể nén ngay cả những chương trình đó bằng 20%, vì vậy nó không hẳn là xấu. Điểm trong nén đôi mà bạn lo lắng nhất là gì? Có mất quá nhiều thời gian không? Rất nhiều định dạng thậm chí lưu trữ dữ liệu đã được nén chỉ bằng nguyên văn và không thực hiện bất kỳ giải nén nào trên chúng.
PlasmaHH

Câu trả lời:


17

Định dạng zip hỗ trợ một số thuật toán nén khác nhau. Bạn có thể sử dụng một thuật toán khác nhau cho mỗi tệp trong kho lưu trữ. Khi bạn muốn lưu trữ các tệp đã nén mà không được hưởng lợi từ nén bổ sung (như PNG) trong kho lưu trữ zip, bạn có thể mã hóa các tệp này bằng thuật toán "được lưu trữ" mà không nén được. Hộp thoại "Thêm vào lưu trữ" của 7-zip cho phép bạn chọn tùy chọn này trong phần "Cường độ nén".

Nhưng khi bạn không chỉ có hình ảnh mà còn các tài nguyên khác, có thể nén hơn trong kho lưu trữ của bạn, việc chọn thuật toán cho mỗi tệp sẽ có thể khá tẻ nhạt. Trong trường hợp đó, bạn có thể chọn một định dạng hình ảnh không nén trong kho lưu trữ nén.

Định dạng TGA biết rất nhiều chế độ khác nhau, trong đó một số chế độ được nén và một số thì không. Khi bạn không muốn sử dụng tính năng nén, hãy đảm bảo bạn chọn đúng trong tùy chọn xuất của trình chỉnh sửa đồ họa bạn đang sử dụng. Một định dạng hình ảnh không nén khác là BMP (Windows Bitmap).

Đây là một bài kiểm tra tôi đã thực hiện. Tôi đã thêm cùng một hình ảnh (một tài sản từ dự án hiện tại của tôi) ở các định dạng khác nhau nhiều lần vào kho lưu trữ zip, một số có thuật toán "khử" ở cường độ bình thường và một với "lưu trữ". Xin lỗi cho GUI của Đức. Cột thứ 2 là kích thước không nén, cột thứ 3 là thuật toán nén và cột thứ 4 là kích thước nén.

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, mã hóa khử nhiễu PNG chỉ tiết kiệm được 0,3% ít ỏi, trong khi BMP được mã hóa khử được giảm xuống còn một phần mười của tệp gốc thậm chí còn nhỏ hơn phiên bản PNG. Điều này khá làm tôi ngạc nhiên. Tôi đã dự kiến ​​PNG sẽ nhỏ hơn vì phương pháp nén của PNG nên được tối ưu hóa cho dữ liệu hình ảnh trong khi ZIP thì không. Một lời giải thích có khả năng là trình chỉnh sửa hình ảnh của tôi (GIMP) đã thêm khá nhiều thông tin meta vào các tệp PNG mà nó không làm cho BMP.

TGA không nén hoạt động tương tự như BMP về kích thước tệp trước và sau khi nén trong khi nén tệp TGA đã được ZIP cải thiện hơn nữa, mặc dù không nhiều như các phiên bản không nén.

Có thể đáng để thử nghiệm với các thuật toán khác ngoài độ lệch và với cài đặt cường độ nén khác. Sự kết hợp nào sẽ có kết quả tốt nhất có thể sẽ phụ thuộc vào phong cách họa tiết của bạn. Nhưng bạn cũng có thể xem xét để đánh giá mức tải tài sản của trò chơi của mình và có hiệu suất giải nén ảnh hưởng đến quyết định của bạn mà bạn sử dụng.

Dòng dưới cùng: Khi bạn muốn tránh nén hai lần trong khi vẫn có kích thước tệp thấp, hãy sử dụng PNGvới Storethuật toán zip hoặc BMPvới thuật toán nén nén.


5
Tôi đã làm điều đó trên một số hình ảnh của tôi và PNG (mức nén 9) đánh bại zip (mức độ nén cực cao) của hình ảnh BMP mọi lúc khoảng 20%. Vì vậy, nó sẽ là một hiệu ứng như thông tin meta.
Trilarion

3
png có một tùy chọn xen kẽ với khả năng nén giảm nhưng cho phép trích xuất hình ảnh độ phân giải thấp từ phần đầu tiên của tệp hình ảnh (như khi tải xuống qua kết nối băng thông thấp), tường của bạn có hoạt động không? bên cạnh đó png sử dụng deflate cho nén của nó đã.
ratchet freak

Có vẻ như bạn đã sử dụng máy nén png kém, cung cấp cho các tệp của bạn chạy qua PNGOUT và bạn sẽ nhận được kết quả sẽ không bị đánh bại bởi tệp bmp được nén.
aaaaaaaaaaaa

BMP hoặc TGA của bạn là 24 bit hay 32 bit? Đặc biệt với BMP, nhiều khả năng chúng là 24 bit và kích thước TGA không nén cho thấy đó cũng là 24 bit. Có lẽ bạn không so sánh like-với-like ở đây.
Maximus Minimus

@JimmyShelter Cả TGA và BMP đều là 32 bit với kênh alpha - Tôi chắc chắn.
Philipp

7

Đừng lo lắng về nó.

Khi thuật toán "khử" được sử dụng trong các tệp .zip gặp phải một khối dữ liệu đã được nén tốt, như dữ liệu pixel của hình ảnh .png, nó thấy rằng nó không thể nén nó một cách hiệu quả và nó sẽ lưu trữ dưới dạng chữ dữ liệu không nén. Điều này mất rất ít chi phí vào cuối giải nén để sao chép ra.

http://en.wikipedia.org/wiki/DEFLATE


3
Đôi khi nó đơn giản, một vấn đề nhận thức không nhất thiết là một vấn đề thực sự. Ngay cả khi thực sự có quá trình giải nén hai lần, thì việc giải nén không nén là một thao tác thực sự nhanh chóng, tôi đoán rằng chi phí sẽ chỉ có thể đo lường được.
aaaaaaaaaaaa

Sẽ nén cuối mất nhiều thời gian để nhận ra rằng tập tin là không nén?
dùng253751

Tương đối, có. Tôi không biết những gì máy nén .zip điển hình sử dụng để chọn mã hóa của một khối, nhưng nó có thể đơn giản như thử tất cả các mã hóa và giữ kết quả tốt nhất. Trong quá trình phát triển, nếu bạn phải có dữ liệu của mình trong .zip, có lẽ bạn sẽ muốn buộc mọi thứ phải sử dụng storethay vì deflateđể tiết kiệm thời gian, sau đó deflatemọi thứ để phát hành bản dựng.
Russell Borogove

2

Có vẻ như một số câu trả lời rất hay đã được đưa ra, nhưng tôi nghĩ tôi sẽ cung cấp thêm một câu:

What are the solutions to this double compression problem?

Giải pháp: Không làm gì cả.

Đặt vấn đề: Không có vấn đề nào được nêu - có bạn đang nén thông tin hai lần, nhưng tại sao bạn lại lo lắng về điều này? Là kích thước dữ liệu quá lớn? Là giải nén quá chậm? Đây có phải là nhiều hay ít quan trọng hơn hàng tá các tính năng bạn có thể thêm, tinh chỉnh, kiểm tra và / hoặc gỡ lỗi tại thời điểm này?


Làm một cái gì đó hai lần không cần thiết là một vấn đề trong chính nó. Ít nhất tôi đã cảm nhận được nó như vậy. Nhưng, tất nhiên, bạn cũng đúng với đề xuất của bạn. Cả bộ nhớ và tốc độ giải nén đều có thể là một vấn đề, mặc dù không phải trong trường hợp này, vì tôi không viết một trò chơi thương mại.
dùng1095108

Tôi là một nhà phát triển trò chơi chuyên nghiệp và tôi có thể đảm bảo với bạn trừ khi có vấn đề về hiệu suất thực sự được ghi lại bằng tài liệu, chúng tôi sẽ không lãng phí lần thứ hai về vấn đề này - phải mất rất nhiều mua hàng 0,99 đô la hoặc hiển thị quảng cáo để trả cho câu nói 8 hàng giờ để 'khắc phục' đúng vấn đề này. Làm điều gì đó hai lần không phải là một vấn đề, mặc dù nó có thể không hiệu quả. Mặc dù trong trường hợp này, bạn không làm điều tương tự hai lần - bạn đã có dữ liệu hình ảnh đang được lưu trữ dưới dạng PNG để nén và toàn bộ các tệp đang được lưu trữ cùng nhau.
NPSF3000

Đúng, nhưng một khi nó được thực hiện, nó đã được thực hiện cho nhiều dự án. Nếu bạn phản ánh về thuật toán DEFLATE - nó vẫn giữ nguyên từ những năm tám mươi. Bạn sẽ là một người già, nếu bạn đã lập trình sau đó, nhưng, nếu bạn biết thuật toán, bạn có thể, thực hiện nó trên GPU và tận hưởng tốc độ giải nén siêu nhanh qua nhiều dự án.
dùng1095108

Vì vậy, bạn dành, 2 tuần, một tháng để thực hiện Deflate trên GPU? Và sau đó, bạn nhận ra rằng bạn sắp triển khai trên nền tảng X hơn là Y và phá vỡ thuật toán của bạn thông qua Z. Nếu bạn muốn tạo trò chơi, TRỌNG TÂM TRÒ CHƠI TRÒ CHƠI, đừng lo lắng về những thứ không cần thiết như hiệu suất giảm phát.
NPSF3000

Một khi bạn biết một thuật toán (tái) thực hiện nó sẽ dễ dàng. Một snap, không phải 2 tuần hay một tháng. Đó là những gì tôi muốn nói. Nó đã có từ những năm tám mươi, đầu tư một chút thời gian vào nó có thể đáng giá.
dùng1095108

1

Nếu bạn sử dụng các định dạng chuyên dụng như PNG và OGG, bạn sẽ không cần nén ZIP.

PNG, OGG và các định dạng đã nén khác sẽ không nhỏ hơn nhiều bằng cách nén chúng lại dưới dạng ZIP. 100 MB PNG được nén vẫn là ~ 100 MB.

Tập lệnh, tập tin cấu hình và các định dạng dựa trên văn bản khác được hưởng lợi rất nhiều từ việc nén, tuy nhiên, thông thường chúng rất nhỏ so với chúng, chúng không lưu trữ nhiều dữ liệu đó. Nếu trò chơi của bạn là 100 MB, thì các tệp văn bản có thể tạo ra 1 MB cho toàn bộ trò chơi, ngay cả khi bạn có thể tạo chúng 100KB thông qua nén thì bạn chỉ giành được 900KB, dưới 1%, hầu như không đáng để bỏ công sức.

Bạn thậm chí có thể muốn sử dụng hệ thống tệp trực tiếp thay vì sử dụng hệ thống tệp ảo, dựa trên zip. Nó sẽ giúp việc vá rất dễ dàng: bạn có thể trao đổi bất kỳ tập tin nào bạn đã sửa đổi.


2
Đôi khi người ta không có lựa chọn, liên quan đến việc có nên sử dụng .ziptệp hay không. Ví dụ, trên nền tảng Android, tệp .apklà một .ziptệp có thể chứa tài nguyên.
dùng1095108

3
Thêm vào đó, có những lợi thế nhất định khi sử dụng kho lưu trữ và các tệp ZIP cung cấp cả cấu trúc nén và cấu trúc lưu trữ.
MrCranky

Có tôi biết, tôi chỉ nói rằng sử dụng hệ thống tệp gốc cũng có lợi thế. Tôi là một chút của một người ủng hộ "Giữ cho nó đơn giản".
API-Beast
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.