部品数の多いレイアウトの仕上げに一工夫

お手元のPC環境にもよると思いますが、部品数が実装メモリに比してある程度多くなってくると、レイアウターが目に見えて遅くなるという現象が発生します。具体的にレイアウト作成の作業を阻害すると思われるのは以下の2つではないでしょうか。

 

ちなみに当方環境(CPU:Athlon1GHz/RAM:384MB)では部品数5,000あたりから怪しくなる。

1.部品の配置(部品パレットからのドラッグ&ドロップから次の操作が可能になるまでの時間)が遅くなる。

2.UNDO(もとに戻す)や大量部品のコピー&ペーストの処理が、いつ完了したかわかりにくい。

 

上記では現象を2つに分けて書いていますが、実際には根っこを同じくする問題であり、要するに、部品をドロップしたりUNDO(もとに戻す)操作をおこなう毎に、レイアウターが一見してフリーズしたかのような振る舞い(処理の終了まで応答しない)を見せるということになります。

物理メモリ不足によるスワップの多発は当然として、VRMでは、部品を配置したり移動したりする都度に隣接する部品との連結が判定されることも、要因になっていると思われます。

実際、NT系のOS(NT、2000、XP)でタスクマネージャを見ると、レイアウターが「応答なし」になっているのを確認することができます。

この問題を本質的に解決するには、物理メモリを増設するしかありません。が、PC初心者の方にとっては「PCの買い替え」に発展しかねない話ですし、パワーユーザーにとっても既存のメモリや空きスロットの兼ね合いを考えると、おいそれと着手できる話ではありません。

で、今回は、なんとか操作上の工夫でこれらの問題を回避するか、回避できないまでもレイアウト作成の作業を阻害しない程度に抑えられないか、を考えましょうという趣向です。

以降の内容は、2003レイアウトコンテスト参加作品の制作中に思いつき、実際に製作に役立ったテクニックです。

時間のかかる処理完了の見分け方

順序が前後しますが、上掲の問題2:UNDO(もとに戻す)や大量部品のコピー&ペーストの処理が、いつ完了したかわかりにくい、から触れていきます。

この現象、特にUNDO処理や大量の部品の貼り付けについては、いつ処理が完了して操作可能になったのか、なかなかわかりにくいところがあります。場合によっては数分待たされることもあり、この間に待ちくたびれて次の操作を中途半端にやろうとすると、その中途半端な操作の完了にさらに待たされる・・・という嫌な連鎖もおこりますから注意が必要です。

これについてはWindows GUIに共通する簡単な見分け方があり、メニュー上にマウスカーソルをフォーカスした際の挙動が指標になります。

つまり、アプリケーションが処理にかかりきりでWindows標準のイベントに反応できない場合は、マウスカーソルをフォーカスした場合の処理もおこなわれないため、VRM3であればメニュー項目の反転がおこらなくなります。逆に、処理が完了しており操作を受け付ける状態であればメニュー項目が反転します。

と言うのも、これを知っておかないと次節で紹介するテクニックの利用に不便なので。

 

<左は処理中、右になれば次の操作が可能>

言うまでもないですが、VRM以外のフォアグラウンド処理を占有するWindowsアプリケーションにも同じことが適用できます。

従って、時間のかかる処理を開始した場合、マウスカーソルを適当なメニュー項目の上に移動させておけば、メニュー項目が反転するか否かで処理が完了したかどうかを見分けることができます。

処理速度向上の秘策

次に、問題1:部品の配置(部品パレットからのドラッグ&ドロップから次の操作が可能になるまでの時間)が遅くなる、の対策を考えます。

この現象は、ある程度以上の大きさ(厳密には部品数)のレイアウトを作成する場合に、深刻な問題となります。当方環境(RAM:384MB)では、部品数が5,000を超えたあたりから、部品を1つレイアウト上にドロップする毎に約1分待たされるようになってしまいました。また、レイアウト上の部品をクリックして選択する(オプション部に部品の位置情報等が表示される)毎にも同様に時間を要します。この結果、レイアウト作成作業の効率が著しく低下しました。

物理メモリの追加をせずに、このような現象を回避するにはどうすれば良いでしょうか。答えは簡単で、物理メモリを増やすかわりに部品を減らせば良いのです。

「部品数の多いレイアウトを作りたいのに、部品数を減らせとはこれ如何に?」と思われた方もおられるかも知れません。が、頭を柔らかくして考えれば、「完成時のレイアウトと作業中のレイアウトの部品数が同じである必要性はない」ことに気づくはずです。

つまり、今おこなっている作業に必要な部分だけを取り出したレイアウトを別途用意すれば、作業中のレイアウト上の部品数が減り、結果的に処理速度の向上が可能となるのです。

 

では、具体的な手順を見ていきましょう。重要なポイントは以下の6つです。

  • 処理が重くなってきたレイアウトファイル(便宜上「完成レイアウト」と呼ぶ)のコピーを作成する。

  • コピーしたレイアウトファイル(同「作業レイアウト」)を開き、当面の作業に不必要な部品を削除する。

  • 作業レイアウトに新規レイヤ(同「作業レイヤ」)を作成し、このレイヤに部品を追加していく。

  • 完成レイアウトにも作業レイヤを作成する。

  • 作業レイアウトの作業レイヤの部品全てを選択してコピーし、完成レイアウトの作業レイヤに貼り付ける。

  • 貼り付けた部品は、適時他のレイヤに移動させる。

まず、下に例示するようなレイアウトを作成中であるとしましょう。これは例ですので、レイアウターが重くなるような代物ではありませんが・・・。

<サンプルレイアウト:これを便宜上「完成レイアウト」と呼ぶ>

このレイアウトにさらに部品を追加していきたいのだけれども、レイアウターが重くて能率が悪いとしましょう。まずやるべきことは、いったんレイアウトを閉じ、このファイルのコピーを作成することです。

<ファイルをコピーして・・・>

<ファイル名を「作業レイアウト」にしておきましょう>

ここでは右クリックポップアップメニューからの「コピー」を例示していますが、当然ながらファイルがコピーされるのであればどの手順でもOKです。

なお、便宜上、本文中で使った「完成レイアウト」「作業レイアウト」という造語をそのままファイル名にしていますが、これも任意のものにしていただくのが宜しいかと。

 

あと、蛇足ですが。

以下の手順をおこなう際は、念のために「完成レイアウト」のバックアップコピーをもう1つ作成しておくことをお奨めします。

ここに書かれている手順に従って作業したら、間違って「完成レイアウト」の重要な部分を消してしまった!!・・・なんて苦情を寄せられても困りますので。

次に、今コピーして作った作業用レイアウトをレイアウターで開きます。とりあえず、画面右下に向かっている道路を延伸したいと考えましょう。この作業をおこなうにあたって、当面レイアウトの左半分はいらないはずですから、思い切ってその部分を削除してしまいます。

<思い切って削除する>

元の「完成レイアウト」が十分に大きい場合、この削除の完了には驚くほどの時間を要します。

ここで、処理の完了を待たずにレイアウター上でいろいろ操作を試みてしまうと、思いもよらない結果を招く場合があります。

こんなときこそ、前述の「時間のかかる処理完了の見分け方」を活用しましょう。

 

 

 

 

追加作業に不要な部分を削除する際、編成の位置に気をつけましょう。編成が展開されるレールをぶった切ってしまうとビュワーが起動できなくなります(編成が展開できない)し、左の例のように編成を含まないレイアウトになった場合も然りです。

まぁ、このファイルはあくまでも作業のためのコピーですから、編成を消すなり足すなりして、ビュワーが起動できる状況を適時整えてくださいまし。

部品数がいっきに減りました。レイアウターの動作も随分と軽くなっているはずです。この軽快さに浮かれてバンバン部品を置いてしまいそうですが、その前にやることがあります。

作業用レイアウトに追加した部品を特定するために、レイヤーを1つ作りましょう。以降、追加する部品はすべてこのレイヤーに配置します。こうしないと、どの部品が元の完成レイアウトにあったものかわからず、後の手順で完成レイアウトにコピー&ペーストする部品が特定できずに困ることになります。

部品の追加を始める前に、一旦作業レイアウトを保存して閉じ(可能ならPCを再起動して)開きなおすことを推奨します。

これにより、物理メモリ上の状態がリフレッシュされ、この手順の効果がより顕著に現れます、多分。

<作業用レイヤーを作成する>

作業に支障がないなら、この時点で作業レイヤー以外のレイヤーはロックしておいた方がいいでしょう。これらをここで修正しても、完成レイアウトには影響しないですし、何よりも紛らわしいです。

これで準備は整いました。動作が軽快になったレイアウターで思うままに部品を置きまくっていきます。ただ、勢いあまって、完成レイアウトにあった部品と場所が重ならないように注意することは必要です。

<作業レイヤーに部品を配置していく>

思う存分部品を配置できたら、追加した部品を完成レイアウトに運んでやることになります。まずは、作業レイヤーのすべての部品を選択して、編集メニューのコピーをクリックします。

<追加した部品を選択して「コピー」>

次に、完成レイアウトにコピーした部品を運びます。

完成レイアウトをレイアウターで開いていきなり貼り付け・・・といきたいところですが、これをしてしまうと、先ほど同様、運び込んだ部品と元の部品の区別がつかなくなって困ります。

まずは作業レイヤーを作成し、そのレイヤーをカレントレイヤーにしてから編集メニューの貼り付けをクリックします。すると、以下に示すように、完成レイアウトの上の「あらぬ場所」にさきほど追加した部品が反転表示で現れます。

<追加した部品を運び込んだ状態>

削除の場合同様、この貼り付け、さらに続く場所調整後の定着までも、かなりの時間を要します。ここでも「時間のかかる処理完了の見分け方」を活用し、ただでさえ手間なこの手順に余計な手間が増えないよう、注意しましょう。

ちなみに、当方環境では8,000部品を超えた頃に、「貼り付け」を始めた後、コーヒー作って煙草一服してPCの前に戻っても、まだ処理中、ということがありました。

この反転状態の部品をそのままドラッグして、「あるべき場所」に移動させます。

察しのよい方は既にお気づきと思われますが、このとき連結される部品(レール、道路など)を元の部品と追加する部品の間に設けておく(この例では青と緑の道路の連結部)と、微調整せずとも運び込んだ部品を意図通りの場所におくことができます。

「連結される部品がない場合はどうすればいいの〜」という応用の利かない方には、この手順はお奨めできません。事故ってレイアウトを壊すのがオチです。

ウソ。ダミーのレールや道路を完成レイアウトに加え、これに連結すれば宜しい・・・って、わかる?、この説明で?。

<あるべき場所に移動させる>

なお、この手法が適用できるのは「部品の配置」に限られることは言うまでもないでしょう。地形編集や架線敷設は、完成レイアウトでおこなう必要があります。

とは言え、架線柱だけをこの手法で追加したり(ghostの経験上、これが一番効果が高かったです)、地形造成をおこなうためのダミー部品をこの手法で運び込むと、作業効率の向上に資すると思われます。

後は、運び込んだ部品を適当なレイヤーに変更しておきましょう。この結果、さきほど用意した作業レイヤーは空となり、また同じ手順を繰り返す準備が整うことになります。

 

以上の手順を繰り返すことで、レイアウターのパフォーマンスを極端に損なうことなく、レイアウトの拡大(あるいは密度の増加)を延々と繰り返すことが可能になります。

ちなみに、ビュワー側の挙動ですが、見る限りは、部品の総数よりもレインダリング範囲内の部品数にその動作速度(フレームレート)が大きく影響されるようなので、事実上この手法の影響はあまり受けないようです。

 

厳密には部品にふられる連番の限界(データ構造中、何ビットを連番に確保しているか)があるはずですが・・・どうなんでしょう?

とりあえず384MBのRAMでも10,000突破ができることは実験済なのですが。

ま、気が向けばお試しください。

VRMoviesは、ここに紹介した技術情報について、読者のお手元の環境での再現性をいかなる場合においても保証いたしかねます。ご承知おきください。

 


Webmaster: ghost@nodus.ne.jp