3

iPhone と iPad で使用するために C++ プロジェクトを iOS に移植しています。このプロジェクトは、Boost.Coroutine ライブラリを広範囲に使用します。Boost.Coroutine には、iPhone の ARMv6/ARMv7 命令セットの実装がありません。

  • iOS で実行できる他のコルーチン ライブラリはありますか?

  • そうでない場合、ARM でコルーチンの動作を記述することは可能ですか? これを行うためのいくつかの潜在的な方法を見ることができます:

    • アセンブリ命令を直接記述して、スタック操作を実行します。私はアセンブリにあまり精通しておらず、スタックをコピーして貼り付けたり、スタック ポインタを手動で移動したりするのに必要な命令が ARM アーキテクチャに含まれていないのではないかと心配しています。
    • pthread や Win32 ファイバーに似たものを使用してコルーチンを記述します。iOSで使用できるこのようなものがあるかどうかはわかりません。
    • スレッドの上に、コルーチン (おそらく Boost.Coroutine 自体も) を実装します。これはうまくいく可能性が最も高いようですが、確実にパフォーマンス上の欠点があります。

注: Unity は、iOS 上の C# でコルーチンをサポートしています。これが典型的なコルーチン動作の小さなサブセットに限定されているかどうかはわかりません。そうでない場合、これは Unity が解決策を持っているということですか?

4

2 に答える 2

5

ほとんどの場合、スタック操作を実行するためのアセンブリ命令を書きたくないでしょう。iOS は、ARMv6 から ARMv7 を経て ARMv7s に移行した、ARM 命令セットの 3 番目のバージョンに既に対応しています。iPhone 5 の時点で、Apple は、iPhone 5 のフルスクリーンもサポートする ARMv6 フォークを使用してアプリケーションを送信できないという人工バリアをさらに追加しました。Apple の動機は、将来のある時点で ARMv6 互換モードのないプロセッサに確実に移行できるようにすることだと確信していますが、私たち開発者にとって、それは明らかに特定の命令セットに依存しすぎないようにすることを意味します。

それはスレッドを残します。iOS には十分に開発されたスレッド化メカニズムの完全なセットがあり、関連するサブセットを公開するために pthread があります。Grand Central Dispatch は、さまざまなタスクを同時に実行できるようにするために現在使用されている通常のソリューションである傾向があるため、ほとんどのインターネット ドキュメントを飲み込みますが、下位レベルのソリューションは残ります。

NSConditionLockを使用した明らかな簡単な例:

- (void)methodOnThread1
{
    while(1)
    {
        [conditionLock lockWhenCondition:kMoreInputAvailable];

        // process whatever is currently in the common access pool

        [conditionLock unlockWithCondition:kWaitingForInput];
    }
}

- (void)methodOnThread2
{
    while(1)
    {
         // do whatever is necessary to produce more input,
         // creating it locally and taking as long as it takes


        [conditionLock lockWhenCondition:kWaitingForInput];

        // push input to common access pool, by whatever means

        [conditionLock unlockWithCondition:kMoreInputAvailable];
    }
}
于 2012-11-09T01:54:44.407 に答える
4

boost.coroutine (Oliver Kowalke による。先月のブースト コミュニティからのレビュー) は、ARMv6 (ARM Cortext Ax) をサポートする boost.context を使用します。

于 2012-11-14T10:43:45.577 に答える