S.F. Tracker (128)

公開:2005-12-05 07:25
更新:2020-02-15 04:36
カテゴリ:sftracker,windows,audio,tracker

Undo/Redoに対応したMachine Viewの編集コマンドを作成中。
作成しなくてはいけないコマンド

・マシンの移動...Complete
・ケーブル接続点の移動..Complete
・マシンの除去
・マシンの追加
・ケーブルの接続
・ケーブルの除去
・マシンの範囲選択
・選択範囲の移動

思いつくものは今のところこれだけ。

MachineViewの編集機能で必要なものは

・マシンのグルーピング編集
・・グルーピングしたときの入力ポート・出力ポートの編集
・マシンの編集
・ケーブルの編集
・サンプルの編集

順次作成していく。

今気にしている部分は、Undo情報の保持方法だ。

たとえばMachineViewからMachineを除去コマンドを実行することを考える。
Machineはコンテナに保存されている。除去コマンドを実行するとコンテナよりMachineオブジェクトが除去される。
現在の実装では、除去コマンドのUndo情報は除去したときのMachineオブジェクトを保持することで行っている。
要するにコンテナからはずすだけで実体はUndo情報が不必要となるまで保持することを意味する。
オブジェクトをシリアライズしていったん削除し、Undo時に再構築するようにはしていない。

なぜかというと、オブジェクトのアドレス情報が変化するとそれ以前のUndo情報が無効となる可能性があるからだ。
除去コマンドを発行する以前に、Machineに対する各種編集コマンドを発行しているとする。Machineに対する各種編集コマンドはMachineオブジェクトのアドレスをベースにしている。
そのため、Machineオブジェクトを削除(delete)し、再構築(new)するとMachineオブジェクトのアドレスが変化してしまい、それまでの編集コマンドはUndo不能となってしまうのである。

このやり方だと、サンプラなどメモリを多く使用するMachineの挿入・削除を繰り返すと莫大なメモリを消費することになってしまう。

メモリ位置を保持しつつUndo情報に必要なメモリ量を削減しなくてはならない。

どうするかであるが、

・今のやり方をやめる。
メモリアドレス(参照・ポインタ)ベースによらない方法に変更する。

・配置Newや配置Deleteをうまく使用してなんとかする?
ぼんやりとだが、

(Undo情報保存時の動き)

Undo情報保存時にファイルにシリアライズしてメモリよりUndo情報を追い出す→デストラクタ明示的呼び出し→メモリ位置を保存。

(Undo時の動き)

Undo情報のメモリ位置に配置Newで初期化→Undo情報をファイルより読み出す→復活!
とすればよいのでは...と考えている。

ムリかな...。