メモ程度に書いていく。
せっかく作るなら高速化したい。なので、メモ的な感じでノウハウを書いていく。
- C++/CX ではバイナリー分割を避ける。もし分割したい場合、C++/CX の winmd を取り込むのではなく、ヘッダーファイル + DLL の形式でロードするのが好ましい。
→C++ 標準クラスを実装に用いれる。これにより、参照カウントのコストを一部下げることができる。 - 基本的に WinRT 型を経由するということは互換性のためで、コストがかかる問題だ
→C++/CX や C# から WinRT 型にすることはできるが、どちらもコストがかかる。たとえば、前者なら task<T>、後者なら Task<T> のように生のタスクを用いるのと、そうでないのではコストが違う。 - ViewModel には DependencyProperty を用いる[C++/CX は要出典]
→C++/CX の property も遅いみたい…?(検証したことがないのでわからないが、hilo によるとこうなっています) C# は通常の property ではリフレクションを用いるので多少遅い。 - 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、そのあたりは割と楽しみな感じ。研究段階ですが、温かい感じで見守ってくれればいいのかと。
おしまい。