【问题标题】:Lag when displaying Video C# XNA显示视频 C# XNA 时出现延迟
【发布时间】:2014-05-03 17:19:26
【问题描述】:

当我尝试在我的视频游戏中显示背景星视频 + 一些 2D 精灵时遇到了几个滞后问题:太空飞船、激光、爆炸。

看看这些图片就明白我在说什么了:

http://digital-art-studios.e-monsite.com/medias/images/jeu2.jpg

http://digital-art-studios.e-monsite.com/medias/images/jeu4.jpg

当我玩游戏时,移动我的飞船或让一些小行星爆炸。 有一些非常不愉快的冻结,破坏了游戏的乐趣。

你能告诉我为什么会这样吗??

谢谢你:)

【问题讨论】:

  • 目前这是一个广泛的问题。这可能是由于糟糕的编码/尝试更新和/或每秒绘制多次/等等......而且试图通过图片查看滞后是根本不可能的。
  • 这不是由于编码错误,当我在后台禁用视频时。游戏非常流畅,没有延迟。当我启用视频时,出现了几个冻结..
  • 您用来播放/显示视频的代码是什么?

标签: c# video xna 2d lag


【解决方案1】:

这是代码:

声明:

    Video video;
    VideoPlayer player;
    Texture2D videoTexture;

加载内容:

   video = Content.Load<Video>(@"VIDEOS\VIDEO_BACKGROUND_LEVEL_1");
   player = new VideoPlayer();

更新:

   if (allVariable.fenetre_Niveau_1_Wolf_359 == true || 
   allVariable.fenetreAfficherStats == true) //Background LEVEL 1
        {

            if (player.State == MediaState.Stopped || allVariable.enablePause == false)
            {
                player.IsLooped = true;
                player.Play(video);
            }

            if (allVariable.enablePause == true)
                player.Pause();
        }

画:

if (allVariable.fenetre_Niveau_1_Wolf_359 == true || allVariable.fenetreAfficherStats == true)
        {

            spriteBatch.Draw(allVariable.backgroundAntibug, new Rectangle(0, 0, 1600, 900), Color.White);

            // Only call GetTexture if a video is playing or paused
            if (player.State != MediaState.Stopped)
                videoTexture = player.GetTexture();

            // Draw the video, if we have a texture to draw.
            if (videoTexture != null)
            {
                spriteBatch.Draw(videoTexture, new Rectangle(0, 0, 1600, 900), Color.White);
            }
        }

【讨论】:

    【解决方案2】:

    作为一般经验法则,在播放视频时同时覆盖多个对象是一个坏主意,因为它对系统的处理非常密集。

    与其使用视频(我假设您使用它来展示起点如何在后面移动),不如使用代码创建它?

    您可以通过创建地图然后将您的角色移动到其上方来做到这一点,或者制作一个巨大的地图和一个不断在其上方移动的摄像机;强制您的玩家停留在相机边界内。这样,您可以实现与星星移动相同的效果,但不会影响性能。

    如果创建一个巨大的地图 + 相机是不可能的,无论出于何种原因,您都可以创建一个自动滚动背景,它是一个在背景上不断移动的 Texture2D。

    自动滚动选项是最简单的选项,您可以查看如何实现 here

    【讨论】:

    • “(我假设你用它来显示开始是如何在后面移动的)” - 是的,但正如你在 gif 预览中看到的那样:dropbox.com/s/k112eaz6sksd438/preview_back_star.gif(如果你不这样做,请下载它'看不到动画)我有几个“层”的星星,它们给出了 3D 深度。我不想放弃它,因为我使用的是简单的 2D 纹理。
    • @Husker 哦,但你不会失去它!您可以拥有任意数量的 2d 图层,一层一层叠加。这个想法是:底部有 1 个黑色层,然后从那里...... 4 或 5 层只有星星(透明背景)。这样,您将获得相同的效果。您所要做的就是在“星星”纹理上实现自动滚动,仅此而已。检查 spritebatch.Draw 重载,我相信除了基本的之外,所有这些都有一个浮动参数,即你绘制的项目的深度,让你得到想要的效果。
    • 好的,谢谢你的建议。我会用透明方法来做的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多