【ゲーム開発のためのC#入門講座・基礎強化編】メモリのことを理解しよう【#1】

2022-01-093.0_C#基礎強化編

ようこそ、基礎強化編へ!

この基礎強化編では、基礎学習編・基礎拡張編で学習した内容をより深く理解するための知識や技術を学習していきます。なので、ちょっとうろ覚えなところがあったら基礎学習編・基礎拡張編の記事を見直していただければ理解しやすいと思います。

ここできちんと土台をしっかり構築しておくことで、応用編で学習予定のオブジェクト指向と向き合うための準備が完了します。基礎編としては最後のパートになりますので、応用編に向けて楽しく学習していきましょう!

というわけで初回はメモリのお話です。

コンピュータが扱うデータはすべて「0」と「1」

基礎学習編の第一回で少し触れましたが、コンピュータは「0」と「1」だけで構成された機械語と呼ばれる命令で動いています。プログラミング言語は人間にもわかりやすい文章や数式のような形式で記述できるようにしつつ、最終的にはその機械語に翻訳してくれる機能を持っているんでしたね。

その時は命令のことしか触れませんでしたが、実際にはコンピュータで扱うすべてのデータも「0」と「1」だけで構成されています。

どうやって「0」と「1」で表す?

例えばこれまで扱ってきた数値や文字列をどうやって「0」と「1」で表すねん、と思われるかと思いますが、ここで登場してくるのが二進数というやつです。

私達が普段使っている10増えたら1桁繰り上がるというものを十進数といいます。一方、二進数は2増えたら1桁繰り上がります

具体的な例を下記に示します。が、この二進数自体は無理に覚える必要はないので、そういうのがあるんだなってことだけご理解下さい。

十進数で表した場合二進数で表した場合
00
11
210
311
4100
5101
6110
7111
81000
91001
101010

十進数と二進数でそれぞれ表記は違いますが、同じものを表しています

つまり二進数を使えば、「0」と「1」だけで十進数における「4」や「10」といった数値を表すことができるんですね。変数で格納していた値も、内部的にはすべて二進数で管理されている訳です。

// ↓この4は、コンピュータの内部では「100」という二進数で扱われている
int result = 4;

文字も実は同じです。

この文字はこの二進数で表そう、という取り決めを文字コードといいます。

コンピュータの内部ではすべての文字は二進数で管理されていて、私達がメモ帳やウェブサイトで見る時には、その文字コードに従って変換されたものが表示されています。

文字二進数
a01100001
b01100010
c01100011
// ↓このabcは、コンピュータの内部では
//  「01100001 01100010 01100011」
//  という二進数で扱われている
string text = "abc";

ちなみに文字コードにはいくつか種類があります。扱える文字の範囲が違ったり(ヨーロッパでは漢字なんていらないけど、日本や中国では絶対必要ですもんね)、割り当てられた文字と二進数の組み合わせが違ったりします。

このせいで、文字コードAで作成・保存した文章を、文字コードBで変換・表示しようとすると、同じ二進数なのに異なる文字に変換されてしまい意味不明な文章の羅列になったりします。

これがいわゆる文字化けというやつの正体です。

あとMacでは「\」と表示されるのにWindowsでは「¥」で表示される事象、あれも同じ二進数だけど割り当てられた文字が違うせいで起きる現象です。

わりと厄介なやつです、文字コード。

いちおう今はすべての文字を扱えるUnicodeという文字コードもあります。ただ、すべての文字を割り当てている分、1文字のサイズが他の文字コードより大きかったりします。なので軽量化とかを考え出すと、必ずしも「みんな、面倒だからUnicodeだけ使おうや!」とは言えないところもあります。

なかなか罪深いやつです、文字コード。

二進数で管理されたデータを一時保存する場所が「メモリ」

プログラムやアプリケーションが動いている間、それこそ変数に格納されたデータなんかを保存しておく場所が必要ですよね。

データを保存するっていう意味だとハードディスクが思い浮かぶかもしれません。が、ハードディスクは大量のデータを読み書きする分にはよいのですが、その分処理が遅いという難点があります。

すべてのデータをハードディスクへの読み書きだけで管理しようとすると、ちょっとしたデータをやり取りするだけなのにコンピュータがいちいち止まる、なんてことになりかねません。できればハードディスクへの書き込みは「ファイルを保存する」などの重要なタイミングでのみ、という風にした方が効率はよさそうです。

そこで、一時的にしかデータを保存出来ないけど超高速で処理できるという優れものがコンピュータには用意されています。

それがメモリです。

メモリは「0」か「1」をひとつだけ格納できる記憶装置の集合体です。

例えば数値の4をメモリに格納しようとすると、二進数的には「100」になるので、記憶装置が3つ必要になる訳ですね。

この「0」か「1」をひとつだけ格納できる記憶装置は1bit(ビット)という単位で表します。この1bitを8個集めたものが1byte(バイト)、1byteを1024集めたものが1KB(キロバイト)、さらにそれを1024集めたものが1MB(メガバイト)、さらに1024集めたものが1GB(ギガバイト)です。

お、すごく聞き覚えのある単語まで辿り着きましたね!

そうです。皆さんがパソコンやスマホを買う時に気にする「データを入れておける容量」の単位である「~~GB(ギガバイト)」というのは、この1bitの超大量集合体だったんです。

そう考えると、8GBのメモリを持つコンピュータって凄まじい量のbitの集合体なんですよね。話題になったスパコン「富岳」なんてTB(テラバイト)のさらに先、「4.85 PiB」ですよ。単位の読み方すらわからないですが、とにかくやべえってことだけは伝わってきますね。

ちなみに1byteが8bitだったり、それ以降がすべて×1024だったり、何だか数字が中途半端なのも理由があります。それは、二進数的には8や1024の方がキリがいいからです。

十進数二進数
81000(すっきり!)
101010(キリが悪い)
10001111101000(キリが悪い)
102410000000000(すっきり!)

Unityでの活躍ポイント

なるほどなーとは思ったけどゲーム開発にメモリの知識とか必要なの? と思われるかもしれません。確かにゲーム開発に直接関わりはないのですが、結局そのゲーム開発を行うためのプログラミング言語を正しく扱うのには必要な知識となります。

この知識を持っておかないと、バグが発生してしまった時に「何で?」を解消できないままになってしまう可能性があるんですね(基礎拡張編の最終課題で最後お見せしたように)。

また、特にC#のように型を明示する必要のある言語、いわゆる静的型付け言語は、このメモリと深い関わり合いがあります。それをひとつひとつ理解していくと、より効率よく、より誤解のないプログラミングが行えるようになり、結果的にスムーズなゲーム開発に繋がります。

また、現代プログラミングの真髄でありゲーム開発でも必須といえる、オブジェクト指向を理解する上での基礎知識でもあります。Unityもまさにオブジェクト指向で作られています。

オブジェクト指向は非常に難解なことで有名です。数多のプログラミング初心者の心を折ってきました。この難敵を乗り越えるためにも、ぜひこの基礎強化編でレベル上げをして、しっかりアイテム(知識)も補充してから先に進むことにしましょう。

まとめ

  • コンピュータで扱うすべてのデータも「0」と「1」だけで構成されている
  • 「0」と「1」だけでデータを表せるのは二進数を使っているから
  • メモリはその「0」と「1」をひとつだけ格納できる記憶装置の集合体
  • 記憶装置の最小単位は1bit(ビット)で、それをさらに集めたものをbyte(バイト)、KB(キロバイト)、MB(メガバイト)、GB(ギガバイト)という単位で表している

今回は知識だけなので演習はありません。

基礎強化編は基本的に、このメモリという観点から、基礎学習編・基礎拡張編で学んできたことのより深い学習を行っていきます。

という訳で次回はC#が静的型付け言語である理由であり、int型やfloat型など色んな型がある理由を解き明かしていきます。お楽しみに!

それでは、今回もお疲れ様でした!

また次の記事でお会いしましょう!

お借りした素材一覧

この記事では下記サイト様の素材をお借りしています。

ありがとうございました!

かわいいフリー素材集 いらすとや (irasutoya.com)

Posted by 夕目紅