呼叫在 Windows Phone 7 上失败,但在 Windows 和 Xbox 360 上有效

本文关键字:Windows Xbox 有效 但在 失败 Phone 呼叫 | 更新日期: 2023-09-27 18:32:51

所以,我在这里遇到了一个奇怪的问题。 我在Windows,Xbox 360和Windows Phone 7上使用相同的XNA代码。 我可以让大部分工作,但是当Level尝试在Windows Phone 7版本上调用TileMap时,它永远不会到达TileMap。 但是,在Windows和Xbox 360上,它工作得很好。 我在这里有什么额外的事情要做吗?

更多细节。 在Windows Phone版本上,我从调试器收到某些值的"无法计算表达式"消息。 这在Windows版本上不会发生。 同样,如果我让它继续足够长的时间,我会得到一个 OutOfMemoryException,即使我调用的图像大小约为 KB,并且 .map 文件只会创建一个 3x3 矩阵。

游戏画面.cs

    private Level level;
    ...
    public override void LoadContent()
    {
        if (Content == null)
            Content = new ContentManager(ScreenManager.Game.Services, "Content");
        //Create Sprite Batch for drawing textures
        //spriteBatch = new SpriteBatch(GraphicsDevice);
        //Load fonts
        hudFont = Content.Load<SpriteFont>("Fonts/hud");
        lifeIcon = Content.Load<Texture2D>("Sprites/Player/lifeIco");
        //Load overlays
        //winOverlay = Content.Load<Texture2D>("Overlays/win");
        //loseOverlay = Content.Load<Texture2D>("Overlays/lose");
        try
        {
            MediaPlayer.IsRepeating = true;
            MediaPlayer.Play(Content.Load<Song>("Sounds/music"));
        }
        catch { }
        LoadNextLevel();
        //Camera.InitializeScreen(graphics);
        base.LoadContent();
    } //end LoadContent
    /// <summary>
    /// Loads the next level.
    /// </summary>
    public void LoadNextLevel()
    {
        //Set the next level
        levelIndex = (levelIndex + 1) % numberOfLevels;
        if (level != null)
            level.Dispose();
        level = new Level(ScreenManager.Game.Services, levelIndex);
    } //end LoadNextLevel()

水平.cs

    private TileMap levelMap;
    public Level(IServiceProvider service, int levelIndex)
    {
        //Create content manager for current level.
        content = new ContentManager(service, "Content");
        //Load level map
        //This is where the code hangs
        levelMap = new TileMap(this, levelIndex, content.Load<Texture2D>(@"Tiles/tiles"));

        //Load sounds
        //exampleSound = content.Load<SoundEffect>("Sounds/example");
        //Initialize Camera
        Camera.InitializeLevel(levelMap);
        player = new Player(this, start);
    } //end Level

图块地图.cs

    public TileMap(Level level, int levelIndex, Texture2D tileSheet)
    {
        // Never reaches here on Windows Phone 7 Version
        // Comes right here on Windows and Xbox 360 Version
        this.tileSheet = tileSheet;
        string levelPath = string.Format("Content/Levels/{0}.map", levelIndex);

我已经建议并尝试做的几件事:

我尝试在对磁贴

地图的调用之外调用"磁贴/磁贴",并且我尝试使用 DXT 压缩来压缩磁贴。 "瓷砖/瓷砖"加载得很好,但调用仍然失败,我仍然得到内存不足异常。我的内容的总文件大小为 1.23 MB。

呼叫在 Windows Phone 7 上失败,但在 Windows 和 Xbox 360 上有效

在 Level.cs,不是将内容作为服务传递,而是预先传递加载的所有内容:{Texture2D,Sound}。在XNA中,您通常将所有内容加载到主游戏类或组件中。我是 95%,这是"无法评估表达式"的原因。

另外,看看 .NET Compact Framework 2.0,看看垃圾回收器是如何工作的:

http://blogs.msdn.com/b/stevenpr/archive/2004/07/26/197254.aspx