【问题标题】:C# (XNA Game Studio) Getting offscreen objects to not renderC# (XNA Game Studio) 让屏幕外对象不渲染
【发布时间】:2013-04-28 00:32:39
【问题描述】:

我目前正在为 windows phone 7 开发一个游戏。我的游戏的地图由一个二维数组组成,每个元素中都包含一个体素。地图的渲染代码如下。

//Draw Map
for (int i = 0; i < 499; i++)
{
    for (int j = 0; j < 499; j++)
    {
        spriteBatch.Draw(groundVoxelTexture, voxels[i, j].Position, Color.White);
    }
}

我还应该提到,玩家在屏幕上保持居中,地图围绕玩家移动。

问题在于,这会为手机渲染创建大量纹理,并最终导致如此多的延迟,以至于我运行它的手机会锁定。那么有没有办法让屏幕外的对象不渲染?

【问题讨论】:

  • 我对 XNA 不熟悉,但在性能方面,将您打算绘制的所有精灵批处理到一个调用中通常是一个好主意。在这里,您将在每个绘制周期单独绘制每个。这是很多电话。
  • 我假设职位是按某种顺序排列的?你应该能够调整你的循环开始和结束位置
  • @ErikN spriteBatch 有一个Begin 和一个End,您必须调用它们。我不能 100% 确定,但我敢打赌,当调用 End 时,它会将它们组合成一个调用。
  • @Cemafor 啊,这很有道理。谢谢。

标签: c# visual-studio-2010 windows-phone-7 xna render


【解决方案1】:

在这种情况下使用 boundingfrustum 有点硬核。

更好地计算需要绘制的网格索引。

您正在使用 spritebatch,因此您在 2D 中工作,对我来说最简单的方法是使用视图变换并逆向工作以获取索引,但我认为您没有使用它。

所以我假设您的体素大小为“S”,您的播放器位于位置 P,屏幕大小为 (W,H),并且没有缩放选项。

MinX= (int) ((P.X - W * 0.5) / S) - 1;
MinY= (int) ((P.Y - H * 0.5) / S) - 1;
MaxX= MinX+ W/S + 2;
MaxY= MinY+ H/S + 2;

for (int i = MinX; i < MaxX; i++)
{
    for (int j = MinY; j < MaxY; j++)
    {
        spriteBatch.Draw(groundVoxelTexture, voxels[i, j].Position, Color.White);
    }
}

【讨论】:

    【解决方案2】:

    听起来你想做一些Frustum Culling

    我不熟悉手机应用程序的 xna,但我确信它是相同的过程。

    //Draw Map
    BoundingFrustum bf = new BoundingFrustum(View * Projection);
    for (int i = 0; i < 499; i++)
    {
        for (int j = 0; j < 499; j++)
        {
            if (bf.Intersects(new BoundingSphere(voxels[i, j].Position, voxelRadius)))
                spriteBatch.Draw(groundVoxelTexture, voxels[i, j].Position, Color.White);
        }
    }
    

    如果视图保持原位并且地图四处移动,您应该能够在帧之间使用相同的 BoundingFrustum。

    【讨论】:

    • 我喜欢你的方法,BoundingFrustum 是我以前从未听说过的东西,我的逻辑很简单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多