【问题标题】:SpriteBatch draw allSpriteBatch 全部绘制
【发布时间】:2015-04-29 15:44:55
【问题描述】:

我有一个关于 Libgdx SpriteBatch 的问题:

当我调用 SpriteBatch#draw() 时,Libgdx 会处理 Cameras 截锥体还是会绘制它,即使它在截锥体之外?

我已经在查看SpriteBatchs 代码,但我没有找到任何东西,所以我想知道 Libgdx 是否在内部做了一些事情。 或者我是否必须自己实施 frstum 剔除,例如像这样:

if(camera.frustum.boundsInFrustum(250, 32, 0, 100, 100 ,0)) {   
    tempEnemy.draw (batch); 
}

其中tempEnemySprite,(250,32) 是它的中心,(100,100) 是他的一半尺寸。

【问题讨论】:

  • 对不起,那是不可理解的。您可能需要尝试重写它。
  • @noone 谢谢指正
  • @Springrbua 谢谢指正
  • @Springrbua 哇,你真棒。
  • @Tenfour04 重写这个问题并不难,但无论如何谢谢:)

标签: libgdx


【解决方案1】:

如果我对您的理解正确,您是在问,Libgdxs SpriteBatch 是否关心 ViewFrustum 并仅绘制可见部分,或者它是否仅绘制您告诉他绘制的所有内容。
如果这就是问题,答案是,SpriteBatch 绘制所有内容,而忽略ViewFrustum。你必须自己处理,或者使用 Scene2D,这似乎可以做一些culling

【讨论】:

  • @Tenfour04,Springrbua 的回复,回答了我想问的问题,对不起我的英语,但我无法改善问题,
  • @AngelAngel 很高兴你能得到帮助!
  • 一个建议,遵循这个答案。我不确定剔除单个精灵是否有任何回报。在某些情况下,对照视锥检查精灵可能比简单地绘制它更昂贵。但是您可以将大面积的精灵分组并通过一个 boundsInFrustum 调用一次检查它们。
  • @Tenfour04 谢谢你提到的细节,我正在努力,
  • @Tenfour04 从未想过这一点,但您可能是对的。据我所知,SpriteBatch 有一个缓冲区,只有调用flush()end() 或一个完整的缓冲区才会导致绘制调用。因此,边界检查可能会更昂贵,因为剔除甚至不会导致更少的绘制调用。但据我所知,在使用 libgdx 进行 3D 编程时,没有缓冲区,因此剔除会产生巨大的差异。
【解决方案2】:

这是一条评论,但很长,我认为这是最舒适的阅读方式:

在我的情况下,我认为 Tenfour04 是对的,没有 cullig 效率更高,我将尝试描述可能是什么原因,在我的情况下:

-> fustrum 的检查可能不会降低效率,但是,通过之后需要执行的操作

-> 1 在我的情况下使用观察者模式,您会看到相机何时移动并通知其当前的 fustrum 演员

-> 2 演员必须看,如果她在范围内,必须调用,getX,getw 等,添加更多指令处理

-> 3 如果actor在范围内,则添加到arraylist,该arraylist现在具有带有Renderable自定义界面的SpriteBatch,更多处理负载,如果添加或删除actor,则由Array Class创建新的arrayList,

也许不是最好的实现,还有一些可以改进的地方,让一个 2d fustrum 不使用 arrayList 等,如果你在游戏中有很多精灵,但我认为没有几个精灵,也许所有这些都会更有效.

我的简单基准我没有,即使 fustrum 将用于取消演员的更新,因为如果它可能是有效的,例如,排除许多有动画的演员,但这些球员不移动等。总之,

我认为对于一个玩家很少的简单 2d 游戏对我来说效率不高,我只是想评论一下,如果有人帮忙

感谢 Springrbua、noone 和 Tenfour04 为所有人提供帮助

注意: 反正我的简单游戏现在有60、61 fps的速率,不使用剔除,一个简单的设备,太酷了哈哈

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多