×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

Misakey The Metal Idol

連絡先:https://twitter.com/metalidol

Arduboyメモ

主にスケッチサイズと消費メモリを抑える方法のメモです。
c++を使うのがはじめてなのでよく分かっていないことが多いです。
資料
Arduino 日本語リファレンス:http://www.musashinodenpa.com/arduino/ref/

ARUDUISは一旦置いて、けものフレンズのゲームを作ったよ!

https://drive.google.com/open?id=0B4vGmUnXiLNFcVR6RklpX2N1c1U

久々に実機で動作チェック。
drawBitmapの配列にpgm_read_byteをつけていたのだけどそのせいでキャラ化けを起こしていた。
PROGMEMとpgm_readの使い方がいまいち分かってないかも。
一連の流れは作れたので後はひたすらリファクタリング。
スケッチサイズ削減が苦痛になってきたのでarduboy2ライブラリで動くものを作ってから
旧ライブラリで動くものに修正していく方針に変更することにする。

arduboy2ライブラリにすることで3000バイト近くスケッチサイズの節約になる。
みんななんでarduboyライブラリの関数を呼び出すだけの関数作ってるのか分からなかったけど
複数個所でインクルードしてたせいでarduboy2ライブラリへの置き換えが面倒でなんとなく理由が分かった。
コードを整理して総量を減らしたのにスケッチサイズは増えるのって結構へこむ…。
if文からswitch文の置き換えでスケッチサイズが増えることがあるっぽい。
if (10 > n) {
	n++;
}
下記のように否定にした方がスケッチサイズを削減できる。
if (10 != n) {
	n++;
}

関数を増やしてもスケッチサイズには影響しないので
分岐条件のネストが深くなった時は関数に逃がすと良い。
static const byte* bitmaps[] = { anime1, anime2, anime3, anime4 };

byte i;
arduboy.drawBitmap(x, y, bitmaps[i], w, h, color);
drawBitmap()で使うアニメパターンの配列を定義する時、
constだけでなくstaticも付けるとスケッチサイズを減らせるみたい。
char sign = (n > 0) - (0 > n);
変数の符号を取得したい場合、
上記のように書くとif文による分岐を使わずに済む。
if (n > 1) { }
if (n == 1) { }
if (-1 > n) { }
if (n == -1) { }
変数の中身によって分岐させる場合、
ifを並べるよりelse ifにした方がスケッチサイズを減らせるみたい。
if (n > 1) { }
else if (n == 1) { }
else if (-1 > n) { }
else if (n == -1) { }

if (n == 0) { }
else if (n == 1) { }
else if (n == 2) { }
else if (n == 3) { }
さらにswitchに置き換えられるものは
else ifよりswitchの方がスケッチサイズ削減になる。
switch (n) {
	case 0:
		break;
	case 1:
		break;
	case 2:
		break;
	case 3:
		break;
	}

ローカル変数にできるものは置き換えると使用メモリの節約になる。
ループカウンタ変数など。
byte i;
for (i = 0; 10 > i; i++) {
}

変数はbyte型を使う。符号が必要な時はchar型を使う。
どちらも1バイトで済む。
…と思ったけどbyte型の変数をchar型に変更したらスケッチサイズが増えた模様。
ポリモーフィズムによる分岐を使うより
switch文で分岐させる方がスケッチサイズと使用メモリの節約になる。
クラスの継承を使わない。

ファミコン

https://twitter.com/i/moments/782146817190277120

プチコン

http://www.nicovideo.jp/watch/sm25035951
http://www.nicovideo.jp/watch/sm18056047
http://www.nicovideo.jp/watch/sm17514769