2ntブログ

VLC Media player 音が切れる場合の対処

その動作の軽さ、対応フォーマットの多さ、再生品質の高さなどから、恐らく一番人気のあるフリーの動画再生プレイヤーである「VLCメディアプレイヤー」。
しかしフリーであるが故に、不具合や動作不良にも自分で対応しなければならない。

さて、最近私の環境で起きた動作不良について。
動画の最後で音が切れるというもの。
動画はまだ終わってないのに、音だけが終わってしまったかのように出なくなるのだ。

原因は、デフォルトの設定だとVLCは音声出力に「Windowsマルチメディアデバイス」というのを使っているらしいのだが、これが非常に反応が遅く、プレイヤーを閉じても1秒ほど音の再生だけが続く。
これが嫌で、反応が早いと思われる「DirextX出力」に変更したのだが、これがダメだったらしい。
プレイヤーを閉じると同時に音の再生も中断されるようにはなったが、まだ動画が終わってないのに音の再生を中断するという余計な先回り処理をしてくれてしまっているらしいw
ちなみに、動画再生のパフォーマンス自体は、どちらでやっても変わらない。
ただプレイヤーを終了させた時に、ピタっとすぐに音を止めてくれるかどうかだけ。

従って、沢山の動画から目的のものを探すなどで、次々と再生しては閉じを繰り返すような場合は、VLCプレイヤーのオーディオ出力設定は「DirextX」にした方が良いが、きちんと最後まで鑑賞するなら、デフォルトの「自動」のままか「Windowsマルチメディアデバイス」にした方が良い。

本当なら、VLCが「ASIO」というWindowsでの音の再生でもっとも質が良いと言われているドライバに対応してくれてれば良いのだが、標準状態では対応してないのかリストに出てこない。
一応ネットで検索したら、VLC用のASIOプラグインのようなものを作って公開してるらしき人は居るようだが、英語で読めないし、それらを日本語で使ってみたと解説してる人柱(w)も居ないようなので、止めたw

なお「ASIO」は質の悪いWindowsのオーディオデバイスドライバ等を通さずに、独自の質を重視したドライバでそこを置き換えるものである。
従って、CPUのパワーは食うし、Windows側の音量調整が効かなくなるというデメリットもある。
ただ同時に、最適な設定をしてやれば、むしろWindows搭載の様々な音声再生機能プログラムよりも、高速・高反応になったりもするのだ。
音量調整機能へデータを渡して通す処理をすっ飛ばしているので、その分処理が簡素化されて速くなるのは、当然わかると思う。
そもそも音量なんて、ヘッドフォンで聞く場合はアレだが、スピーカーで再生してるなら、スピーカー側で調整すれば良いわけだし。

話が逸れたが、もし同じ現象で苦しんでる(?)人が居たら、参考までにどうぞ。

コンピュータで絵を動かす難しさ大変さ

つい最近、Youtubeでファミコン時代の技術的に優れた作品集みたいなのを見たので。

この動画で私もかつて述べた事がある、昔のスクウェアに居た外国人の天才プログラマーによる、ファミコンの限界を超えまくった高速全画面スクロールの話が出ていた。

ファミコンに限らず、コンピュータで画像を動かすのは、非常に難しくて大変なのだ。
今のパソコンやスマホだって、CPUの計算処理能力とプログラムだけで、動画を再生させたら、カクカクになるだろう。
そうならないのは、画像を動かす機能を持ったグラフィック専用の処理をするCPUみたいなのが組み込まれているからだ。
これをビデオカードと言ったり、グラフィック・チップとか言ったりする。

さて、コンピュータの画像というのは、「ドット」と呼ばれる小さな四角い点の集まりで出来ているのは知っているかと思う。
だから昔のゲームとかは、キャラクターとか文字がカクカクしてるのだ。
現在のパソコンやスマホでも、目を画面に近づけてよーく見てみてれば、■の集まりで絵や文字が出来ているのが分かる。
昔のコンピュータの画像のように、カクカクした線に見えないのは、単に■の大きさが昔よりも小さくなって、カクカクが目立たなくなっただけに過ぎない。

このコンピュータの■(ドット)は、その中にさらに「光の三原色」と言われる赤・緑・青の色が付いた、めっちゃ小さな電球みたいなのが入っている。
だから「R/G/B」と言われるのだ。

これがそれぞれ、どのぐらいの明るさで光るかによって、水彩絵の具を混ぜて色を作るのと同じように、三色以外の色になるのだ。
絵の具と違うのは、三原色の種類だけでなく、混ぜ具合による効果が逆になる事もあげられる。
絵の具というのは、色んな色を大量に混ぜ合わせると「黒」になる。
光の場合は色んな色を大量に混ぜ合わせる=全ての色のランプをめっちゃ光らせると、「白」になるのだ。
そして、色を混ぜ合わせないか、めっちゃ薄く混ぜる、ほとんど水みたいな状態だと絵の具は「透明」になり、画用紙の色である「白」になるわけだが、光の場合は何も光ってない状態というのは、真っ暗であり「黒」である。

話が逸れたが、コンピュータで文字や絵を画面に表示する場合、どこの■(ドット)をどんな色で光らせるか、全て指定してやらなければならない。
1ドットにつき、赤・緑・青のランプをどの程度光らせるかを、全てのドットに指定しなければならない。
今のパソコンの標準的な画面の大きさであるHD画像というのは、1920×1080個の■がある。
この1画面のドット数が縦・横それぞれ何個並んでいるかで、画面の細かさを示すコンピュータの用語を「解像度」と言う。

人間が、同じ数の□で構成された方眼紙に、色つきの点を打っていくだけでも大変なのは分かると思うが、CPUにプログラムでそれをやらせるのも、いかに大変か分かると思う。

静止画を表示するだけでも、これだけ大変なのに、さらにそれを動かすとなると、もっと大変なのは分かるだろう。
ゲームのキャラクターを動かすにしろ、画面全体が常に変化する動画を表示させるにしろ、それらはただでさえ大変な、ドットを使ってコンピュータの画面に絵を表示するという作業を、1秒未満の単位で何度も素早く行わなければならないのだ。
動画の原理はいまさら言うまでもないと思うが、内容が少しづつ違う画像を、素早く連続で人間の目に見せる事によって、あたかも絵が動いているかのようにするわけだ。
パラパラ漫画は、だれしも学生時代に教科書の端とかに書いて暇つぶしに遊んだ覚えがあると思うが、それと同じだ。

コンピュータのゲームや動画などで、その性能を示す基準に「FPS」というものがあるが、この「FPS」とは1秒間に何枚の異なる画像が表示できるか、と同じ意味である。
この数値が大きいほど、人の目には滑らかに動く画面に見え、少ないと「カクカク」した動きに見えてしまう。

画面全体が常に変化する、アニメーションや映画などのようなものは、それでもまだ簡単な方なのだ。
あらかじめ用意されている、何百枚・何万枚もの「絵」のデータを、素早くビデオ・メモリという場所に転送していけば良いだけなので。
しかしながらゲームの画像はそうはいかない。
プレイヤーの操作や、乱数によって決定される敵の動きなどによって、表示しなければならない「絵」が無限に変化するからだ。
あらかじめ用意しておく事など、とても出来ない。

そして、ゲームの場合は動かないか、動きが少ない背景の上に、それらのキャラクター達を重ねて表示する必要がある。
よって、コンピュータでゲームのキャラクターを動かす場合は、まず背景を書いて、その後にキャラクターが居る場所に、再度キャラクターの絵を「上書き」する作業が必要となる。
コンピュータゲームの動くキャラクターというのは、たいてい8×8ドット、あるいは16×16ドットで描かれている。
しかし8×8ドット全てがキャラクターの絵で埋まっているわけではない。
人の形をしたキャラクターならば、16×16ドットの全てを人の形に見せるために、特定の色で点灯させる必要はないのは分かると思う。
顔や体の周りには、わずかに使わないドットというのが出てくる。
それらを背景に上書きした時に、何も考えないでやると「黒」で塗りつぶされてしまう。
これではリアルさに欠ける。
だからキャラクターの絵として使ってない部分のドットは、「透明」として扱わなければならない。
単純に一度書いた画面に16×16ドットの絵を上書きすれば良いだけでなく、「透明」として扱うべきドットの時は、「上書きしない」という判定をしなければならない。

そして、これらを動かす場合は、背景は先ほどと1ミリも動いていないとしても、キャラクターが前回とは違う場所に居る場合は、前回キャラクターを描いた場所を消して、裏にあるはずの背景の画像データを読み込んで、もう一度そこに背景を書き直し、それから新しい場所にキャラクターを上書きしないと、キャラクターを動かした時に、「分身の術」でも使ったかのように、残ってしまうw

キャラクターが動くたびに、背景を全てもう一度最初から書き直してってやってたら、それだけ時間が掛かる。
かといって、以前キャラクターが居た場所だけ背景を書き直すにしても、その場所はどこの番地のドットがそれに相当するのかを、計算で導き出さなければならず、その計算がまた難しい。

このように、コンピュータで画面を動かすというのは、非常に大変なのだ。
ましてや画面を動かす機能をグラフィック・チップが持っていなかったり、持っていても低性能だったファミコン時代では、画面全体をスクロールさせるには、非常にゆっくりか、あるいはカクカクしてしまうのは、どうしてもしょうがない事だった。
でもスクウェアにかつて在籍した外国人天才プログラマーは、それをやってみせた。
だから「すげー」って分かる人には驚かれるのだ。

ちなみにファミコンは、コンピュータのこのキャラクターを動かす場合にしなければならない処理の多さや、プログラムの複雑さを軽減するために、「スプライト機能」というのを搭載している。
これは、プログラムやCPUではなくグラフィック・チップ側で、背景とキャラクターの重ね合わせ処理を行ってくれるものだ。
従って、キャラクターを動かした場合に、いちいち以前キャラクターが表示されていた場所に、再度背景を書きなおす処理はしないで良い。
スプライト番号1番のキャラクターが、どこからどこへ移動しましたって教えてやるだけで、スプライト機能を持ったグラフィック・チップが「分かりました」って言って、背景の書き直しと、新たな場所へのキャラクターの上書きをしてくれるからだ。
だからファミコンは、当時のパソコンよりCPUもメモリも劣っていたのに、当時のパソコンには出来ない高速なキャラクターの移動とかが出来たのだ。
しかも何体ものキャラクターが画面上を動き回っても、スピードが落ちなかったのだ。
それを当時のパソコンでやろうとすると、どうしてもCPUの処理能力とプログラムに頼らなければならなかったので、ファミコンほどスムーズに動かせなかったり、ファミコンほど多くのキャラクターを同時に画面上で動かす事ができなかったのだ。

ただファミコンでも、固定された背景の画面上に、たくさんのキャラクターを動かして表示する機能はあっても、画面全体を上下左右に「スクロール」(移動)させる機能は無かった。
それをやる場合は、パソコンと同じように背景を全部その都度書き換えなければならなかった。
そういう処理であれば、CPUのスピードがパソコンより劣るファミコンで、パソコンより早いスピードで動かすなんて出来るはずはないのだ。
でもやってしまった。
だからすごいのだ。

画面全体をスクロールさせる場合のひとつの方法は、あらかじめ用意されている全体のMAP画面みたいな所の、どこからどこまでを画像に表示させるかという方法がある。
ただこれは、指定の位置から順番に新たな画像データをビデオ・メモリに転送するだけという、プログラムの処理としては簡単な部類になるが、同時にあらかじめMAP画面全部の背景グラフィックデータを、メモリなどに常に用意しておく必要がある。
つまり大量のメモリが必要となり、その分プログラムとかで使えるメモリが減ってしまったり、そもそもメモリ自体が足らなくて、そんなに大きな画像データは用意しておけないという事にもなる。

なので通常は、ゲーム画面の背景というのは、キャラクターと同じく特定の形のグラフィックを背景キャラクターとして用意しておいて、それをどういう順番でどう並べるのかのデータだけしか持っていない場合が多い。
ドラクエのフィールドとか見れば分かるだろう。
地面とか山とか湖とか森とか、全て同じ形をしていたと思う。
つまりドラクエのMAPデータというのは、画像データで全MAPを持っているのではなく、ここには「山」とかここには「森」を表示させるみたいな、そういう背景キャラクターの何をどこに配置するかのデータしか持ってないのだ。
こうする事で、メモリを節約できるわけだ。
しかし一方で、画面全体をスクロールさせる場合は、MAPの背景キャラクターの配置情報を元に、1個1個の背景グラフィックデータを読み出して、それをビデオ・メモリに転送してと二度手間になり、処理に時間が掛かるという欠点が出てくる。
しかも背景キャラクターのデータというのは、8×8や16×16ドットで構成された状態のものしか無いので、画面上で「山」が半分だけ見えているとかいう状態を書くのは、めちゃくちゃ難しいし手間だ。

ファミコンのファイナル・ファンタジーは、ドラクエのように山なら全て同じ形、同じ大きさで配置されているとかってのは無かったが、それでも背景は、背景キャラクターの集まりで出来ていたはずである。
ドラクエよりも、多くのパターンの背景キャラクターデータを持つ事で、同じ形の背景がひとつも無いかのように見せていただけで、よーく見れば同じパターンで描かれている場所ってのは沢山ある。

そしてそれらを高速で上下左右にスクロールさせる。
飛行船に乗って移動する時のアレだ。
しかもそのスクロールはまったく「カクカク」しておらず、非常に滑らかで、1ドットという最小単位できちんと画面の変更をしているであろう事が分かる。
(もしかしたら、処理スピードを上げるために1ドットではなく2ドットづつ動かしてるかも知れないがw)

それを高速で行うプログラムを作るのは、非常に難しい。
どういう手順で、どういう計算処理をしていけば、一番速く背景の書き換えが、しかも1ドット単位で行えるか?
それを考え、さらに当時の遅いファミコンのCPUやグラフィック・チップにそれをやらせる。

一説には、ファミコンのCPUやグラフィック・チップの不具合を突いた処理をしているとも言われている。
CPUやグラフィック・チップの不具合というのは、今でもある。
特定のCPUにセキュリティー的な欠陥が発見されたと、よくニュースを見る事があるだろうが、あれがそうである。
ファミコン時代は、ネットに繋がったりしないし、中に重要な個人情報とか企業秘密のデータとか保管されたりしなかったし、する要領の余裕も無かったので、単に本来とは違う動作をする程度のものだが。

この「本来とは違う動作」が、高速スクロールに使えると思ったのだろう。
考えられるのは、例えば今のコンピュータもそうだが、グラフィック・チップに何らかの指令を送る場合は、グラフィック・チップ側が今は暇なので、指令を受け付けられますという信号を検知してから行うのが普通だ。
これを「Vsync」などと言う。
これを無視して命令やグラフィック・データを送ったりすると、画像が乱れたりする。
それまでグラフィック・チップがやっていた作業が、強制的に中断されたり、順番が入れ替わったりしてしまうからだ。
しかし、ファミコンのグラフィック・チップの場合は、グラフィック・チップの都合を聞かないでデータを送った場合、なぜか特定の方向に画像のデータが1ドットづつズレて表示されるとか、そういう不具合があったとすれば、これは「高速スクロール」に利用できるだろうw
なぜなら、プログラムやCPUで、前回の画面より1ドットだけ上下左右にズレた画像を構成する計算処理をしなくて良いわけだからw

まぁ最近は、ゲーム機だけでなく、パソコンやスマホのグラフィック・チップにも普通に高速に画面をスクロールさせるための機能は備わっているだろう。
なので今のゲームプログラマは、そんな処理を一生懸命考える必要はないと思う。
楽になったもんんだ。

つまり何が言いたいかというと、Windowsが世に初めて登場した95の時代とか、動画なんて今より解像度の低い640×400ドットぐらいの画面の、更にそれより小さい画面内でしか動かす事ができなかったのに、その倍以上に増えた今のパソコンの解像度で、画面全体を、フルカラーで動かしてもスムーズに動画が再生できるのは、プログラマが優秀になったわけでも、プログラムの技術が向上したわけでもなく、単にハードウェアの性能が飛躍的に上がっただけって事。
むしろプログラマの腕は、昔に比べてレベルが低くなっているのが現状って事を言いたいのだ。

まぁだからこそ、低予算・短期間で次々と新作の紙芝居ガチャゲーが出せるわけだけどねw


AIについて そもそもコンピュータとは何か?

AIというのはコンピュータの使い方の進化形とも言える。

ではそもそもコンピュータとは何か?

コンピュータは大規模な「計算機」であると言われる。
しかし単に数字の計算をするだけなら、電卓でも良いわけだ。
電卓とコンピュータの一番の違い、それは「データ」の存在だ。

電卓というのは、人間がその時に入力した数字の計算しかしない。
入力された数字や計算結果は、次の計算をする際には綺麗さっぱり消してしまうからだ。

しかしコンピュータというのは、メモリやHDDなどの記憶装置を持つため、入力された数字や計算結果を「記憶」しておける。
これが「データ」の正体であり、電卓とコンピュータの一番の違いだ。

私はかつて、コンピュータを使った企業のシステムの構築に携わる仕事をしていた。
そこで感じたのは、コンピュータシステムの中核には必ず「データベース」があるということ。
「データベース」というのは、文字通りデータを管理・運用するコンピュータのアプリケーションやシステムだ。
企業内部の売り上げ管理や、従業員名簿もそうだし、店舗を持ってるような会社だと店から毎日送られてくる売り上げデータなんかも、この「データベース」に収められる。
「データベース」は単にデータを大量に貯められるだけではない。
その大量のデータを分析したり、任意の条件に当てはまるものを素早く探し出したりできるし、そういう使い方をしてこそ「データベース」は生きるし、コンピュータシステムはその真価を発揮するのだ。

「データベース」は法人運営だけでなく、ゲームの運営でも使う。
ネットゲームのサーバの中心は「データベース」だ。
ユーザーのIDやパスワードはもちろん、キャラクターのステータスや所持品など全て「データベース」に保管されている。
これがダメになってしまうと、ネットゲームはサービスを継続できない。
クライアントとのやり取りや、敵との戦闘を処理する計算プログラムなんぞ、不具合とかハッカーの進入によって消えてしまっても、すぐに復旧できる(きちんとバックアップがある事が前提だが)。
しかし「データベース」を消されてしまったら、完全に元の状態に戻すのは不可能だ。
最新のバックアップを取っていた時点までしか戻らない。
ネットゲームで「巻き戻り」というのが良くあったが、それがこのゲームの実際の処理がトンでも完全にその時点の状態を復旧できるが、データがトンだらその時点での状態を復旧するのは不可能という証拠だろう。

さて、コンピュータというのは「データ」を扱える事こそが、その最大の特徴であるのは分かって頂けたと思う。
ではAIとは何か?
AIと言えば「人工知能」と訳されるので、人間の思考そのもをコンピュータで再現して、人間と同じ動きをしたり会話をしたり、あるいは日本人的な考え方だが、「心」を持ったロボットを作るのに必須なものだと思われている。
しかしメディアが必死にAIはすごい進歩したとか、AIに仕事を奪われるとか騒いでいる今のAIは、「人工知能」にはまだほど遠い。
今のAIというのは、今までのコンピュータプログラムが一歩だけ進化した状態にすぎない。

今までのプログラムというのは、プログラムされた通りの動きしかできなかった。
例えば今までの工業ロボットは、プログラムされた以外の事を自分で判断して動きを変えるなどができない。
なので、例えば食品を作るようなロボットだと、その日の気温や湿度などによって、煮たり焼いたりする時間や火加減を微妙に調節しなければならないのに、プログラムにそういう処理が無ければできないのだ。
これがAI搭載ロボットになると、気温や湿度のセンサーが搭載されていればの話だが、特に人間が「気温や湿度によって、適切な火加減や時間を調整しなさい」とプログラムしておかなくても、勝手に自分で学習して、最適な火加減や時間で商品を作ってくれるといった具合だ。
人間が「自分で判断」するのと同じ事が出来るようになったので、AIに仕事を奪われる、AIが反乱したら人類は滅ぶなんて事まで言われるのだ。

しかしながら、確かに「人間の知能」の模倣に成功はしたが、それはほんの一部でしかない。
そもそも人間は、コンピュータより遥かに膨大なデータを、遥かに高速に処理して生きているのだ。
人間は生まれてから今まで、見たり聞いたり嗅いだり味わったり触れたりしたもの全てを実は記憶していると言われている。
そしてその膨大な「データ」を今のAIより遥かに高度に高速に計算処理した結果が、様々な言動に繋がっているのだ。
「女の勘」というのがあるが、あれは別に超能力とかでなく、蓄積された膨大なデータから高速で答えを導き出しているにすぎない。
相手のわずかな普段の言動との違いを見分けて、「うそをついてる」とか「浮気してる」とか、今のAIでも適わない膨大なデータの計算処理の結果を出したにすぎないのだ。

AIは確かに進歩したが、まだまだ「人工知能」と呼ぶには程遠い。
そもそも、人間自体が自分自身の事を完璧に分かっていないのに、人間の「脳」のようなものが作れるのかって話もある。
AIは自分で新たな「データ」を作ったりする事はできない。
人間が提示したデータを、人間より遥かに沢山の量を遥かに高速に分析したり計算して結果を導き出す事ができるにすぎないのだ。
新しい発見や発明は、人間にしかできないのだ。
もちろん、既存のデータから人間がまだ発見したり発明したりできていないものを、人間より早く「気づく」事は可能だ。
しかしそれらは、あくまで人間が積み重ねて記録してきた「データ」があってこそなのだ。
難病の原因や新たな治療法や、あるいはいまだ人類には不可能な技術である「ワープ」や「タイムマシン」の理論なども、もしかしたら人間より早く発見・構築するかもしれない。
しかしそれは、それを可能とする、人間が入力した「論文」や「実験結果」などのデータがあってこそだ。
まったく関係のない論文や実験結果の組み合わせで、新たな発見や理論の完成をAIがしたとしても、それはいずれ人間も行えたという事で、単に気付いていなかったに過ぎない。

AIはパズルのピースが揃っていれば、人間より早く完成させる事ができるが、ピースが足りなければ完成できないのだ。
人間のように、「あれ?どっかで落としたかな?」って探したり、あるいは「もういいや、自分で作っちまおう」って事はしないし、出来ないのだ。
これが今のAIの限界である。

AI同士が謎の言語で会話をし始めて、恐ろしさを感じた技術者が停止してしまったなどと言う話もある。
それも人間が本気で最も簡単で効率的な「言語」というものを開発しようとしたら、100年かかるか1000年かかるか、あるいは1万年ぐらいかかるかも知れないが、そのAIが使っていた超高度で効率的な「言語」を作り出せたであろうという事だ。

AIは「高性能な人間」にはなれるかも知れないが、人間を超えた存在、「神」にはなれない。
AIによって人類が滅びるというはあり得ないと言い切れる根拠は、これなのだ。
AIによって人間の仕事は全て無くなるというのもあり得ない。

今年のノーベル賞受賞者も言ってるように、メディアを簡単に信じない事だw

今の3Dは本当の3Dではない

いまやゲームは3Dが当たり前だ。
しかし現在の3Dは、本当の意味での3次元グラフィックではない。

安い3Dツールとか見れば分かるが、髪の毛や手や足が、衣服を突き抜ける事がよく見られるが、それが証拠なのだ。

現実世界では、モノが突き抜ける事はない。
なぜなら、「物質」だからだ。
密度を持つ物体だからだ。

コンピュータの3Dには「密度」が無い。
現代の3Dグラフィクスは、それこそ実写並みの見た目にはなったが、「ポリゴン」と呼ばれるカクカクした所期の3Dと、根本的に仕組みは変わっていない。
ワイヤーフレームと呼ばれる骨格をつくり、その柱と柱の間に壁を入れるように、「テクスチャ」と呼ばれる「壁」を貼り付けているだけだ。
だから突き抜けるし、爆発などモノが壊れる表現をさせると、ペラッペラの破片が飛ぶ表現しかできないのだ。

では本当の意味での3Dとは何か?

現実世界の物質というのは、原子と、異なる原子が結びついてできた分子で構成されている。
3D動画では突き抜けてしまう髪の毛も肉体も服も、すべて「原子」や「分子」の集まりだ。

原子同士はぶつかってもすり抜けたりしない。
止まるか、跳ね返るか、あるいは方向を変えるかするしかない。

物質には3つの状態がある。
小学校の理科で習うので、みな知っていると思うが、液体・固体・気体の三種類だ。
通常、「モノ」と言ったら「固体」である。
「固体」というのは原子や分子の結びつきが非常に強く、そして隙間が無い状態だ。
よって固体同士がぶつかれば、どちらかが破壊される=原子や分子の結びつきが解除されて離れて隙間ができなければ、通り抜けることはできない。
「液体」の場合、原子や分子の結びつきは緩やかで、隙間ができやすい状態。
水に手を突っ込む事ができるのは、手が入ってきた場所にもともとあった水の分子が、お隣さん達との結びつきを一時的に解除して、「手」という固体が入り込める隙間を作るように「移動」するためだ。
そして、手が居なくなったら、また元の場所にもどって水の分子同士が手をつなぐ感じ?
「気体」は液体よりさらに原子や分子が自由な状態で、お隣と手を繋いでないし、隙間も多く広いし、そして障害物によって移動し、その障害物が居なくなってもとの場所に帰れるようになっても、必ずしも帰らない。

これらの状態を、コンピュータで再現できないと、真の3Dにはならないのだ。
少なくとも「固体」の概念が再現できなければ、髪の毛や手足が衣服を突き抜ける不自然な状態は無くならない。

従って、骨組みを作って、その骨と骨の間に紙を貼り付けるみたいな、いわゆる「張り子」方式を止めるしかない。
原子あるいは分子単位で、積み重ねていってひとつの絵を作るようにしなければならない。
マインクラフトとかドット絵とか、そういう方式だろうか。
レゴブロックで何かを作るのも、それに近いだろう。

原子あるいは分子、あるいは3D画像における最小単位の「固体」を何か考える。
そしてその「最小単位」の「固体」に、周りの「固体」との結びつきの強さや隙間の大きさを設定。

つまり
・「固体」の最小単位を決定
・最小単位の「固体」にそれぞれ「結びつきの強さ」「隙間」というデータを持たせる。
・衝突判定を「結びつきの強さ」「隙間」の計算で行う

これによって、本当の意味での3Dができるというわけだ。
当然、今より遥かに多くの計算処理が必要となるので、相当高い計算処理能力を持ったCPUやGPUが必要になるし、データ量も遥かに増えるので、今より高速で大容量のメモリなども必要となる。
つまり今のCPUやGPUやメモリでは「無理」って事でもあるw
プログラム的にも無理だ。
なぜなら、今の3Dグラフィクスの処理プログラムは、「張り子」というニセの三次元のためのものだからだ。
根本的に計算方法が違うわけだ。

ただまったく無駄というわけではない。
3Dの画像を作る計算処理の中で、光がどの方向からどのぐらいの強さで当たっていて、それによって物体の陰影がどのようになるかの計算などは、そのまま真の3Dになっても使えるだろう。

より骨組みの細かい「張り子」を再現する研究開発も結構だが、そろそろ真の3Dとも言える、リアル世界の原子・分子を再現する方法も、もっと行った方が良いと思う。

将棋とプログラム

中学3年生にして、現在19連勝中の藤井4段が最近話題になります。
私もかつて小学生の頃、将棋にはまった事があります。

将棋入門書などにも書かれていますが、将棋が強くなるコツは3手先を読んで指す事です。
プロ棋士などは、3手どころか数十手以上先まで考えて指すようです。
うちの実家は毎日新聞をずっと取っているので、「名人戦」(スポンサーが毎日新聞のため)の様子が誰がどういう手を指したか、その日の終了時の盤の様子などがずっと載っていました。
投了(相手が負けを認めた試合終了の場面)図を見ると、素人にはさっぱりどうしてこれで負けが分かるのか、勝ちが確定したのかという場面で終わっています。
これは、プロ棋士が数十手先まで読める事の一番の証拠です。

さて、この先を読むという思考ですが、これがプログラムに非常に重要な要素です。
プログラムとは、与えられたデータを求められるものに計算処理して変換する事であると言えます。
そのために、何をどうしたら求める結果になるのかを考えなければなりません。
これこそがまさに将棋の、先を読む思考と同じなのです。
将棋もプログラムも、リアルの人生のように無限に可能性があるわけではなく、有限です。
従って、先を読む事ができるのです。
もちろん、将棋の場合は第一手から最後までの指し手はほぼ無限とも言えますが、誰がどう見ても「悪手」というのがあるように、相手がどう指してくるかは、ある程度限定できるのです。
ましてやコンピュータプログラムは、命令の数も動作も限定しており、人間のようにイレギュラーな動作をする事はありません。
なので将棋よりも先を読む、自分の望む結果へ導くのははるかに簡単です。

棋士に開発言語を学ばせたら、仕事の速い優秀なプログラマになれると思います。

「これをこうしたらこうなるから、次こうして・・・」という順序立てた理論的な思考、それが将棋とプログラムに共通するものだということです。

現在プログラマを生業としている人、あるいは将来プログラマになりたいと思ってる人は、開発言語のコマンドを覚えるより、将棋を覚えて強くなるための勉強をした方が、はるかに役に立ちますよってアドバイスです。
もちろん、開発言語の文法や仕様やコマンドはある程度知っている必要はありますが、それよりも重要なのはプログラムの組み立て方だからです。
より速く(効率的に)、より少ない作業メモリで処理できる方法を編み出すのには必要不可欠な能力なのです。

ちなみに天才棋士として名高い羽生さんは、「勘」で指すなどと言われますが、「勘」というのは実は超能力的なものではなく、経験によって得たデータを元に、高速で最善の方法を導き出す能力の事です。
これは、CPUでも分岐予測という形で機能として実装されています。
すなわち今までの処理の傾向から、IF ~ THEN ~ の結果を予測して、分岐処理の実行前に可能性の高い分岐先の処理を実行するものです。
これまさしく、人間の「勘」と同じものです。
全ての可能性を考えるのではなく、今までの経験から一番あり得そうな可能性のみに絞って結果を考え、それに対応する。
こうすることで、無駄な選択肢を考える時間が省かれるので、高速で物事に対応できるのです。
それがあたかも未来を見通すような、超能力に写るだけの話なのです。
そしてそれは、同じような場面に何度も出くわして、経験を積み重ねないとできないのです。
統計学に通じると思いますが、サンプルが多ければ多いほど、正確な確率が出るのと同じでしょう。

将棋もプログラムも、このように先を読む思考と、いくつもの対局あるいはプログラムの作成という経験により、より速くより効率的な手が打てる、プログラムが作れるようになります。
カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR