私はモノタッチを書いたネイティブ ライブラリで遊んでいます (今は 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 が得られます。