hsimyu's diary

ゲームなどをします。

12/25 ニート

趣味のコードを書いている以外は特に何もしてないです。

 

2017/12 3週目に調べたこと

IL2CPP (on Unity)

Intermediate Language to C++: 基本的にはインタプリター方式の言語をC++に変換してコンパイルということをやるために使う。
最近だとUnityで実行速度を出すために使われている [https://docs.unity3d.com/jp/530/Manual/IL2CPP.html]

Unity上での話
以下のアトリビュートにより、実行時チェックをON/OFFできる:

  • NullChecks: Null値へのアクセス時に NullReferenceException を投げる
    • デフォルト: ON
  • ArrayBoundsChecks: 配列外参照を行った時に IndexOutOfRangeException を投げる
    • デフォルト: ON
  • DivideByZeroChecks: ゼロ除算時に DivideByZeroException を投げる
    • デフォルト: OFF
    • 実行時コストが高い

実行時チェックは Il2CppSetOptions 属性を使用することで C# コードから有効、無効のどちらかに設定することができます。
この属性を使用するためにはまず Unity Editor をインストールしている場所を調べ、IL2CPP ディレクトリにある Il2CppSetOptionsAttribute.cs を見つけてください(Windows では Data\il2cpp に, OS X では Contents/Frameworks/il2cpp にあります)。このソースファイルをプロジェクトの Assets フォルダーにコピーしてください。
属性は以下のように使えます。

[Il2CppSetOption(Option.NullChecks, false)]
public static string MethodWithNullChecksDisabled()
{
    var tmp = new object();
    return tmp.ToString();
}

Il2CppSetOptions 属性は型、メソッド、プロパティーに適用できます。ほとんどローカルスコープとして属性は使用されます。

インクリメンタルビルド

IL2CPP スクリプティングバックエンドの生成した C++ コードはソースファイルが変更された場合にのみ C++ のインクリメンタルビルドシステムにコンパイルさせることで増分させた更新が可能です。IL2CPP スクリプティングバックエンドを使用している場合繰り返し行うビルドの手間をかなり抑えられるでしょう。IL2CPP を使用したインクリメンタルビルドは現在 iOS でのみサポートされています。
インクリメンタルビルドを使用するには “Build Settings” ダイアログの “Build” を選択した後、“Append” を選んでください。“Replace” オプションの場合、毎回1からビルドしなおします。

(with Unity 5.3)

sealed keywordによる非仮想化 -> 高速化

  • https://blogs.unity3d.com/jp/2016/07/26/il2cpp-optimizations-devirtualization/
    IL2CPPで生成されたC++コードで、派生クラスのインスタンスから仮想関数呼び出しを行っている部分は、
    ベースクラスの仮想関数(シンボル)呼び出しに置き換えられる。
    これは正確性/安全性を高めるが、その代わりに呼び出しのオーバーヘッドが発生するので速度低下に繋がる可能性がある。
  • というよりは仮想関数呼び出し用のテンプレート関数呼び出しが挟まるので何段階か回りくどい感じになる?
    C#では、sealedキーワードを使うことで派生クラスがそれ以上継承されないことを明示できる。
public sealed class Cow : Animal {
   public override string Speak() {
       return "Moo";
   }
}

これにより、IL2CPP.exeが直接Cow.Speak()を呼び出すようなC++コードを生成してくれるようになる。

ref:


Duck Typing

(継承関係にない)複数の型クラス間でのインターフェースの統一

この用語の名前は「ダック・テスト」に由来する。
“If it walks like a duck and quacks like a duck, it must be a duck”
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)


MacOSでbootable mediaの作成

eraseDisk

$ diskutil list

...

/dev/disk2
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *15.6 GB    disk2
1:                        EFI EFI                     209.7 MB   disk2s1
2:       Microsoft Basic Data UNTITLED                15.4 GB    disk2s2
$ diskutil eraseDisk MS-DOS UNTITLED /dev/disk2

※ FAT形式(MS-DOS)の場合
UNTITLEDの部分にはVolume Nameが入る

unmount -> write -> eject

$ diskutil unmountDisk /dev/disk2
$ sudo dd if=./CentOS-6.5-x86_64-minimal.iso of=/dev/disk2 bs=4028
$ diskutil eject /dev/disk2

ddコマンドについて

ファイルを変換をしながら指定したブロック・サイズでコピーを行う。また,デバイスからデバイスへ直接コピーする際にも使用する。

inputfile, outputfile => if, of
bsオプションは一度に読み書きするブロック数。指定しなくても良い?

Linuxのカーネルをフロッピ・ディスクにコピーする
$ dd if=/boot/vmlinuz of=/dev/fd0
USBメモリーの内容をまるごとファイル名「usb」でバックアップする
$ sudo dd if=/dev/sdb of=./usb
上でバックアップしたUSBイメージをUSBメモリーに戻す
$ sudo dd if=./usb of=/dev/sdb

xfsファイルシステム


Unity: 透視投影(Perspective)と平行投影(Orthographic)を合成する

レイヤーを分けてCulling Maskで制御する

Main Camera: 背景用

  • Projection: Perspective
  • Culling Mask: Orthographic Layerをオフ
  • Depth: 0
    • Depthが小さい順に描画される

Sub Camera: キャラクター用(平行投影用)

  • Projection: Orthographic
  • Culling Mask: Perspective Layerをオフ
  • Clear Flags: Depth Only
  • Depth: 1

Powershellでwhich

毎回忘れる

$ Get-Command notepad | Format-List

or

$ gcm notepad | fl

node: Stream API

ReadableとWritable
a-