モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

<mini> Windows ストア アプリ ノウハウ(個人的な意見であり、正当性は保証しません)

 メモ程度に書いていく。

 せっかく作るなら高速化したい。なので、メモ的な感じでノウハウを書いていく。

  1. C++/CX ではバイナリー分割を避ける。もし分割したい場合、C++/CX の winmd を取り込むのではなく、ヘッダーファイル + DLL の形式でロードするのが好ましい。
    C++ 標準クラスを実装に用いれる。これにより、参照カウントのコストを一部下げることができる。
  2. 基本的に WinRT 型を経由するということは互換性のためで、コストがかかる問題だ
    C++/CX や C# から WinRT 型にすることはできるが、どちらもコストがかかる。たとえば、前者なら task<T>、後者なら Task<T> のように生のタスクを用いるのと、そうでないのではコストが違う。
  3. ViewModel には DependencyProperty を用いる[C++/CX は要出典]
    C++/CX の property も遅いみたい…?(検証したことがないのでわからないが、hilo によるとこうなっています) C# は通常の property ではリフレクションを用いるので多少遅い。
  4. C++C# の言語機能を活かす。
    C++ なら std (これは WinRT 型の Vector などのクイックソートも可能です)、C# なら Linq など、言語独自の機能と連携できるので存分に生かすこと。あくまで WinRT 型は C++/CX, C#, VB, JS, TS から使える架け橋。

と、C++/CX のコードを書いていて思ったことを書いてみた。C# は OpenNiconico2 を開発しているときにいろいろ肌で感じたことなどある。基本的に、それぞれの言語の強みを生かすためには、言語を十分に知っている必要がある。言語を知ることはとても難しく、それぞれの特徴を知らないと、無駄なコードを書いてしまう。だからこそ、WinRT は相互運用という点では強みが生かされるが、やはりどの言語でも運用しにくい、というものではあるだろう。

 何でもかんでも、WinRT 型を使うのはナンセンスだと改めて思った。C++ なら生 class があるし、C# なら internal static class による拡張メソッドも使える。もちろん C++ なら他の言語から見えないけど、C++ は DllExport すればほかの DLL からアクセスできるし、C# も internal アクセス許可を与えれば同様のことが実現できる。

 自分もまだまだコードをあちこちいじりまわしている段階の途中経過だけど、1 つ言えることがあるとすれば、まだまだ面白いことがたくさんありそうだ、ってことだ。C++/CX での MVVM、そのあたりは割と楽しみな感じ。研究段階ですが、温かい感じで見守ってくれればいいのかと。

 おしまい。