2022/11/05(土) [n年前の日記]
#1 [cg_tools] png画像最適化ツール Oxipngを試用
画像フォーマット WebP や AVIF について調べていたら、png画像を最適化してファイルサイズを小さくできる Oxipng というツールがあることを知った。
_shssoichiro/oxipng: Multithreaded PNG optimizer written in Rust
png画像最適化ツールとしては OptiPNG が有名だけど。
_OptiPNG Home Page
この OptiPNG、結構最適化してくれるものの、処理時間がそこそこかかってしまう。その OptiPNG を、Rust という言語を使って書き直してマルチスレッド化したのが Oxipng なのだとか。
興味が湧いたので試用してみた。環境は Windows10 x64 21H2。
oxipng-6.0.1-x86_64-pc-windows-msvc.zip を入手して解凍。中に、oxipng.exe が入っている。
oxipng -h と打てばヘルプが表示される。
以下は、hoge.png を上書きして最適化する例。
ワイルドカードも使えるようで、フォルダ内の .png を全部最適化、といったこともできる。
少し使ってみた感じでは、OptiPNG に比べて圧倒的に処理時間が短かった。素晴らしい。しばらくは、OptiPNG の代わりにコレを使って様子を見てみよう…。
_shssoichiro/oxipng: Multithreaded PNG optimizer written in Rust
png画像最適化ツールとしては OptiPNG が有名だけど。
_OptiPNG Home Page
この OptiPNG、結構最適化してくれるものの、処理時間がそこそこかかってしまう。その OptiPNG を、Rust という言語を使って書き直してマルチスレッド化したのが Oxipng なのだとか。
興味が湧いたので試用してみた。環境は Windows10 x64 21H2。
oxipng-6.0.1-x86_64-pc-windows-msvc.zip を入手して解凍。中に、oxipng.exe が入っている。
oxipng -h と打てばヘルプが表示される。
以下は、hoge.png を上書きして最適化する例。
oxipng.exe -o max -s hoge.png
- -o max, --opt max : 最大の最適化を試みる。
- -s, --strip safe : 画像描画に不要なメタデータを削除。
ワイルドカードも使えるようで、フォルダ内の .png を全部最適化、といったこともできる。
oxipng.exe -o max -s *.png
少し使ってみた感じでは、OptiPNG に比べて圧倒的に処理時間が短かった。素晴らしい。しばらくは、OptiPNG の代わりにコレを使って様子を見てみよう…。
[ ツッコむ ]
#2 [tic80][ruby] TIC-80 + Rubyのサンプルを書き直してみた
_昨日、
TIC-80 1.0.2164 + Ruby (mruby 3.0) で class を使ったサンプルを書いてみたものの、処理内容的に class を使ってる意味が薄いなと思えてきた。
ここはやはり、一つ一つのオブジェクトが勝手気ままに動いてるほうがそれっぽいかなと思えてきたので、そのようなサンプルに書き直してみた。環境は Windows10 x64 21H2 + TIC-80 1.0.2164。
書き直したと言っても、作ったのはいつものアレだけど。ボールが画面内を跳ね回るソレ。
処理としてはショボいけど、複数のオブジェクトが別々に動く様子を一応実装していると言えるわけで…。この手のサンプルが動いた/書けたなら、その環境上でリアルタイムアクション系ゲームも作れそうだと容易に予想できるはず。そう考えると、これもまた Hello World の一種なのかもしれない。
ここはやはり、一つ一つのオブジェクトが勝手気ままに動いてるほうがそれっぽいかなと思えてきたので、そのようなサンプルに書き直してみた。環境は Windows10 x64 21H2 + TIC-80 1.0.2164。
書き直したと言っても、作ったのはいつものアレだけど。ボールが画面内を跳ね回るソレ。
処理としてはショボいけど、複数のオブジェクトが別々に動く様子を一応実装していると言えるわけで…。この手のサンプルが動いた/書けたなら、その環境上でリアルタイムアクション系ゲームも作れそうだと容易に予想できるはず。そう考えると、これもまた Hello World の一種なのかもしれない。
◎ ソース。 :
ソースは以下。
_moveball.rb
使用画像は以下。
_tiles2.png
TIC-80 のタイル画像領域にインポートするには、コンソール上で以下を打つ。
_moveball.rb
# script: ruby class Ball def initialize(x, y, scrw, scrh) @id = 1+2*(rand*6).to_i @x = x @y = y @scrw = scrw @scrh = scrh ang = rand(360) spd = 0.4 * scrw / 60.0 a = ang * Math::PI / 180.0 @dx = spd * Math.cos(a) @dy = spd * Math.sin(a) end def update @x += @dx @y += @dy @dx *= -1 if (@x <= 0 or @x >= @scrw - 16) @dy *= -1 if (@y <= 0 or @y >= @scrh - 16) end def draw spr @id,@x,@y,0,1,0,0,2,2 end end $scrw, $scrh = 240, 136 $t = 0 # init objs $objs = [] n = 80 n.times do |i| o = Ball.new($scrw/2, $scrh/2, $scrw, $scrh) $objs.push(o) end # main loop def TIC # update $objs.each {|o| o.update} # draw cls 0 $objs.each_with_index {|o,i| o.draw} print "mruby: #{RUBY_VERSION}",4,8*1,12 print "count: #{$t}",4,8*2,12 print ($t.div(60)).to_s+" sec",4,8*3,12 $t+=1 end
使用画像は以下。
TIC-80 のタイル画像領域にインポートするには、コンソール上で以下を打つ。
import tiles tiles2.png
◎ 少し解説。 :
Ruby (mruby) の仕様について、分かった範囲でメモ。
TIC-80側の仕様について。タイル画像をpng画像としてエクスポートしたい時は以下を打つ。
逆に、インポートしたい時は以下。
エクスポートされた画像を使い慣れたドットエディタで修正してからインポートすれば、作業が楽になるかもしれない。
- 疑似乱数は、rand で得ることができる。0.0以上、1.0未満の実数を返すらしい。
- rand(整数) と書けば、0 - (整数 - 1) の疑似乱数を返す。
- 三角関数 sin, cos は、Math.sin()、Math.cos() と書く。
- 円周率πは、Math::PI と書く。
- 度をラジアンに変換する関数は、どうやら無いっぽい。たぶん。
- 配列の初期化は、objs = [] のように書く。
- 配列に要素を追加するには、objs.push() を使う。
- 配列を使ってループするには、objs.each {|o| ... } や objs.each do |o| ... end のように書く。
- 回数を指定してループするには、10.times do |i| ... end のように書く。この場合、i には 0 から 9 まで入る。
- クラスのインスタンス変数は、@id のように @ を先頭につける。
- 数値を文字列にするには .to_s をつける。10.to_s とか。
- 実数や文字列を整数にするには、.to_i をつける。10.0.to_i とか。"10".to_i とか。
- 文字列の中に変数を展開するには、#{} を使う。print "x, y = #{x},#{y}" みたいな感じ。
TIC-80側の仕様について。タイル画像をpng画像としてエクスポートしたい時は以下を打つ。
export tiles hoge.png
逆に、インポートしたい時は以下。
import tiles hoge.png
エクスポートされた画像を使い慣れたドットエディタで修正してからインポートすれば、作業が楽になるかもしれない。
[ ツッコむ ]
以上、1 日分です。