アーキテクチャ

[編集]

コンピュータシステムの論理的構造のこと。難しい言葉だが「つくられかた」と思っていい。「アーキテクチャが異なる」とは「つくられかたが異なる」と読み替えられる。

"管理や構築を複雑なツールに頼るシステムはエンドユーザにとって害になるだろう。
「複雑なシステムを隠そうとすれば、その結局もっと複雑なシステムになってしまうのが落ちだ」。
中身を隠すための抽象化レイヤーは決して良いものではない。その代わりに、隠さないで済むように中身を設計すべきなのだ。"

アーロン・グリフィン

↑コレ好き、名言。

メモリ

[編集]

メモリとは覚えた数を忘れないように、その数だけ電子の石を置いてメモっておけるシステム。メモる=覚えておく=忘れない=メモリー。1+3+6の計算をするとき、まず1+3の計算結果を忘れないように4個の石をキャンバスに置いておく。次にその4個の石の横に6個の石を置くことで、全部合わせて10個であることが見て取れる。メモリはそんな便利な「キャンバスと石」の仕組みを電気信号で再現したもの。紙と鉛筆なんかよりずっとずっと原始的。

8ビット

[編集]

ビットというのはメモリの大きさを表す。たとえば8bitのメモリ空間というのは、8個の石をおけるキャンバスの大きさをあらわす。8個の石がおけるキャンバスって最大8までしか数えることができないように思うけど、工夫すれば256までの数字を表現することが出来る。たとえば3個しか石が置けない3bitのキャンバスを例に取ると下のように0~7の8種類のパターンを作ることができるので、3つの石があれば最大7まで記録することができる。同様の方法で石8個で256パターン、9個アレば512パターン、16個あれば65536パターン作ることができる。

xxx ・・・0
xxo ・・・1
xox ・・・2
xoo ・・・3
oxx ・・・4
oxo ・・・5
oox ・・・6
ooo ・・・7

(xは何もなし、oは石、1ビット=1つの石と思えばいい)

バイト

[編集]

1バイトというのは8bitのこと。12個のチョコで1ダースみたいにいうと8つのビットで1バイト。1バイトあれば256パターンを再現することができる。何しろ石が8個もあるからね。256パターンあれば表現できるものって何があるか?アルファベットは26個なので余裕。さらに大文字小文字に対応して、加えて記号をいれても256種類におさまりそう。

xxxxxxxo・・・1・・・A
xxxxxxoo・・・2・・・B
xxxxxoox・・・3・・・C

こんな感じで「数(8bitで表現した石のパターン)」と英文字を関連付ければ文が書けるかもしれない。8バイト(64ビット)あれば8文字の手紙が書けそう。そうやって作られたのがASCII文字(アスキー文字)で「半角文字」って言われている。全角文字は漢字も含んで256パターンに収まらないから1文字16bit(2バイト)で扱われていて、理論上65536種類の漢字まで対応できる。

スクリプト / プログラム 違い

[編集]

明確な違いはないし、プログラムが書かれたファイルは「C言語スクリプト」という言い方もできる。「C言語でプログラムが書かれたスクリプト」である。コンパイルするからプログラム、インタープリターだからスクリプトという見方もあるようだ。

プログラム / プログラマ 違い

[編集]

これは違う、説明は不要だと思うが、運動会や発表会の1日の予定や順番、雨の場合の対処法が記されているのがプログラム。プログラマがCPUへの手順や例外の対処法を羅列してるのもプログラム。プログラムを書く人がプログラマ。運動会のプログラムを書く人は先生だな。

機械(マシン)語 / アセンブラ

[編集]

C言語とアセンブラと機械語は全く違う。機械語は16進数で書かれた数字だけの暗号ファイルみたいなもので、コンピューターが理解することができる言葉。とはいえヒトも理解できる一定の法則によって成り立っている。なにしろ機械語はヒトが作った言葉だからね。CPUにより言語体系は異なる。たとえばインテル系のCPUの機械語とARM系CPUの機械語は英語とロシア語くらい違う。どちらも数字だけで構成されたいわゆる「バイナリ」なので同じように見えるが、それは日本語以外は全て外国語っていうくらい乱暴なわけかたになる。CPUの受け付ける命令の数や種類を文化とすると、数字の並び方の法則性は文化の違いにより全く異なる。

アッセンブル

[編集]

81-01-80-42みたいな全てが16進数の数字だと見た目にわからないから、数字の一部をADD 00 SUB 42みたいに意味のある言葉に置き換えたものがアセンブラ言語(アセンブリ言語)。当然CPU文化に応じてアセンブリ言語の体型は大きく異る。下図のようにアセンブラはオペランド(OPE)と(DATA)の組み合わせでCPUに命令を与える、これをマシン語に変換する作業が「アッセンブル」という。

アセンブラ(OPE)(DATA)マシン語
PUSHBP55
MOVBP,SP8B EC
SUBSP,483 EC 04
LEAAX,[BP-2]8D 46 FE
PUSHAX50
MOVAX,Z4B8 00 00
PUSHAX50

このように命令とマシン語は1対1なので、できあがったマシン語のバイナリデータからアセンブリ言語に変換することも可能である。これを「逆アセンブル」する、といって出来上がった実行ファイルから元のプログラムを割り出すハッキング行為である。

C言語

[編集]

コンピューターにやらせたいことは同じなのにCPU毎に別のプログラムスクリプトを描くのはナンセンスである。異なるCPUやハードウェア間でも同じプログラム・スクリプトを使えるように言語体系やできることを統一(規格化)したのがC言語となる。

C言語はそれだけでなく、より人間の言葉に近い考え方や、記述方法でプログラムをかけるので複雑でもわかりやすいプログラムを書くことができる。そのC言語で書かれたプログラムを自動的にCPUに応じたアセンブリ言語やマシン語に翻訳してくれるのがCコンパイラ。人間語を機械語に翻訳してくれる「アプリ」である。

インタープリター / コンパイル

[編集]

人間が読めるC言語で書かれたプログラムスクリプトを機械が読める「機械語」に翻訳することを「コンパイル」するという。プログラムスクリプトの実行には、最初に全てのプログラムを翻訳してしまう「コンパイル方式」と、都度翻訳しながら実行する「インタープリター式」の2種がある。翻訳済み文書と、同時翻訳の違いのようなもの。前者は先に間違いをすべて直さないと実行できない。後者は間違いがあっても実行できるが、その間違いは、プログラムがその箇所を通るまできづけない。

C言語はコンパイラ言語、PHPはインタープリター形式の言語である。

一般的に事前に翻訳されたコンパイル方式のほうが、その場で同時通訳されるインタープリター方式よりも高速に動作する。

統合開発環境

[編集]

プログラムを組もうと思っても、プログラムを実行ファイルにするまでにはいろんなツールの力を借りる必要がある。例えばプログラムを書くメモ帳などのエディタや、コンパイラや、機械語に直されたファイルをくっつけてくれるリンカー、リンクされたプログラムを実行してデバッグするデバッガなどがそのツールの1つ。

それらのツールは本来別々のツールなので設定を各々してあげなくてはならないのだけど、それらを1つのソフトの中で全部設定してシームレスに使用できたらとても便利である。プログラムを書くエディタから直接コンパイルして、実行して、ターゲットマシンに転送しデバッグまでさせてくれる環境を1つにまとめて出来るようになっているの統合開発環境(IDE)である。WIN用のVisualStudioやmac用のXCodeはその代表で、最近だとAndroid-Studioというのも出てきた。で、これらの統合開発環境の状態を保存しておくことで、次回開発を再開するときに最後に開いていたプログラムや、ターゲットマシン、デバッガの設定などを起動後すぐに復元することができて便利。

最近ではUnityやUnrealEngineなどといったゲーム開発そのものと密接な機能をもつ統合開発環境は、IDEの発展版といえる。

プロジェクトファイル

[編集]

統合開発環境の保存ファイルは、windowsだと「*.vcproj」macだと「*.xcodeproj」という拡張子のファイルで、これがプロジェクトファイルだと思っていればいいかもしれない。まあグラフィックで言うところ個々のレイヤー情報をまとめて持っているPSDファイルみたいなもの。

ソリューション

[編集]

製品に含まれる複数のプロジェクトを管理しているのがソリューション。簡単に言うとパックマンのソリューションには、ファミコン用のプロジェクト、プレイステーション用のプロジェクト、XBOX360用のプロジェクトが含まれている、みたいなイメージ。

エディット&コンティニュー

[編集]

この便利さは神がかっている。プログラムを途中で止めて、ソースを変更して、続きから実行できる。メニューを構築したりするのに、なんどもソース中の座標を変更してリコンパイル、とかしなくていいし、ゲームのバランス調整にも実に便利。VisualStudio系以外では見たことがない。

VC2015ではなぜか1コンパイルに付き1度しかエディットできるチャンスがない。なんか設定ミスってるのかな、と思ったが制限がかかっているらしい。

https://www.infoq.com/jp/news/2015/08/enc-vs2015

ポインター

[編集]

簡単に言うと変数へのショートカット。特定の変数に値を代入する時に、その場所にない(別の場所にいてる)変数へのショートカットを作ると便利。このショートカットがポインター。変数へのショートカットといったが本当は変数の値が格納されているメモリへのショートカット。ショートカット自体はメモリのどこだったか、そのメモリのアドレスを記録している。だから、ショートカットに記録されているアドレスに値を入れれば変数の中身が変わる。

アドレスには数字データやテキストが所狭しとぎゅぎゅうに並べられている。そこに型をはめることでその型にあう変数やテキストが区分けされる。型を間違えるとおかしな区分けになる。だからポインタは何型のポインタだったかを覚えておく必要がある。違う型に無理やりはめ込むことを「型キャスト」という。

AAA BBB CCCC型
012 345 6789

A B CCCCCCCC型
0 1 23456789   ←データの中身は同じだが型により切り分け方が異なる

ボイドポインター

[編集]

ボイド(void)とは何もないことを指す。ポインタはアドレスを示すショートカット。それらが組み合わさってボイドポインター。通常ポインタにはそのマーカーが何を指しているかを示しておかないと、その先何バイトがそのマーカーのさす範囲なのか明確にできないので、「~型のポインタ」という形で扱うのが普通。A型のメモリ領域をB型で指し示すことはできない。しかしボイドポインタは明確な型を持たない分、A型でもB型でもなんでも型として受け入れられる。しかしボイドポインターに代入して、deleteした場合、明確な型がわからないので、デストラクタが呼ばれなくて困る。

メモリとCPU

[編集]

CPUは車の速さ、メモリは車の荷台。荷台の大きさが1、速さ5の車で、10個の荷物を運ぶと50のコストがかかる。荷台の大きさが5、速さ5なら10のコストで運び終わる。

荷台の大きさが10あれば、5のコストで運び終わるが、さらに大きく荷台の大きさを20にしても5のコストは絶対かかるので、これ以上荷台を大きくしてもメモリを増やしても)意味は無い。

そもそも10個の荷物じゃなくて20の大きさの荷物を5の速度の車で運ぼうと思うと、荷台に載り切らない。この場合は大きなトラックを呼んできて20の大きさの荷物を積んでもらう必要があるが、トラックを呼んでくる分遅くなる。HDDスワップっていうのは、メモリに載り切らないデータを一時的にHDDに読み込んで無理やり処理することができるのだけれども、HDDを呼び出す分遅くなる。そもそも、HDDはメモリに比べて圧倒的に遅い。

C++11

[編集]

いまのC++の標準ですって。boostとかstdとかstlとか複雑になって取り残された僕にはJavaでもなくC#でもなくもう一度あの時愛したC言語に戻るチャンスかもしれないと思ってみてみたら、しばらく見ないうちに「髪型変わった?」っていうレベルじゃなかった、別人じゃん。C++2とかC++8とかがあるわけじゃなくて、2011年に久しぶりに策定されたCの標準化らしい。ANSIとかで定義されてたCの標準化の2011年版だと思えばいい。2014年版のC++14もあるけど、もうそっ閉じ。

ラムダ式

[編集]

C++11から追加された新仕様。

void onConnectedController(Controller* controller, Event* event)

  ↓

controllerListener->onConnectedController = [&](Controller* controller, Event* event)
{
};

見慣れたソースから書き直すとこんな感じ。コールバック関数の挙動をひとまとめにかけるのが便利なんですって。関数の中に関数を書くとか、初見で意味がわからないが、関数内にテーブルを定義するのに近いと強引に思い込んで関数の最後はセミコロンで閉じよう「{ ~ };」

レキシカルスコープ

[編集]

関数の中に関数を書いたりするアレ。

test()
{
 test2(){
 };

 test2();
}

微分 / 積分

[編集]

微分、積分、サインコサインタンジェント、数学は色々難しいし、なんの役に立つのかわからない。微分の計算がわからなくとも概念は知っておこう。1フレームに2.8ドット移動するキャラを考えると、1秒間に2.8x60=168ドットの距離を移動することになる。この時1/60秒単位にスライスしているのは、秒間あたりの移動速度に微分していると言えるし、秒間あたりの移動距離は積分しているといえる。

外積 / 内積

[編集]

外積、内積とは「2つの線と線の平行具合」である。内積の場合、線と線の関係が平行に近いほど0になり、垂直に近いほど1に近づく。外積の場合はその逆で「直交具合」と言える。

レースゲームなら車が壁にぶつかった時の車体のベクトル(線1)と壁のベクトル(線2)で内積をとって1に近いほど速度を落とす。1っていうことは壁に真正面からぶつかったことになるし、ゼロだとほぼ平行にあたって「擦っただけ」といえる。ちなみに英語では、外積とはcross Product、内積とはdot Productという。自分で外積、内積を取るプログラムもシンプルなので使っているうちに覚えられる。

typedef struct Vector2D
{
 Float32 x;
 Float32 y;
} Vector2D;


//ベクトル内積
Float32 DotProduct(Vector2D *vecL, Vector2D *vecR) {
 return vecL->x * vecR->x + vecL->y * vecR->y;
}

//ベクトル外積
Float32 CrossProduct(Vector2D *vecL, Vector2D *vecR) {
 return vecL->x * vecR->y - vecL->y * vecR->x;
}

内積は2つのベクトルのなす角度を求めることができるし、平面上に点があるかどうかも判定可能。外積はポリゴンの向き(法線ベクトル)や平面上の三角形と点の内外判定に利用できる。

フレーム

[編集]

一般的に1/60秒の時間を表す。テレビは1秒間に60枚のパラパラ漫画を再生することで動いているのはご承知の通り。秒間に60枚ということは1コマ1/60秒(約0.016秒)なので、見えないほど速い時間ではない。ゲームではキャラクタの動きを1/60秒毎にスライスしてプログラムされている。

グラフィック関連

クランプ、アドレッシングモード

[編集]

スプライト表示の際、テクスチャの範囲外を指定してしまった時に、範囲外の表示をどのように表示するか、いくつかあるアドレッシングモードから選ぶことができる。

  • クランプ・・・端っこの色をひきずって表示する
  • ミラー(逆さに表示)
  • ラップ(ゼロに戻って表示)

アルファ・ブレンディング

[編集]

アルファとは半透明のこと。赤いセロファンと緑のセロファンを重ねて上から見れば黒っぽく見える。こんな感じで半透明を混ぜあわせるからアルファのブレンデイング。

0がスケスケ、100が不透明として、下地を50%の半透明度、上にかぶせるセロファンを50%の半透明みたいな感じで混ぜ合わせる。上にかぶせるセロファンの透明度が100%の場合、下の色は全く見えない。
計算としては、例えばRGBのr成分が100の時、上にかぶせる赤色(100)を50%で混ぜあわせると
100*0.5 + 100*0.5 = 100 となる。

ブレンドファンクション

[編集]

ブレンドの仕方もいろいろある。ただ下の色と上の色を組み合わせる場合だと上の色を70%とした場合に下の色を30%とすることで合わせて100%の普通のブレンディングとなる。
しかし、70%の下地に対して、70%の色を加算合成すると、140%になる。現実的に100%以上の色にはならないので全部が白くなっていく。

ワイルドカード

[編集]

よくファイル名で使われる「*.bmp」とかいう謎の記号が出てくるが、この米マークは知っての通り「アスタリスク」という。ファイル名に使われるアスタリスクは「ワイルドカード」と言って、「???」を表す。よくわからないだろうが「???.bmp」と考えればいい。bmpの拡張子を持ったファイル全てを表す。検索するときに便利。a*.bmpをすれば、頭がaで始まるbmpファイルを指定できる

OpenCV

[編集]

ビデオカメラに関する汎用プログラミングライブラリ。

grep

[編集]

演算 / 計算 違い

[編集]

計算・・・計ったり数えたりすること
演算・・・法則にそって計算すること

演算は計算に含まれる。プログラマが決めた法則によって計算されるプログラムは全て演算。

パーサー

[編集]

XMLのパーサーとかJSONのパーサーという風に使う。難しく言うと構文解析器。構造をもったテキストのカッコとかを解釈してデータを取り出すためのプログラム。XMLデータはXMLパーサーを使わないと(作らないと)中のデータを正しく取り出せない。なぜならXMLというフォーマットはテキストエディタで見るとデータを区別するために色んなカッコで括られているからだ。そいつらを構文解析してデータだけ抜き出す(パースする)必要があるのだが、色々めんどくさい。

文字の扱い

[編集]
シングルバイト1バイト固定   ASCII文字char*
ダブルバイト 2バイト固定   Shift-JIS(漢字部位)char*
マルチバイト 1~nバイトの可変 Shift-JISchar*
ワイド文字  ユニコード UTF-8とかwchar_t*

WindowsAPIの変換関数

MultiByteToWideCharShift-JIS > UTF-8char* > wchar_t*
WideCharToMultiByteUTF-8 > Shift-JISwchar_t > char*

古い標準関数はマルチバイトにしか対応しておらず、新しい関数はワイド文字が標準化してきている。
つまり、Shift-JISからUTF-8へ標準が移ってきているので、UTF-8に対応しきれていないC標準関数などが必然的に廃れていく。

JIT

[編集]

一般的には機械語への翻訳方式の1つ。インタープリターやコンパイルに対しての方式の名前で実行直前に機械語翻訳する方式。Just - In - Timeの略。インタープリターと違うところはアプリ実行中に実行行に来てはじめて機械語に翻訳するのではなく、アプリ起動直前に全てを翻訳するところ。C言語の起動するべきアプリそのものを機械語翻訳(コンパイル)してアプリを生成する。

DCCツール

[編集]

Degital Content Creation ツールの略。PhotoShopとかMayaのこと。デジタルコンテンツを作り出すツールの総称&略称。

ビヘイビア

[編集]

Unityなんかでよく使われる言葉。「挙動」「動作」を表す言葉。
「Death Behavior=死んだ時の挙動」といったニュアンスで使われる。

ポリゴン / モデル / メッシュ / 3D

[編集]

3Dゲームで使われているキャラクターを指して
「このポリゴンすげえ」っていう一般人とか「このモデルよく出来てるね」っていうグラフィッカーとか、「このメッシュ何ポリゴンなのかな」っていうプログラマと、「この3Dええな」っていう営業がいる。同じような意味だけど、それぞれ違う。

3D / ポリゴン

[編集]

ポリゴンとは多角形。三角形ポリゴンとか四角形ポリゴンがある。線がつながって最後に閉じていない折れ線状態のものはポリラインという。

ポリゴンを形成する頂点を2Dなら平面上で回転させることができ、3Dなら立体的に回転をさせることができる。2Dならサイン、コサインの三角関数で2次元空間内のみの計算でことたりるが、3Dで計算するには行列をつかった3次元空間での計算が必要になる。

つまり、ポリゴンとは多角形を表す形、3Dとは多角形の存在する空間をあらわすといえる。日本語で言うと「この3次元空間ええな」っていう営業はなんかかっこいいし、「この多角形すげえ」っていう一般人はよくわからないがなんか逆に凄いマニアックさを感じる。

モデル / メッシュ

[編集]

モデルとは3Dで形成された造形の総称。ボーンが入ってようが、テクスチャがついてようがついてなかろうが、なんでも「モデル」。このモデルをつくることをモデリング。一般的にメッシュは、テクスチャやボーンのない点、線、面の集合で形成された3Dモデル。しかしボーンが入ってない動かないモデルをさしてスタティック・メッシュという言い方もするので定義はあやふや。しかし動かないモデルをスタティックモデルとは言わない。

テクスチャやボーンやマテリアルやら入れた完成品が3Dモデル。そこから出力された「形」のみのデータがメッシュっていうイメージ。

プリミティブ

[編集]

最小単位

オブジェクト

[編集]

「モノ」のこと。3Dモデルにも使われるし、C言語プログラムの中間状態もオブジェクト、モノを表す言葉はなんでもオブジェクトである。誰なのよオブジェクトなんて抽象的な種類名をつけたのは。

3Dにおけるオブジェクトはしばしばメッシュと混同されるが

「オブジェクトは3Dモデルの位置・回転・大きさを定義し、
メッシュは3Dモデルの頂点・辺・面を定義するもの」

ということらしい

スプライト

[編集]

英語的には「妖精」のこと。画面内を飛び回るキャラクタをイメージして妖精呼ばわりされる。昔はハードウェアでキャラクタを描く機能が別にあったため、背景はBG機能、キャラクタはスプライト機能で描く的な表現がされておりハードによってスプライトの表示枚数の限界値が異っていたが、今はスプライトをハードでもつ必要はなくポリゴンとテクスチャで代用されるため機能としては搭載されていないが、画面を飛び回る2Dキャラクタを表現するポリゴンを指してスプライトという言い方だけが生きている

テクスチャ

[編集]

英語的には「生地」、プラモデルのデカール的な存在でポリゴンに貼り付ける絵素材のこと。昔はスプライトとか画像とかBMPとかいろんな表現があったが、近年ではスプライトはポリゴンに貼り付けたテクスチャで代用されることから絵素材を総称して「テクスチャ」と呼ばれる

マテリアル

[編集]

英語的には「材質」。テクスチャ情報だけだと、どんなに金属っぽい絵を書いても3D空間に配置されたモデルは光の影響の受け方に応じた変化を表現できない。デカール的に貼り付けられるテクスチャだけではどんだけ鉄っぽい絵を書いても絨毯に鉄の絵を描くのと同じくらい鉄に見えないので、ポリゴンの材質が布なのか鉄なのか、具体的には光の反射率や環境光の色味をマテリアルに設定する。

具体的にはポリゴンに光があたった時の光の反射率が高ければ金属っぽく見えるし、光を吸収すればじゅうたんっぽくみえる。

サーフェース

[編集]

英語的には「表面」。ポリゴンにテクスチャを貼り付けてマテリアル情報を加えた状態の総称。

裏読み / ストリーミング読み込み

[編集]

NOW LOADINGなんかでゲームの進行をとめてステージを読み込むのとは対照的にゲームの動作中に、裏でデータを少しずつ読みこんでおきシームレスに次のステージにつなげたりすること。ストリーミング読み込みとも呼ばれる。
簡単な例ではオンデマンドの動画再生なんかは、全てをダウンロードしてから動画がみられるようになっているわけではなく、ストリーミング読み込みとなっていて、とりあえず最初にみられる5秒位の動画データをダウンロードして、それを見せてる間に5秒後以降のデータを順次読み込むことで、できるだけ待ち時間をなくしている。

オンデマンド

[編集]

ユーザーのリクエストを受け付けて初めて配信を開始する方式。youtubeなんかはそれの代表例。ではオンデマンドでないものとはなにか?時間枠にそって自動的に配信しているテレビ放送がそれにあたる。要はユーザーがテレビに合わせるのか、テレビがユーザーにあわせるのかの違い。

[編集]