Cách nén khung hình trò chơi theo khung hình động đến mức tối thiểu trên đĩa


19

Tôi đang phát triển một trò chơi như Age of empire (các tòa nhà trên bản đồ) và với mỗi tòa nhà tôi có một tấm sprite cho hoạt hình của nó. Tôi đang sử dụng hoạt hình theo khung để tạo hiệu ứng cho tòa nhà (không biết về bất kỳ phương thức nào khác). Tôi nhận thấy rằng thư mục tài nguyên của tôi sẽ rất lớn do những hình ảnh tôi đang đặt trong đó.

Làm cách nào để các trò chơi như CoC và Age of Empires giữ kích thước apk của họ dưới 50 Mg? Tôi có thiếu điều gì ở đây khi phát triển trò chơi không

Cảm ơn bạn

EDIT: Thông tin thêm về vấn đề tôi đang gặp phải

Tôi có rất nhiều hình ảnh động vẽ đối tượng. Tôi đã chọn cách này vì nó là cách nhanh nhất và nó mang lại kết quả như tôi muốn. Về cơ bản mỗi tòa nhà là một hình ảnh động có thể vẽ được, trong đó tệp xml của nó đề cập đến 8 hình vẽ (8 hình ảnh = 8 tệp). Tất cả chúng đều là PNG do tính minh bạch. Vì tôi có hơn 200 hình ảnh, kích thước apk là 120 MB (Và tôi chưa hoàn thành việc sao chép một nửa số tệp). Đó là những gì kịp thời, phải có một cách để giải quyết nó. Xin hãy giúp đỡ một nhà phát triển đồng nghiệp


Nén hình ảnh hoặc tách nội dung trò chơi khỏi apk có thể là những gì bạn đang tìm kiếm.
János Turánszki

Bạn có nghĩa là tập tin mở rộng? Vấn đề là các tệp mở rộng không có các thư mục có thể vẽ mật độ khác nhau. Đây có phải là những gì trò chơi làm? Tôi đang làm khung hình theo khung hình động (hình ảnh tòa nhà đầy đủ). Hay tôi hoàn toàn đi sai đường
Rắn

Chỉ trong trường hợp, tôi đã cố gắng giúp đỡ và đưa ra câu trả lời liên quan đến việc tiết kiệm không gian cho hình ảnh của bạn. Tuy nhiên, câu hỏi của bạn rất khó hiểu: không rõ liệu bạn có thực sự muốn biết các kỹ thuật như liên quan đến "làm thế nào để các trò chơi như CoC và Age of Empires giữ kích thước apk của chúng dưới 50 Mg không?" hoặc nếu bạn chỉ muốn kiểm tra xem có ít cách hoạt hình nào trong không gian đĩa hay không (như tiêu đề của bạn gợi ý). Vui lòng làm rõ, để tôi có thể xóa câu trả lời của mình nếu đó là trường hợp và cũng để bạn có thể nhận được câu trả lời chính xác hơn.
MA

@ Tôi đã chỉnh sửa câu trả lời của mình để suy nghĩ thêm về vấn đề
Snake

2
Đối với Age of Empires, có lẽ đây là sự kết hợp của độ phân giải thấp (IIRC, nó được thiết kế cho 640x480) và hình ảnh được lập chỉ mục (không phải là RGB đầy đủ).
user253751

Câu trả lời:


24

Câu hỏi của bạn không rõ nếu bạn thực sự muốn biết các kỹ thuật cho phép trò chơi tiết kiệm dung lượng ổ đĩa ngay cả khi có một lượng lớn tệp hình ảnh / tài nguyên nặng (đó là những gì có trong phần thân của câu hỏi) hoặc nếu bạn chỉ muốn biết có ít cách thức hoạt hình đói không gian đĩa hơn cho các tòa nhà của bạn (đó là những gì được ngụ ý bởi tiêu đề câu hỏi của bạn).

Vì vậy, tôi sẽ đặt câu trả lời này ở đây để cố gắng giúp đỡ liên quan đến việc tiết kiệm không gian khi bạn có nhiều hình ảnh. Nếu bạn chỉ muốn biết về các kỹ thuật hoạt hình có thể cho phép bạn tiết kiệm dung lượng ổ đĩa, vui lòng cho tôi biết sau đó tôi có thể xóa câu trả lời.


Điều đó nói rằng, trong một tình huống tương tự, hai giải pháp tôi đã thấy (và được sử dụng một lần) về mặt tiết kiệm không gian trong đĩa là:

1) để ghép các hình ảnh riêng lẻ trong cùng một hình ảnh. Đôi khi nó có thể giúp đỡ. Vì vậy, thay vì lưu 4 tệp riêng biệt cho mỗi ô vuông có màu sau, tôi lưu tất cả chúng cạnh nhau trong cùng một hình ảnh (và sẽ chỉ phân tách chúng qua mã trò chơi):

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

Trong ví dụ này, lưu mỗi tệp trong 4 tệp PNG khác nhau lên tới 1255 byte, trong khi tệp duy nhất có tất cả được nối là 451 byte. Tất nhiên, nó có thể giúp được bao nhiêu tùy thuộc vào từng trường hợp cụ thể và bạn nên kiểm tra xem liệu điều đó có thể giúp ích cho bạn hay không tùy thuộc vào hình ảnh của bạn.

2) để nén thư mục tài nguyên. Điều này thường có thể rất hữu ích để tiết kiệm không gian đĩa. Sau đó, khi trò chơi đang chạy, bạn giải nén hoặc kéo hình ảnh mong muốn từ tệp nén - tùy thuộc vào định dạng nén bạn sử dụng. Xem câu trả lời trước đây đã trở thành wiki của trang web này: /gamedev//a/37649/72423

Nhưng cũng nên nhớ rằng mỗi loại nén có thể có lợi hơn hoặc ít hơn tùy thuộc vào loại tệp hình ảnh bạn sử dụng : Tránh nén tài nguyên gấp đôi

Để biết thêm chi tiết về nén: Trạng thái nghệ thuật trong nén ảnh?


Cuối cùng, bạn cũng có thể quan tâm đến việc nghĩ loại hình ảnh nào sẽ được sử dụng cho từng tình huống: Định dạng hình ảnh nào hiệu quả hơn về bộ nhớ: PNG, JPEG hoặc GIF?


Cảm ơn bạn đã thông tin. Thật kỳ lạ khi bạn có thể cắt kích thước tệp xuống một nửa bằng cách đặt mọi thứ vào một tệp. Tôi nghĩ vào cuối ngày, đó là cùng một số pixel và không gian được sử dụng. Tôi đã chỉnh sửa câu hỏi của mình để có câu trả lời tốt hơn
Snake

@Snake Vì vậy, mỗi lần chỉnh sửa bạn thực hiện, tôi nghĩ câu trả lời của tôi thực sự có thể hữu ích. Ghép hình ảnh + nén có thể làm giảm kích thước thư mục của bạn một lượng lớn. Cả hai kỹ thuật thường xuyên được sử dụng trong một số loại trò chơi. Về sự kết hợp, đó luôn là một mẹo đáng ngạc nhiên. Hãy tự mình thử: đặt các hình ảnh từ một chuỗi một hình ảnh động cạnh nhau và so sánh kích thước cuối cùng với tổng số hình ảnh riêng lẻ. Sau đó, bạn có thể xem nếu điều đó giúp trong trường hợp của bạn. Đối với nén, đối với các PNG, nó có xu hướng kém hiệu quả hơn, nhưng vẫn đáng nỗ lực để cắt giảm kích thước của thư mục cuối cùng của bạn
MA

@Snake một quan sát, mặc dù: nối đôi khi không có giá trị hoặc thậm chí tăng kích thước cuối cùng một chút. Nhưng đôi khi nó có thể cung cấp giảm mong muốn. Tất cả phụ thuộc vào hình ảnh của bạn
MA

Tôi nhớ đã thử cả hai kỹ thuật và mức giảm ít hơn 10%. Tôi chắc chắn biết nén không thành vấn đề với PNG nhưng tôi sẽ thử nối. Đó là lý do tại sao tôi hỏi làm thế nào các trò chơi khác làm điều đó bởi vì rõ ràng chúng có đồ họa nhiều hơn của tôi
Snake

Bạn không nên nén một thư mục chứa đầy hình ảnh. Các hình ảnh đã được nén và không nên có nhiều chuỗi lặp lại. Nếu họ làm như vậy, lớp nén thêm đó sẽ là một phần của codec hình ảnh ...
corsiKa

9

Tôi sẽ đề nghị bạn thử TexturePacker

  • bạn chỉ có thể kéo và thả tất cả hình ảnh của mình và đóng gói chúng
  • bạn có thể áp dụng nén khác nhau - ví dụ: sử dụng các PNG được lập chỉ mục tiêu tốn ít bộ nhớ hơn - giảm tới 70% so với tệp PNG tiêu chuẩn
  • bạn có thể tạo tệp dữ liệu tệp chứa tên + vị trí của từng tòa nhà của bạn
  • phiên bản miễn phí có thể đã đủ để tạo các tấm sprite cho bạn

Bạn có sử dụng khung phát triển trò chơi như AndEngine, Cocos2d-x hoặc LibGdx không? => Không

Bạn có cần tất cả các hình ảnh của bạn được tải cùng một lúc? Có vẻ như bạn sẽ gặp vấn đề lớn về RAM trên các thiết bị mục tiêu.


Cập nhật: Snake gửi cho tôi một số hình ảnh. Như đã hứa sẽ không công khai chúng ở đây vì vậy tôi đã tự mình tạo ra một số nghệ thuật để trình bày cách giảm mức sử dụng bộ nhớ.

Trong ảnh gốc, chỉ có một phần của ảnh được di chuyển. Tôi đã đặt một con chim lên một ngôi nhà để chứng minh điều này:

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

Về cơ bản đóng gói các hình ảnh động hoàn chỉnh vào một tờ là một sự lãng phí lớn của bộ nhớ. Bạn nên chia các phần tĩnh và di chuyển:

Tĩnh:

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

Hoạt hình01:

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

Hoạt hình02:

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

Giữ vị trí ban đầu của con chim trong hình ảnh . Đây là lý do tại sao có không gian trống ở trên. Bạn cần điều này để căn chỉnh hình ảnh động.

Bây giờ kéo hình ảnh trên TexturePacker và chọn các tham số sau

  • Định dạng dữ liệu: Hàm băm JSON (hoặc XML nếu bạn thích điều đó)
  • TrimMode: Trim (điều này tạo ra hình chữ nhật)
  • Định dạng pixel: INDEXED 8 bit - để tạo PNG 8 bit (bộ nhớ ít hơn khoảng 70%)
  • Cho phép Xoay: sai
  • Nhập tên tệp cho dữ liệu

TexturePacker đóng gói các hình ảnh

Kết quả là bây giờ bạn nhận được 2 tệp: Bảng sprite và tệp mô tả JSON.

"house_anim_01.png":
{
    "frame": {"x":351,"y":246,"w":110,"h":79},
    "rotated": false,
    "trimmed": true,
    "spriteSourceSize": {"x":67,"y":8,"w":110,"h":79},
    "sourceSize": {"w":400,"h":400},
    "pivot": {"x":0.5,"y":0.5}
},

Các phần quan trọng là framespriteSourceSize .

Các khung mang đến cho bạn vị trí của sprite gốc trong tờ ma.

spriteSourceSize cung cấp cho bạn phần bù để vẽ hình ảnh - các phần của hình ảnh bị bỏ qua vì cắt xén:

Một thói quen vẽ mã giả đơn giản trông như thế này:

drawImage(spritename, posX, posX)
{
    data    = sheetData[spritename]
    offsetX = data.spriteSourceSize.x
    offsetY = data.spriteSourceSize.y
    frameX  = data.frame.x
    frameY  = data.frame.y
    width   = data.frame.w
    height  = data.frame.h
    screen.draw(sheetImage, posX+offsetX, posY+offsetY, width, height)
}

Bạn có thể phải điều chỉnh tính toán bù trừ tùy thuộc vào điểm / điểm gốc trong hệ thống đồ họa của bạn. Các thường trình ở trên giả định một hệ tọa độ có nguồn gốc là trên cùng bên trái.

Sau đó, chỉ cần vẽ ngôi nhà trong 2 lượt:

draw("background", 100, 100);
draw("anim_01", 100, 100);

Bạn không cần phải quan tâm đến việc bù đắp - vì hình ảnh đã được căn chỉnh.


+1 cho việc quan sát về việc sử dụng RAM, điều mà những người khác đang bỏ qua
Dan Hulme

@Andreas tôi sẽ kiểm tra xem. Cảm ơn bạn. Đừng cười tôi nhưng tôi không sử dụng động cơ. Nó chủ yếu được thực hiện với hình ảnh động và drawables và nó hoạt động như một nét duyên dáng. Tôi không tải tất cả các hình ảnh trong bộ nhớ, nó sẽ không bị hỏng. Nó chỉ tải những hình ảnh cần thiết để hiển thị vào lúc này .. bạn có nghĩ đề xuất trên sẽ hoạt động với SDK Android tiêu chuẩn không?
Rắn

1
Nó sẽ được thôi. TexturePacker có 2 chế độ để cắt tỉa các họa tiết: Hình chữ nhật và đa giác. Nếu bạn sử dụng hình ảnh đẳng cự, bạn có thể nhận được lợi thế lớn từ các lưới đa giác về mặt đóng gói. Câu hỏi là nếu bạn có thể vẽ các hình tam giác có họa tiết - hoặc hình chữ nhật bằng mặt nạ. Nếu đây không phải là trường hợp bạn vẫn có thể sử dụng các hình chữ nhật. Bạn có thể gửi cho tôi một số hình ảnh của bạn nếu bạn muốn sử dụng dropbox và gửi liên kết tới -> hỗ trợ tại codeandweb. com. Tôi sẽ không chia sẻ chúng - chỉ quan tâm để xem những gì chúng ta có thể làm để cải thiện việc đóng gói.
Andreas Löw

@ AndreasLöw Tôi rất xin lỗi, tôi không nhận được thông báo về nhận xét của bạn. Tôi vừa thấy nó. Tôi sẽ rất đánh giá cao sự giúp đỡ. Tôi sẽ gửi cho bạn một cái gì đó và có lẽ bạn có thể làm sáng tỏ những gì tôi nên. ..kinda bị mắc kẹt với một cái gì đó tôi có kinh nghiệm nhỏ nhoi và có lẽ bạn có thể làm sáng tỏ. Tôi sẽ liên lạc với bạn sớm
Snake

7

Dưới đây là một vài con trỏ bạn có thể sử dụng

  1. Cố gắng đảm bảo tất cả hình nền và hình ảnh không trong suốt của bạn không ở định dạng PNG
  2. Cố gắng có tất cả các vòng lặp hoạt hình, tức là nếu hoạt hình là 1,2,3,4,5,6, hãy cố gắng làm cho nó giống như 1,2,3,4,3,2,1 trong đó các số này là số khung hình của hoạt hình, nó giúp rất nhiều
  3. nếu nhiều hình ảnh giống nhau và chỉ có màu khác nhau (nói chung là các nút UI, hoạt hình hạt, tiền xu trò chơi) thì hãy thử lấy một hình ảnh Trắng và thay đổi màu sắc của nó một cách linh hoạt
  4. Cố gắng tạo .apk của bạn chỉ với những hình ảnh cực kỳ quan trọng và sau đó tải mọi thứ từ máy chủ và giữ trong bộ nhớ điện thoại

Tôi hy vọng những gợi ý này giúp

PS Tôi chỉ đưa ra ý tưởng khái quát vì tôi không biết nội dung trò chơi chính xác của bạn và lời xin lỗi nếu những gợi ý này không hữu ích


Bạn cũng có thể: 1) nén tất cả hình ảnh của bạn 2) gạch sử dụng càng nhiều càng tốt 3) hình ảnh concatinate togetter thành một hình ảnh lớn hơn và sử dụng đó như là bản đồ uv cho texturing
Anthony Raimondo

Đó là những gợi ý tuyệt vời. Cảm ơn bạn. Tôi nghĩ rằng điểm quan trọng nhất là 4. Tuy nhiên nếu đó là trường hợp thì làm cách nào để đặt chúng vào các thư mục có thể vẽ khác nhau và tham chiếu chúng như R.drawable.image1? Đó là nơi tôi bối rối
Rắn

4

Rất nhiều trò chơi không giữ tài sản đồ họa của họ trong .apk; chúng chỉ bao gồm các "điều cơ bản" như đồ họa UI và mã trò chơi và tải xuống phần còn lại của tài sản sau khi trò chơi được cài đặt. Điều này đặc biệt đúng đối với các trò chơi sử dụng các tài nguyên đồ họa khác nhau tùy thuộc vào độ phân giải màn hình của bạn để giữ cho .apk không phải chứa cả tài sản độ phân giải thấp và độ phân giải cao.

Bạn nên xem xét cả hai tùy chọn tối ưu hóa được cung cấp bởi những người trả lời khác, cũng như cuối cùng bạn có phải phục vụ đồ họa của trò chơi của bạn tách biệt với chính .apk hay không.


Tôi không gặp vấn đề gì khi lấy đồ họa từ máy chủ (hoặc thậm chí các tệp mở rộng), nhưng làm cách nào để đặt chúng vào thư mục có thể vẽ được để tôi có thể tham chiếu chúng bằng R.drawable.x Vì hầu hết (nhiều) xml của tôi đều tham chiếu chúng bằng R .drawable
Rắn

AFAIK, bạn không thể. Một cách giải quyết khác là giữ một bảng băm tên tệp tài nguyên được liên kết với ID tài nguyên và sử dụng AssetManager để lấy các tệp dựa trên các ID đó, nhưng bạn có thể phải xử lý lại các tệp .xml của mình nếu bạn đi theo tuyến này.
Sandalfoot

4

Tôi đã đến trang web này để tìm kiếm một câu hỏi tương tự và thực sự có một vài tài nguyên tốt được chỉ ra cả trong câu trả lời cho câu hỏi của bạn và trong các câu hỏi khác.

Có lẽ bạn nên xem hoạt hình 2D: Các mô hình 3D hoạt hình hoặc các họa tiết có khung hoạt hình? cho một số tranh luận về các loại hình ảnh động khác nhau. Nó giúp tôi tối ưu hóa trò chơi của mình. Ngoài ra, bạn không cho chúng tôi biết API nào bạn đang sử dụng hoặc Công cụ nào bạn sử dụng. Điều đó một mình có thể tạo ra sự khác biệt: khung hình Android theo khung hình động PNG

Bên cạnh đó, hãy nhớ rằng nếu bạn sẽ đi theo con đường nén, có thể có những khác biệt quan trọng giữa cách bạn nén. Cụ thể, có khá nhiều sự khác biệt giữa các loại nén và có một số tranh luận chuyên biệt về tuyến đường thích hợp nhất cho thiết bị di động là gì. Đặc biệt nếu bạn tính đến việc di động, việc sử dụng RAM và lãng phí CPU để tải cũng là điều tối quan trọng. Xem: http://www.gamasutra.com


Cảm ơn Bennton, tôi thực sự mới về phát triển trò chơi. Tôi đã phát triển rất nhiều ứng dụng dựa trên công cụ / năng suất. Nhưng không có trò chơi. Vì vậy, tôi đang làm trò chơi đầu tiên của mình và tôi không sử dụng động cơ. Tôi đang sử dụng chỉ AnimationDrawables và mọi thứ đang hoạt động rất tốt. Nó chỉ là kích thước của apk đang nằm ngoài tầm tay
Snake

Bennton, liên kết cuối cùng được đề xuất bởi bạn là đặc biệt thú vị. Rất cám ơn đã chia sẻ điều đó! Hãy chắc chắn rằng bạn xem cái cuối cùng từ câu trả lời của tôi, điều này cũng liên quan đến vấn đề nén khác nhau đối với các loại tệp khác nhau. Trên thực tế, dường như có các loại nén hoạt động tốt hơn với các loại hình ảnh đã nén như PNG hoặc tốt hơn với các loại hình ảnh không nén. Thử nghiệm cho từng trường hợp luôn là cách tốt nhất để kiểm tra những gì hoạt động tốt nhất cho từng tình huống.
MA
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.