Cara mengompresi animasi bingkai demi bingkai hingga minimum pada disk

19

Saya mengembangkan game seperti Age of empire (bangunan di peta) dan untuk setiap bangunan saya memiliki sprite sheet untuk animasinya. Saya menggunakan animasi frame by frame untuk menghidupkan bangunan (tidak mengetahui adanya metode lain). Saya memperhatikan bahwa folder sumber daya saya menjadi sangat besar karena gambar yang saya masukkan ke dalamnya.

Bagaimana game seperti CoC dan Age of Empires menjaga ukuran apk mereka di bawah 50 Mg? Apakah saya kehilangan sesuatu di sini dalam hal pengembangan game

Terima kasih

Sunting: Info lebih lanjut untuk masalah yang saya hadapi

Saya punya BANYAK animasi objek yang dapat digambar. Saya memilih cara ini karena itu yang tercepat dan menghasilkan hasil yang saya inginkan. Pada dasarnya setiap bangunan adalah gambar animasi yang mana file xmlnya mengacu pada 8 gambar (8 gambar = 8 file). Semuanya PNG karena transparansi. Karena saya memiliki lebih dari 200 gambar, ukuran apk adalah 120 MB (Dan saya belum selesai menyalin setengah dari file). Itulah yang cepat, harus ada cara untuk menyelesaikannya. Tolong bantu sesama pengembang

Ular
sumber
Mengompresi gambar atau memisahkan konten game dari apk mungkin sesuai dengan yang Anda cari.
János Turánszki
Maksud Anda file ekspansi? Masalah bahwa file ekspansi tidak memiliki folder yang dapat ditarik kepadatan yang berbeda. Apakah ini yang dilakukan game? Saya melakukan animasi bingkai demi bingkai (gambar gedung penuh). Atau apakah saya benar-benar di jalan yang salah
Snake
Untuk berjaga-jaga, saya mencoba untuk membantu dan memberikan jawaban terkait dengan menghemat ruang untuk gambar Anda. Namun, pertanyaan Anda membingungkan: tidak jelas apakah Anda ingin benar-benar mengetahui teknik seperti yang terkait dengan "bagaimana game seperti CoC dan Age of Empires menjaga ukuran apk mereka di bawah 50 Mg?" atau jika Anda ingin memeriksa apakah ada cara menjiwai ruang disk yang kurang lapar (seperti yang disarankan judul Anda). Tolong jelaskan, jadi saya bisa menghapus jawaban saya jika itu masalahnya dan juga agar Anda bisa mendapatkan jawaban yang lebih akurat.
Juli
@Dan saya mengedit jawaban saya untuk merenungkan masalah lebih lanjut
Snake
2
Untuk Age of Empires, itu mungkin kombinasi dari resolusi rendah (IIRC dirancang untuk 640x480) dan gambar yang diindeks (bukan RGB penuh).
user253751

Jawaban:

24

Tidak jelas dengan pertanyaan Anda jika Anda benar-benar ingin tahu teknik yang memungkinkan game menghemat ruang disk bahkan ketika memiliki file gambar / sumber daya berat dalam jumlah besar (itulah yang ada di tubuh pertanyaan), atau jika Anda hanya ingin tahu apakah ada lebih sedikit ruang disk yang lapar untuk melakukan animasi untuk bangunan Anda (itulah yang tersirat pada judul pertanyaan Anda).

Jadi, saya akan meletakkan jawaban ini di sini mencoba membantu dalam hal menghemat ruang saat Anda memiliki banyak gambar. Jika Anda hanya tertarik untuk mengetahui tentang teknik animasi yang memungkinkan Anda menghemat ruang disk, beri tahu saya maka saya mungkin menghapus jawabannya.


Yang mengatakan, dalam situasi yang sama, dua solusi yang saya lihat (dan digunakan sekali) dalam hal menghemat ruang di disk, adalah:

1) untuk menggabungkan masing-masing gambar dalam satu gambar yang sama. Terkadang ini bisa membantu. Jadi alih-alih menyimpan 4 file terpisah untuk masing-masing kotak berwarna berikut, saya menyimpan semuanya berdampingan dalam gambar yang sama (dan hanya akan membaginya melalui kode permainan):

masukkan deskripsi gambar di sini

Dalam contoh ini, menyimpan masing-masing dalam 4 file PNG yang berbeda berjumlah 1255 byte, sedangkan file tunggal dengan semua digabungkan adalah 451 byte. Tentu saja, seberapa banyak itu dapat membantu tergantung pada kasus per kasus dan Anda harus menguji untuk melihat apakah itu dapat membantu Anda tergantung pada gambar Anda.

2) untuk mengompresi folder sumber daya. Ini sering kali bisa sangat membantu untuk menghemat ruang disk. Kemudian ketika gim ini berjalan, Anda bisa mendekompres atau menarik gambar yang diinginkan dari file yang dikompresi - tergantung pada format kompresi yang Anda gunakan. Lihat jawaban sebelumnya yang menjadi wiki situs ini: /gamedev//a/37649/72423

Tetapi juga perlu diingat bahwa setiap jenis kompresi mungkin lebih atau kurang menguntungkan tergantung pada jenis file gambar yang Anda gunakan : Hindari kompresi sumber daya ganda

Untuk detail lebih lanjut tentang kompresi: Keadaan canggih dalam kompresi gambar?


Terakhir, Anda mungkin juga tertarik untuk memikirkan jenis gambar apa yang akan digunakan untuk setiap situasi: Format gambar mana yang lebih hemat memori: PNG, JPEG, atau GIF?

Dan
sumber
Terima kasih untuk informasinya. Sungguh aneh Anda bisa memotong ukuran file menjadi setengah dengan meletakkan segala sesuatu dalam satu file. Saya pikir pada akhirnya, itu adalah jumlah piksel yang sama dan ruang yang digunakan. Saya mengedit pertanyaan saya untuk jawaban yang lebih baik
Snake
@Sake Jadi, sesuai hasil edit yang Anda buat, saya pikir jawaban saya memang bisa membantu. Menggabungkan gambar + mengompresi dapat mengurangi ukuran folder Anda dengan jumlah yang sangat besar. Kedua teknik ini biasa digunakan dalam beberapa jenis permainan. Tentang penggabungan, itu selalu trik yang mengejutkan. Cobalah sendiri: letakkan gambar dari urutan satu animasi Anda berdampingan dan bandingkan ukuran akhir dengan jumlah gambar masing-masing. Maka Anda dapat melihat apakah itu membantu dalam kasus Anda. Adapun kompresi, untuk PNGs cenderung kurang efektif, tapi masih layak usaha untuk ukuran potongan folder akhir Anda
Mand
@Lakukan satu pengamatan, meskipun: penggabungan terkadang tidak bernilai atau bahkan sedikit meningkatkan ukuran akhir. Namun seringkali hal itu dapat memberikan pengurangan yang diinginkan. Itu semua tergantung pada gambar Anda
Mand
Saya ingat mencoba kedua teknik dan pengurangannya kurang dari 10%. Saya pasti tahu kompresi tidak masalah dengan PNG tapi saya akan mencoba rangkaiannya. Itu sebabnya saya bertanya bagaimana permainan lain melakukannya karena jelas mereka memiliki grafik yang jauh lebih banyak daripada saya
Snake
Anda seharusnya tidak dapat mengompres folder yang penuh dengan gambar. Gambar harus sudah dikompres, dan seharusnya tidak memiliki banyak urutan berulang. Jika mereka melakukannya, lapisan kompresi tambahan itu akan menjadi bagian dari codec gambar ...
corsiKa
9

Saya akan mengusulkan agar Anda mencoba TexturePacker

  • Anda cukup menarik dan melepas semua gambar Anda dan mengemasnya
  • Anda dapat menerapkan kompresi yang berbeda - mis. gunakan PNG yang diindeks yang menggunakan memori jauh lebih sedikit - hingga 70% lebih sedikit dibandingkan dengan file PNG standar
  • Anda dapat membuat file data file yang berisi nama + posisi masing-masing bangunan Anda
  • versi gratis mungkin sudah cukup untuk membuat lembar sprite untuk Anda

Apakah Anda menggunakan kerangka pengembangan game seperti AndEngine, Cocos2d-x atau LibGdx? => Tidak Ada

Apakah Anda perlu semua gambar Anda dimuat pada saat yang sama? Sepertinya Anda akan mengalami masalah RAM yang sangat besar pada perangkat target.


Pembaruan: Snake mengirimi saya beberapa gambar. Seperti yang dijanjikan tidak akan membuat mereka publik di sini jadi saya telah membuat beberapa karya seni sendiri untuk menunjukkan cara mengurangi penggunaan memori.

Di gambar asli, hanya satu bagian dari gambar yang bergerak. Saya telah menempatkan seekor burung di sebuah rumah untuk menunjukkan hal ini:

masukkan deskripsi gambar di sini

Pada dasarnya mengemas animasi lengkap menjadi selembar adalah pemborosan besar memori. Anda harus membagi bagian statis dan bergerak:

Statis:

masukkan deskripsi gambar di sini

Anim01:

masukkan deskripsi gambar di sini

Anim02:

masukkan deskripsi gambar di sini

Jaga posisi asli burung dalam gambar . Inilah sebabnya ada begitu banyak ruang kosong di atas. Anda memerlukan ini untuk menyelaraskan animasi.

Sekarang seret gambar pada TexturePacker dan pilih parameter berikut

  • Format data: hash JSON (atau XML jika Anda menginginkannya)
  • TrimMode: Trim (ini menciptakan persegi panjang)
  • Format piksel: INDEXED 8bit - untuk membuat PNG 8bit (memori sekitar 70% lebih sedikit)
  • Izinkan Rotasi: salah
  • Masukkan nama file untuk data

TexturePacker mengemas gambar

Hasilnya adalah Anda sekarang mendapatkan 2 file: Lembar sprite dan file deskripsi 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}
},

Bagian penting adalah frame dan spriteSourceSize .

The bingkai memberikan Anda lokasi sprite asli dalam lembar sprite.

spriteSourceSize memberi Anda offset untuk menggambar gambar - bagian gambar yang ditinggalkan karena pemangkasan:

Rutin menggambar kode semu sederhana terlihat seperti ini:

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)
}

Anda mungkin harus menyesuaikan perhitungan offset tergantung pada pivot point / origin di sistem grafis Anda. Rutin di atas mengasumsikan sistem koordinat yang asalnya berada di kiri atas.

Maka cukup gambar rumah dalam 2 pass:

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

Anda tidak perlu peduli dengan offset - karena gambar sudah disejajarkan.

Andreas Low
sumber
+1 untuk pengamatan tentang penggunaan RAM, yang diabaikan orang lain
Dan Hulme
@ Andreas saya akan memeriksanya. Terima kasih. Jangan menertawakan saya, tetapi saya tidak menggunakan mesin. Sebagian besar dilakukan dengan animasi dan drawables dan itu bekerja seperti pesona. Saya tidak memuat semua gambar dalam memori, tidak ada cara lain yang akan merusak. Itu hanya memuat gambar yang diperlukan untuk tampilan saat ini .. apakah Anda pikir saran di atas akan bekerja dengan Android SDK standar?
Snake
1
Ya, tentu saja. TexturePacker memiliki 2 mode untuk memangkas sprite: Rectangles dan poligon. Jika Anda menggunakan gambar isometrik, Anda mungkin mendapatkan keuntungan besar dari jerat poligon dalam hal pengemasan. Pertanyaannya adalah apakah Anda bisa menggambar segitiga bertekstur - atau persegi panjang dengan topeng. Jika tidak, Anda masih bisa menggunakan persegi panjang. Anda dapat mengirim saya beberapa gambar Anda jika Anda ingin menggunakan dropbox dan mengirim tautan ke -> dukungan di codeandweb. com. Saya tidak akan membaginya - hanya tertarik untuk melihat apa yang bisa kita lakukan untuk meningkatkan pengepakan.
Andreas Löw
@ AndreasLow Maaf, saya tidak mendapat pemberitahuan atas komentar Anda. Saya baru saja melihatnya. Saya akan sangat menghargai bantuannya. Saya akan mengirimkan Anda sesuatu dan mungkin Anda bisa menjelaskan apa yang seharusnya. ..mungkin terjebak dengan sesuatu yang saya punya sedikit pengalaman dan mungkin Anda bisa menjelaskan. Saya akan segera menghubungi Anda
Snake
7

Berikut adalah beberapa penunjuk yang dapat Anda gunakan

  1. Coba pastikan semua Background Anda dan gambar yang tidak transparan tidak dalam format PNG
  2. Cobalah untuk memiliki semua loop-bisa animasi yaitu jika animasi 1,2,3,4,5,6 mencoba membuatnya menjadi 1,2,3,4,3,2,1 di mana angka-angka ini adalah jumlah bingkai animasi, ini sangat membantu
  3. jika banyak gambar yang sama dan hanya warnanya berbeda (umumnya tombol UI, m partikel animasi, koin game) maka cobalah untuk mengambil satu gambar Putih dan ubah warnanya secara dinamis
  4. Cobalah untuk membuat .apk Anda hanya dengan gambar-gambar yang sangat penting dan kemudian muat semuanya dari server dan simpan di memori ponsel

Saya harap petunjuk ini membantu

PS Saya hanya memberikan ide umum karena saya tidak mengetahui konten permainan Anda yang sebenarnya dan meminta maaf jika petunjuk ini tidak berguna

Kumar Saurabh
sumber
Anda juga dapat: 1) mengkompres semua gambar Anda 2) menggunakan ubin sesering mungkin 3) menyatukan gambar menjadi gambar yang lebih besar dan menggunakannya sebagai peta uv untuk tekstur
Anthony Raimondo
Itu adalah saran bagus. Terima kasih. Saya pikir poin yang paling penting adalah 4. Namun jika itu masalahnya, bagaimana cara menempatkannya di folder yang dapat digambar berbeda dan merujuknya seperti R.drawable.image1? Di situlah saya bingung
Snake
4

Banyak game yang tidak menyimpan aset grafisnya di .apk; mereka hanya memasukkan "dasar-dasar" seperti grafik UI dan kode game dan mengunduh sisa aset setelah game dipasang. Hal ini terutama berlaku untuk gim yang menggunakan sumber daya grafis yang berbeda tergantung pada resolusi tampilan Anda untuk menjaga .apk dari keharusan mengandung aset beresolusi rendah dan hi-res.

Anda harus melihat opsi pengoptimalan yang disediakan oleh penjawab lain, serta apakah Anda akan harus menyajikan grafik gim Anda secara terpisah dari .apk itu sendiri.

Sandalfoot
sumber
Saya tidak memiliki masalah dalam mendapatkan gambar dari server (atau bahkan file ekspansi), tetapi bagaimana cara meletakkannya di folder yang dapat digambar sehingga saya dapat mereferensikannya dengan R.drawable.x Karena sebagian besar (banyak banyak) xml saya merujuknya menggunakan R .drawable
Snake
AFAIK, kamu tidak bisa. Salah satu solusinya adalah menjaga tabel hash dari nama file sumber daya yang terhubung ke ID sumber daya, dan menggunakan AssetManager untuk mengambil file berdasarkan ID tersebut, tetapi Anda mungkin harus mengerjakan ulang file .xml Anda jika Anda menggunakan rute ini.
Sandalfoot
4

Saya datang ke situs ini untuk mencari pertanyaan serupa dan memang ada beberapa sumber yang bagus yang menunjuk pada jawaban untuk pertanyaan Anda dan dalam pertanyaan lain.

Anda mungkin harus melihat animasi 2D: Model atau sprite animasi 3D dengan bingkai animasi? untuk beberapa perdebatan tentang berbagai jenis animasi. Ini membantu saya mengoptimalkan permainan saya. Selain itu, Anda tidak memberi tahu kami API mana yang Anda gunakan atau Engine mana yang Anda gunakan. Itu saja dapat membuat perbedaan: Android frame by frame PNG animation

Selain itu, perlu diingat bahwa jika Anda akan pergi rute kompresi, mungkin ada perbedaan penting antara cara Anda kompres. Secara khusus, ada beberapa perbedaan antara jenis kompresi dan ada beberapa perdebatan khusus tentang rute mana yang paling tepat untuk perangkat seluler. Khususnya jika Anda mempertimbangkan bahwa untuk seluler, penggunaan RAM dan pemborosan CPU untuk memuat juga sangat penting. Lihat: http://www.gamasutra.com/blogs/AlexandruVoica/20130419/190833/Why_efficiency_is_key_in_texture_compression_standards_for_mobile_graphics.php?print=1

Bennton
sumber
Terima kasih Bennton, saya sebenarnya baru dalam pengembangan game. Saya mengembangkan banyak aplikasi yang berbasis alat / produktivitas. Tapi tidak ada yang punya game. Jadi saya melakukan game pertama saya dan saya tidak menggunakan mesin. Saya hanya menggunakan AnimationDrawables dan semuanya berjalan dengan baik. Hanya saja ukuran apk sudah tidak terkendali
Snake
Bennton, tautan terakhir yang Anda sarankan sangat menarik. Terima kasih banyak telah berbagi itu! Pastikan Anda melihat yang terakhir dari jawaban saya, yang juga menyentuh masalah kompresi berbeda untuk berbagai jenis file. Sebenarnya, tampaknya ada tipe kompresi yang bekerja lebih baik dengan tipe gambar yang sudah dikompres seperti PNG, atau lebih baik dengan tipe gambar yang tidak terkompresi. Bereksperimen untuk setiap kasus selalu merupakan cara terbaik untuk memeriksa apa yang paling cocok untuk setiap situasi.
Tanggal