我现在正在玩 MonoGame,我正在研究 SpriteBatch.Draw() 方法。
在每秒可以调用数万次的方法内部,我看到以下内容:
public void Draw (Texture2D texture,
Rectangle destinationRectangle,
Rectangle? sourceRectangle,
Color color,
float rotation,
Vector2 origin,
SpriteEffects effect,
float depth)
{
CheckValid(texture);
DrawInternal(texture,
new Vector4(destinationRectangle.X, //<-------------- Oh Noes! :O
destinationRectangle.Y,
destinationRectangle.Width,
destinationRectangle.Height),
sourceRectangle,
color,
rotation,
new Vector2(origin.X * ((float)destinationRectangle.Width (float)texture.Width), <-- Oh Noes!
origin.Y * ((float)destinationRectangle.Height / (float)texture.Height)),
effect,
depth);
}
似乎每 60 秒左右就会分配数千个新向量。
MonoGame 是一个用于(除其他外)移动开发的平台。我做了一些在 Dalvik 上运行的移动开发,以这种方式分配从来都不是一个好主意。在速度较慢的移动处理器上,需要收集的对象的堆积最终会导致 GC 运行并导致性能明显下降(在某些设备上高达 200 毫秒)。这引出了我的问题:
CLR/Mono GC 的运行方式或其他一些因素是否会阻止这种性能影响的发生,或者 MonoGame 是否在其最常调用的函数之一中做了不应该做的事情?