mieki256's diary



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 を上書きして最適化する例。
oxipng.exe -o max -s hoge.png

ワイルドカードも使えるようで、フォルダ内の .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 の一種なのかもしれない。

ソース。 :

ソースは以下。

_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

使用画像は以下。

tiles2.png
_tiles2.png

TIC-80 のタイル画像領域にインポートするには、コンソール上で以下を打つ。
import tiles tiles2.png

少し解説。 :

Ruby (mruby) の仕様について、分かった範囲でメモ。

  • 疑似乱数は、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 日分です。

過去ログ表示

Prev - 2022/11 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project