C'est une question que j'aurais probablement dû poser plus tôt, mais je n'ai pas pris la peine de m'amuser avec les trucs de type p/invoke dans MonoTouch. Fondamentalement, j'ai un problème avec les performances relatives à un très grand nombre d'opérations en virgule flottante, en particulier celles impliquant des fonctions min/max, la multiplication de vecteurs et des choses simples (détectant fondamentalement si différents types de formes se croisent ou non).Utiliser P/invoke pour améliorer la performance, faisable ou juste un vœu pieux?
La raison de ces opérations est due à un moteur de physique 2D écrit en C#. Sur certaines plates-formes telles que Windows Phone 7 et la Xbox 360, le moteur physique fonctionne sans accrocs, il vole des cycles de processeur mais laisse beaucoup de temps pour que le jeu tourne à un débit constant.
Le problème est dans MonoTouch fonctionnant sur l'iPhone. Il semble que MonoToch ne soit pas si génial avec autant d'opérations en virgule flottante et que l'iPhone (et EVEN l'iPad 2) se trouve gravement touché et que la physique soit le goulot d'étranglement des performances évident. J'ai profiled the performance et il se résume à un ensemble de fonctions mathématiques relativement simples comme I mentioned before et il n'y a pas de véritable moyen d'optimiser ces fonctions, le moteur physique lui-même est très bien écrit et je ne vois pas d'endroit évident, il est à la traîne et franchement Je doute qu'il y ait quelque chose qui ne va pas en tant que moteur physique 2D C#. À cette fin, j'ai résolu de trouver un moteur de physique écrit en C (ou C++ si possible) et de le brancher avec l'application principale MonoTouch. Mon raisonnement est que les problèmes de performance dans MonoTouch ont probablement quelque chose à voir avec le fait que le compilateur MonoTouch ne compile pas le code .net aussi vite que le font les compilateurs WIT de Jp7/xbox 360 (ce qui est compréhensible) et les exécuter nativement aiderait à améliorer la performance. Donc, mon idée est que je vais utiliser Box2D, écrire un tas de fonctions wrapper statiques (telles que CreateWorld(), CreateBox(), GetBodyPosition (int id), etc., etc) et de tout ce qui se passe dans via p/invoquer la fonctionnalité et l'intégrer dans ma classe de wrapper physique, de cette façon la logique du jeu de base nécessitera peu ou pas de modifications et je peux maintenir l'intégrité de la conception de code originale mais aussi gagner en performance en raison du fonctionnement de la physique En C. natif
Mais cela m'a fait penser, les problèmes de performance découlent de fonctions mathématiques très simples et directes, de simples multiplications et de comparaisons de tailles. Si l'exécution de fonctions via p/invoke améliore la vitesse, il suffit de réécrire une fonction telle que Vector2.Max en tant que fonction C et d'invoquer cela pour améliorer également les performances.
Cela semble toutefois un peu tiré par les cheveux, si ce n'était pas le cas, Mono le ferait quand même? Donc, ma question générale est la suivante: est-ce que les bibliothèques natives liées statiquement fonctionnent mieux lorsqu'elles sont appelées depuis p/invoke que la fonction C# équivalente compilée par MonoTouch?
-vous Ména les questions relatives à la compilation du pouce? Je ne suis pas sûr que ce soit spécifique au mono mais j'ai été sûr de l'éteindre car il aurait un impact sur les performances des opérations en virgule flottante. Mon objectif est de faire le moins possible en code managé et de reporter autant d'opérations sur natif, le moteur physique fonctionnera nativement et n'interagira qu'un nombre minimal de fois pour garder les valeurs mises à jour du côté géré (ie l'état de la scène, la position de tous les corps, etc, etc). – tweetypi
Les problèmes pourraient avoir été avec la compilation de pouce, je ne suis pas sûr, je me souviens juste de lire quelque chose sur les questions de mathématiques à virgule flottante quelque part. Votre approche semble être la bonne pour obtenir tous les avantages possibles du code natif. –