リソースパックを軽量化したい

Published by alumina on updated on

うわっ… 私のリソパ、重すぎ…?
とりあえず見えればいい から いつも使いたいリソパ にレベルアップしませんか?
正常に読みこめないとか、動作が重いとかいう人向け。普段している軽量化について書きます。
Minecraft JE 1.18 Optifine環境でのアイテムモデル中心の話です。

高解像度テクスチャはくそ!とかドット絵しか勝たん!とかではなく、
どうすれば作りたいものを作れるのかということへのアドバイス的なものです。

重いってなんなのか

ここで言う重いは単純にファイルサイズが大きいだけではなく、
描画時に負荷が高かったり、正常に読みこめない事を指す。音声とかはよくわかりません。

お嬢鯖のリソースパックはこれまでのすべてのイベントを引き継ぐ形で制作していて、
とんでもない数のモデルを如何に軽く使うかに手間をかけているのだ。
働き者のろうそくがちまちまもらったファイルを編集している。

3Dモデルの軽量化

3Dモデルでは見えていない面を削除したり、parentの指定をすることでファイルサイズと描画負荷を軽減できる。

cube数、face数を減らす

これはBlockBenchのプラグインで簡単に行こなえる。
まずプラグインのインストールを行う。

File > Plugins からプラグインの設定を開く
Available から Optimize を探してインストール

あとは軽量化したいモデルを開いて

Tool > Optimize で設定を開く
特に何もチェックせずに Confirm で実行
例えばこのモデルだと429のfaceが削除される

簡単だね。ユーザーから見えることのない面だけを削除するので、見た目に変化がなく軽量化できる。
同時にcubeの中のcubeも削除してくれる。

ただ、透明なモデルは注意。見えるところも消える可能性がある!

やばっと思ったら Ctrl + Z で元に戻そう。

ほんの少しでも見えていると削除してくれないので、
snapツールを使いきれいにモデルを作っておこう。

cullfaceを設定する

こんなツイートをいただいた。

その通りである。あるみなが気づいたように書いてしまおう!げへへ。

cullfaceっていうのはブロックとブロックが接しているときに、
その間の面は描画しなくていいよねということ。不要な面をculling(間引く)わけだ。
チェストとかの微妙なサイズのモデルはcullingが全くできないのでめちゃ描画が重い。
逆に樽が完全なブロックと同じサイズなので軽い。みんなも樽を使おう。
(まあ正確にはエンティティモデルとブロックモデルの差もあるが)

ブロックを設置するようなモデルでは設定しておくべき。
手に持つアイテムモデルでは意味がない

cullfaceはface毎に方角が設定できて、その方向にブロックがあるときに間引くようになる。
Auto Cullfaceで大体OK。

faceを右クリックしCullfaceから南端は南に設定するといい


上のOptimizeプラグインでも Apply culling で一括設定ができる。
こちらは、ちょうど16x16x16でブロックぴったりの面しか設定されない。

確実に見えなくなる面だけが間引かれる

描画するときの照明の角度もCullfaceによって決まるのだが、あんまりうまく使えたためしがない。

JSONの圧縮

保存の仕方を変えることでファイルサイズを小さくすることができる。
あとで書くソフトでもまとめて行える。

parentでモデルを使いまわす

同じモデルだけど色が違うみたいなものはparentで他のファイルのモデルを継承することができる。BlockBenchではうまくできないので気が向いたら書く。

テクスチャの軽量化

単純に小さいテクスチャにすれば軽い。テクスチャが大きくすぎると読みこめなくなることがある。
まずその話から。

低スペックが死ぬリソースパック

ら民のテクスチャは低スぺPCでは読みこめないことがある。なんでだろうか?
マイクラの仕組みとしてリソースパックのすべてのブロック、アイテムの画像を1度 1つの画像にまとめて、ファイル読み込みを減らす仕組みがある。Texture Atlas と呼ばれるやつでゲームでは一般的。

Atlasはおっきなテクスチャ一覧表みたいなもんなんだけど、Atlasにはサイズの制限がある。
ひとつのテクスチャサイズや合計のテクスチャサイズがその制限を超えたりするとエラーになりリソースパックが読みこめなくなる。

この制限はグラフィックボードのメモリとかブランドとかで決められているっぽくて、オンボードグラボやノートPCの人だけが読みこめないという事態になる。

リソースパックを分割すれば解決することもあるが、分割したものを全部入れたら結局同じなのでだめだったりする。

Atlasってどんなの?

OptifineでJVM引数にに-DsaveTextureMap=trueを付けることで
TextureMapを見ることができる。
ゲーム内で使われるAtlasと全く同じかどうかは知らない。
見てわかるように写真っぽい画像を入れるとすごいスペースを食う。

聖兎学園祭2021のリソースパック 2048 x 1024

あるみなのいなかったイベント後のテクスチャでは無駄が多い。
大きい画像が重複していたりするとスペースをどんどん食うのだ。

学園祭後のクリスマスイベ終了後のリソースパック 4096 x 4096

じゃあ実際制限はどれくらいなの?というと
あるみなのノートPCでは16384 x 16384となっている。
オンボードグラボではこれより小さく、噂ではバニラではもっと小さいらしい。
でも割と余裕があるので放置している。

ら民のリソースパックは合計でこの16384 x 16384を超えてしまうので低スぺPCが死ぬのだ。

テクスチャのリサイズ

簡単に言えば画像のリサイズをすればいい。
でもただ単に画像を小さくすると、モデルとの参照位置がずれちゃって変になるので
ブロックベンチ側でのリサイズが必要。
逆に言うとファイルサイズでの制約ではないので、高圧縮にしようがこの問題は解決しない。

テクスチャを右クリックすれば Resize の選択ができる

ここで大事なのはテクスチャのサイズは16の倍数にすること
wikiなどでは16、32、48、64、128、256…なんかのサイズと書かれているが…

きちんとしたサイズでないとリソースパックの読み込み時にテクスチャのリサイズがされてしまう。
読み込みも遅くなるし、大きくリサイズされるのでAtlasを圧迫する。
あとミップマップレベルが下がる場合がある。
ミップマップレベルについて詳しく

読み込み時にリサイズされている様子

Optimizeプラグインを使う

texutureをtemplateで作っている人の場合は、上で書いたOptimize後にもう一度templateを作り直すと、
自動でいらなくなったテクスチャを省いてリサイズしてくれる。
最近のアプデでできるようになってとても便利。でも近くでtemplate使ってる人あんま見ない。

これを
Optimizeして
これが
テクスチャ作り直すと少し小さくなる

この例では大して変わらなかったが、結構大きく変わることもある。
特にブロックベンチはテクスチャを32×32とか64×64で作ろうとするので、
少し変わるだけで一段小さいテクスチャになれば儲けもの。

単色なのにでかいのを使わない

単色の面は1×1だろうが1000×1000だろうが見え方は同じ。小さくしよう。

テクスチャを使いまわす

1つのテクスチャを他のcubeにも使いまわししたりすると節約できる。
某リスは32×32程度でも素晴らしい工夫で味のあるテクスチャを作る。ずるがしこい。

専用ソフトをつかってゴリゴリに軽量化する

実はリソースパック軽量化のえげつないソフトがある。

PackSquash

https://github.com/ComunidadAylas/PackSquash

  • 画像の圧縮
  • JSONの圧縮
  • 無関係のファイルの削除
  • Optifine関連のファイルの圧縮
  • 難読zip化

のすべてが自動で行えるし、
あるみな的には体感できるぐらいマイクラでのロードも早くなる。
ただ、今回のモデルの軽量化はできないし、atlasの制限はどうもできないのでここでの説明は省く。

こちらに入門記事があります。

おわりに

今回紹介したのは短期的に効果のある物だけです。
Simplifyプラグインや3Dアニメーションの最適化をすれば軽くなるにはなります。
が、一般ユーザーから見れば軽くなっても見た目は変わらないし、そこまで血眼になってやるべきではないのかもしれません。