Pushing Performance
Both the iOS and Android versions of MonoGame run on top of the mono platform. Mono has a great compiler, and these two mobile platforms also include a linker, which is used to reduce the package size of your application by removing code that is not needed. It also has a really good garbage collector, but even though there have been some major advances in the mono GC in the last few years, you still have to remember you are running on mobile devices which vary dramatically in terms of power (especially when it comes to Android devices). Make sure to look at your Update methods; you might be making work for the GC by creating lots of temporary objects that will just be disposed of. You should also think about whether you actually need to do a particular calculation in a certain way -- after all, the fastest code is the code that doesn't get executed. Consider the following class definition:
public class Player
{
public Vector2 Position;
public Vector2 Scale;
public void Update(GameTime gameTime) { … }
public void Draw(GameTime gameTime) { … }
}
In this segment, we are defining a player that has a position and a scale. Now suppose we are using the Matrix property of the sprite batch to render this player using the position and scale data, and also we are using that information for collision detection. One easy way to create the matrix is to do it in the update method like so:
var matrix = Matrix.CreateTransform(Position) * Matrix.CreateScale(Scale);
On desktop machines, this would probably work just fine, but on lower-powered mobile devices it could be a problem. Even though the Matrix class is a struct, and cheap to create, we are still making this calculation every call to Update. If your game is running at 30 frames per second, that alone is many matrix calculations that you might not have had to do. Instead, you could declare a field for the Matrix and just update it in the Update method. Or, even better, you could just update the Matrix only when the Position or Scale properties are changed (see Listing 2).
Listing 2: Optimizing update calls for mobile devices.
public class Player
{
Vector2 position;
Vector2 scale;
Matrix matrix;
public Vector2 Position {
get { return position;}
set {
if (position != value) {
position = value;
UpdateMatrix();
}
}
}
public Vector2 Scale {
get { return scale;}
set {
if (scale != value) {
scale = value;
UpdateMatrix();
}
}
}
public void UpdateMatrix() {
matrix = Matrix.CreateTransform(Position) * Matrix.CreateScale(Scale);
}
public void Update(GameTime gameTime) { … }
public void Draw(GameTime gameTime) { … }
}
I know this is a simple example, but if it gets you thinking about what tiny improvements you can make, then it has done its job. Those of you who know your math will know that you can probably remove the scale and position fields from this class, and just store the matrix.
|
XNA is good, don't get me wrong, but using a simple engine to take the best of it seems to be the best!
Cheers
Sadly, given that even a basic, clean-installed content-project setup on Windows gives all sorts of warnings and errors for me, I'm under the impression that MonoGame is essentially still an "early development" product that takes quite a lot of effort for an amature coder like me to get running smoothly. I may start my future projects in Microsoft XNA, hoping that the Mono project matures a bit further in the near future, for the ease of usability Microsoft's project has.
http://marketplace.xbox.com/en-US/Games/XboxIndieGames?SortBy=ReleaseDate
On Windows Phone I have no idea. Windows Phone 8's can use something other than XNA:
http://www.windowsphone.com/en-us/store/top-rated-games
On Windows it doesn't seem like many XBLIG crossed over. However, the prices for these games are slightly higher.
I suggest developers try and get different resolutions and input methods into their games.
Is the problem that games are so hardware-dependent? Even _huge_ open source projects such as the Linux kernel tend to have problems keeping up with hardware evolution (and thats one reason why Linux and games is still a problematic combination).
Or is the problem that game developers have strong economic incentives not to share full-fledged, working code projects? If so, then why does open source work in other areas of IT?
Yet another reason is that game developers have unusually high demands on software reliability. People will accept if OpenOffice crashes (it has auto-save), but a game that crashes tends to be a HUGE turnoff to users. Perhaps thats because (often) games have so extremely complex internal state, which is difficult to reproduce (either for the user via replay, or via a sufficiently fine-grained auto-save).
Comparing it to Silversprite isn't even in the same ballpark. Unity3D is a perfectly fine option for developing games but it's not direct competition for MonoGame. Unity3D is a full game engine, whereas MonoGame is a replacement for the XNA framework. They solve different problems.
As for Mac development as the article says you can make use of raw assets like png etc, there are only a few content types where you MUST use the content pipeline, fonts and effects are the main ones.