楽屋裏 - Casio Basic のグラフィックス プログラミング
fx-9860GII は、グラフィックス表示が可能で、fx-5800P には無い楽しさや利便性があります。
以前、簡単に触れました;
楽屋裏 - Casio Basic のグラフィックス描画
fx-9860GII は、グラフ関数電卓の名の通り、数学の学習を主な用途として考えられていて、数式やデータからグラフの描画、変換、比較などを行える各種機能があります。つまり、PCなどで使うプログラミング言語のグラフィックス機能とは、少し方向性が違います。それは、Casio Basic 、特にグラフィックスのコマンド仕様に反映されています。
fx-9860GII のグラフィックス コマンド
fx-5800P の取扱説明書は、Casio Basic のコマンドの説明があまり親切ではありませんが、ほぼ全てのコマンドが簡単な説明付で掲載されています(行列だけが例外と言えます)。
ところが、fx-9860GII の取扱説明書には、実際に機能が搭載されているのに取扱説明書に説明のないコマンドがかなり多くあります。グラフィックス関係のコマンドもそうです。
なお、電卓本体には、[SHIFT] [4] (CATALOG) キーがあり、ここでは全コマンド類が全て含まれています。このリストを手がかりに、色々調べてみようと思っています。
さて、よく使いそうなグラフィックス関係のコマンドは、主に以下のメニューにあります。
・設定コマンド: [SHIFT] [MENU] (SET UP)
・描画コマンド: [SHIFT] [F4] (Sketch)
・座標設定: [SHIFT] [F3] (V-Window)
・グラフィックス消去: [SHIFT] [VARS] [F6] (▷) [F1] (CLR) [F2] (Grph)
各種設定、座標設定、点、円、線の描画、消去といった基本的なコマンド類は、これらのメニューから呼び出せます。
Casio Basic 入門 - 新連載の予告
これまで、fx-5800P を中心に Casio Basic 入門を連載してきました。各種コマンド類の使い方、アルゴリズムの紹介をして、ある程度実用的なプログラムを完成させる、といったスタイルです。
これに加えて、fx-9860GII でのグラフィックス プログラミングの紹介を追加してゆくことにしました。先ずは、上記の基本的なコマンド類について、取りあえず私が納得する範囲で調べたその結果を Casio Basic 入門 で紹介します。但し、具体的なゲームなどのプログラム作りは行わず、各コマンドの機能、制限、内部動作が分かるようなプログラムを作ってゆくスタイルにします。
コマンドを実際にみてゆくと、古いグラフ関数電卓から搭載されていたものに加えて、後から追加されたものがあります。このような流れを念頭にして、色々と調べてゆくと、内部動作を垣間見ることもでき、面白いものです。詳しくは Casio Basic 入門で紹介します。さらに、コマンドリファレンスにも追加する予定です。
その後は、グラフ機能や統計計算機能に付随する描画機能も調べてみて、グラフィックス描画性能を上げる可能性も探りたいと思っています。
画面を塗りつぶしてみる
カシオのグラフ関数電卓でのグラフィックス描画は、概して遅いと言えます。しかし、グラフィックス機能といえばゲームプログラミングだと思いますが、そもそも fx-9860GII はどのくらい遅いのか、sentaro 様にご協力頂きながら、実際に調べてみました。
単純に、LCD画面の下半分をドットで塗りつぶすプログラムです。下のプログラムを実際に入力するか、Markout.g1m ファイルをダウンロードして転送し、実際に実行してみてください。
Casio Basic 版 塗りつぶしプログラム MarkOut
ClrGraph
AxesOff
CoordOff
GridOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 31
For 0→X To 126
PlotOn X,Y
Next:Next
以下からダウンロード;
MarkOut.g1m
fx-9860GII でのグラフィックス描画は、一旦メモリにグラフィックスデータを送り、それを LCD 画面に転送する手順で実行されます。Casio Basic では、VRAMへの書き込みとLCDへの転送が、コマンドごとに行われます。
一方、SDK で Addd-in を作る場合は、VRAMへの書き込みとLCDへの転送を、個別に指示できるので、VRAMへのデータ書き込みをある程度まとめて行った後、LCDへ一気に転送すれば描画が速くなる筈です。LCDへのデータ転送の間引きを 1/10 にするのか、1/100 にするのか、1/1000 にするのかで、どの程度速度が変わるのか、試せるように Add-in を作りました。Casio Basic のアルゴリズムをそのまま採用しています。
Casio Basic では、プログラム実行の途中でも [AC] キーで強制終了できます。そこで、Add-in でも描画の途中で [AC] キーで強制終了できるようにしています。
Casio Basic に無い要素として、1ms の分解能のタイマーを同時に走らせて、実行時間の測定を行えるようにしています。このルーチンは sentaro 様が公開されているソースから、流用させて頂いています。
さて、プログラムを作って走らせている際、キースキャン ([AC] キーの検出、Casio Basic の Getkey に相当) が意外と時間を喰っていることに気付き、キースキャンも上と同様に間引きして、その影響をチェックできるようにしました。
Add-in 版塗りつぶしプログラム
以下からダウンロード;
MarkOut.zip
[2015/06/24 修正]
sentaro様からコメントを頂きました。
Add-in 版 MarkOut は、[F1] ~ [F4]を押して測定を開始する。Casio Basic 版と同様に、測定中は [AC] キーを押したら強制終了するようにするため、測定中でもプログラム内で [AC] キーをスキャンして、[AC] キー以外を押すとキースキャンがスキップされてプログラム実行速度が速くなる。逆に言えば、測定開始のために [F1] ~ [F4] を押すと、押した時だけプログラムが加速されていまうので、正しい時間測定にならない。
そこで、[F1] ~ [F4] を押して各測定モードに入った後、[EXE] キーが押されてからキーアップしたタイミングで測定開始させれば、上記の問題は解消される。
その通りですね。そして、これを実現した改良版を作って頂きました。上からダウンロードする Add-in は、この sentaro様の改良版に変更しました。sentaro様、ありがとうございます。
=====
先ずは、LCDへの転送を間引くと瞬間に描画が終わります。Casio Basic では、ドットを1つ描画するたびに LCD転送しているわけで、LCD転送が如何に時間のかかる処理か、とてもよくわかります。
グラフィックス プログラミングは、高速化が必要なプログラムには SDK で作る必要がありそうです。
なお、キースキャンも、LCD転送ほどでは無いのですが、結構な時間がかかっていることが分かります。
LCD Trasnfer Check モードで実行中に、[AC] キー以外を長押ししてみると、さらに増速します。キースキャンを減らしていることになるからです。
Casio Basic でのグラフィックス描画は、遅いという弱点がありますが、画面を全て塗りつぶすような重い処理でなければ、利用価値は多くあると思います。先ずは 実装されているコマンドをしっかりと理解して、使いこなそうと思います。
応援クリックをお願いします。励みになるので...