C# 绘制深度在WP7模拟器上工作,但在设备上不工作

C# 绘制深度在WP7模拟器上工作,但在设备上不工作,c#,windows-phone-7,xna,C#,Windows Phone 7,Xna,我正在使用C#和XNA在WP7设备上制作一个游戏。我有一个系统,我总是希望用户正在触摸的对象被带到顶部,因此每次触摸它时,我都会将float.Epsilon添加到它的绘制深度(我将其设置为0是后面,1是前面) 在模拟器上,一切正常,但当我在我的设备上运行时,绘制深度似乎完全是随机的 我希望任何人都知道解决这个问题的方法。我尝试过从设备上进行清理、重建和卸载,但这不是运气。我对spritebatch.Begin的调用是: spriteBatch.Begin(SpriteSortMode.Front

我正在使用C#和XNA在WP7设备上制作一个游戏。我有一个系统,我总是希望用户正在触摸的对象被带到顶部,因此每次触摸它时,我都会将
float.Epsilon
添加到它的绘制深度(我将其设置为0是后面,1是前面)

在模拟器上,一切正常,但当我在我的设备上运行时,绘制深度似乎完全是随机的

我希望任何人都知道解决这个问题的方法。我尝试过从设备上进行清理、重建和卸载,但这不是运气。我对spritebatch.Begin的调用是:

spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
我用它来画画

spriteBatch.Draw(Texture, new Rectangle((int)X, (int)Y, (int)Width, (int)Height), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, mDrawDepth);
其中,
mDrawDepth
是绘制深度的浮点值(可能是一个非常小的数字;是
float.Epsilon
的小倍数)


非常感谢您的帮助!

问题在于您使用的是来自以下网站的
float.Epsilon

在ARM系统上,Epsilon常量的值太小,无法检测,因此它等于零。您可以定义一个替代的Epsilon值,该值等于1.175494351E-38

我认为emulator没有运行完全精确的ARM仿真——这就是为什么它在emulator上而不是在设备上正常工作的原因。(我甚至不确定emulator是否实际运行ARM——它很可能是x86。)


需要注意的是,向对象添加epsilon并期望结果值有意义是非常危险的。
float的值。epsilon
是32位浮点数(在x86上)在零附近的精度

当数值的大小大于零时,精度增量会变大。将
float.Epsilon
添加到给定值时,会精确返回该值

在不讨论of的情况下,我只想指出32位浮点(在base-10中考虑时)可以存储6(或更多)个有效数字


就我个人而言,我建议您实施自己的订购系统。我总是发现XNA中的
layerDepth
内容有点弱


也许您是从列表中绘制这些组件?只要在触摸组件时重新排列列表即可。

问题在于您使用的是float.Epsilon

在ARM系统上,Epsilon常量的值太小,无法检测,因此它等于零。您可以定义一个替代的Epsilon值,该值等于1.175494351E-38

我认为emulator没有运行完全精确的ARM仿真——这就是为什么它在emulator上而不是在设备上正常工作的原因。(我甚至不确定emulator是否实际运行ARM——它很可能是x86。)


需要注意的是,向对象添加epsilon并期望结果值有意义是非常危险的。
float的值。epsilon
是32位浮点数(在x86上)在零附近的精度

当数值的大小大于零时,精度增量会变大。将
float.Epsilon
添加到给定值时,会精确返回该值

在不讨论of的情况下,我只想指出32位浮点(在base-10中考虑时)可以存储6(或更多)个有效数字


就我个人而言,我建议您实施自己的订购系统。我总是发现XNA中的
layerDepth
内容有点弱


也许您是从列表中绘制这些组件?只要在触摸组件时对列表重新排序?

只要快速抬头,您可能会在快速抬头上找到更多答案,您可能会在+1上找到更多答案这很有趣…只是出于好奇,您知道为什么会发生这种情况吗?IEEE的ARM实现与t不同吗他是英特尔公司使用的吗?我不知道。但这个问题很有趣。+1这很有趣…只是出于好奇,你知道为什么会发生这种情况吗?IEEE的ARM实现与英特尔公司使用的不同吗?我不知道。但问题很有趣。