3

私はモノタッチを書いたネイティブ ライブラリで遊んでいます (今は Xamarin.iOS という名前を付ける必要がありますか?) バインディング。

関数のコアが何もしないか base.X () を返す場合でも、C# でよく使用されるメソッドをオーバーライドすると、パフォーマンスが大幅に低下します。インストルメントは、問題とマネージド <-> ネイティブ インタラクションに費やされた時間を確認します。

一方または他方 (ネイティブまたはマネージド) からそれを高速化する方法はありますか? それとも、これは MT で P/Invoking するときに支払う税金ですか?

私がぶつかっているガラスの天井は、約 50000 コール/秒です。

[2013/02/22 更新] 状況や例を示すために、私が行っていることを以下に示します。私はcocos2dキネマティクスで遊んでいます(シマリスなし)。スプライトの独自の位置を管理するには、オーバーライドする必要があります

CGAffineTransform NodeToParentTransform { get; }

bool Dirty { get; }

前者は行列を返し、ネイティブ側を突いて、ScaleX、ScaleY、RotationX などのパラメーターを取得します。RotationY と AnchorPointInPoints、後者はtrue無条件に返されます。

現時点では、コスト削減の試みは部分的に成功しています。ネイティブ コードを変更して、どのプロパティにも影響を与えない単一のオーバーライド ポイントを持つようにすることで、25% から 50% の速度向上が得られます。

-(BOOL) dirty:(CGAffineTransform*)nodeToParentTransform rotationX:(float)rotX rotationY:(float)rotY scaleX:(float)scaleX scaleY:(float)scaleY anchorPointInPoints:(CGPoint)anchorPointInPoints;

現在、3500 スプライトでほぼ許容できる 25 ~ 30 fps を取得していますが、さらに先に進みたいと考えています。また、ネイティブ ソースにパッチを適用する必要もありません。

[UPDATE 2013/02/22 2] https://github.com/StephaneDelcroix/mt-speed のテストに使用できるサンプルを次に示します。これには、過度に単純化された一次キネマティック エンジン、3501 のボディとスプライトが含まれています。

ここで興味深いクラスはKinematicSprite. このコードは、変更されたバージョンの cocos2d (Cocos2D.dll に含まれています) で動作します。Dirty新しい関数をコメントアウトしNodeToParentTransform、古い関数のコメントを外すことで、ストック cocos2d および cocos2d バインディングで動作させることができますDirtyモノタッチのバインドされたタイプのサブクラス化に従って、デバイスでのみ機能します。iPad mini で 20 から 22.5 fps が得られます。

4

2 に答える 2

0

奇妙なクラッシュ バグの質問を調べてみると、cocos2d コードが常に monotouch ランドに戻っていることに気付きました。これは、バインディングがすべてのメソッドのすべての mono バージョンを object-c という名前でエクスポートするためです。それらを露出させずにバインディングをやり直して、速度を大幅に向上させることはできますか?

特定のメソッドをオーバーライドしない限り、公開されているものは必要ないようです (または、実際には望んでいません)。その場合、オーバーライドされたメソッドに目的の c エクスポートを追加できます...それがトラブルを求めているかどうかはわかりません。そこにカスタムコードがない限り、objc側がコールバックしないとうまくいくようです。

poupou や他の xamarin 関係者からのコメントをお待ちしております。

于 2013-02-20T19:49:44.350 に答える