当前位置: 首页 > 知识库问答 >
问题:

libgdx:呈现方法

益思博
2023-03-14

我想我不明白render方法是如何工作的。
从我在网上读到的/在youtube教程上看到的,我发现render方法是一个循环函数,您可以使用它来保持游戏的更新和读取用户的输入。当您想要在屏幕中绘制一些东西时,您可以使用此方法,并且在绘制任何东西之前清除屏幕。
但是如果我想要静止地绘制一些东西,那么在render方法之外绘制它不是更好吗(这样计算机就不必多次清除屏幕并重新绘制所有东西)?我错过了什么?

共有1个答案

颛孙霖
2023-03-14

不能在render方法之外绘制,因为它是在OpenGL线程上调用的方法。您不能从其他线程绘制到OpenGL。

如果整个屏幕在几毫秒以上的时间内经常是静态的,比如纸牌游戏,可以使用gdx.graphics.SetContinuousRendering(false)禁用屏幕的连续刷新。这将节省能源,因为GPU和CPU将不必努力工作。请看这里的使用说明。

至于为什么通常不这样做:

把“帧缓冲区”想象成内存中的位图图像,它可以被绘制到屏幕上,然后显示在屏幕上。大多数移动渲染是通过双缓冲完成的。这意味着当一个缓冲区被绘制到(后缓冲区)时,在前一帧上绘制到的前缓冲区将直接呈现到屏幕上。他们来回交换每一帧更快的渲染。

图形的工作方式是,绘制的每个项都修改绘制项所在的帧缓冲区中像素的颜色。项目可能被屏蔽或半透明,这些将改变其背后像素的颜色。这些像素的原始颜色一旦在前面绘制并修改它们就会丢失

因此,即使屏幕上的某些项是静态的,如果屏幕上有其他项移动或改变颜色,并且它们与静态项重叠(无论是在前面还是后面),您仍然必须在每次有任何变化时重新绘制整个屏幕。

如果屏幕的一个区域是静态的,并且从未与动态对象重叠,并且动态对象完全包含在矩形中,则可以设置一个视口,将绘图限制在动态区域,从而避免清除整个屏幕。然而,GPU是专门为清除整个屏幕而设计的。由于双缓冲,如果不清除整个屏幕,实际上可能会损害性能,因为如果不清除,屏幕的内容必须在前面和后面的缓冲区之间复制,然后才能开始绘制下一帧。

另一个策略是,如果您有一个静态对象,它非常复杂,并且由于它有很多层或复杂的着色器而使GPU绘制起来很费力,您可以将它绘制到屏幕外的帧缓冲区对象(libGDX中的FrameBuffer类)中一次,然后在每一帧中将该FrameBuffer的纹理渲染到屏幕上,就像一个sprite一样。

 类似资料:
  • 我正在编程一个小游戏,它是基于瓷砖的。但当我渲染它的时候,有时那些瓷砖之间的一个小空间是可见的,(绿色)背景是暴露的(可以在视频中看到)。 我想知道,是否有一些双缓冲技术,可以解决这个bug,但我读到,双缓冲已经实现了。

  • 我最近开始了我的第一个libGDX游戏,一切都进行得很好,所有的东西都呈现得很好,但是大约一分钟后什么都没有呈现,呈现调用仍然被发出,并且spritebatch工作得很好,我只是留下了一个黑屏,我甚至把'gl clearcolor()'改成了但我仍然留下了一个黑屏。我不知道这会是什么。 我的主要类: 编辑:我们已经确定,经过一段时间SpriteBatch渲染一个黑色屏幕的红色清晰颜色,它也停止渲染

  • 我面临的问题是,我不能让这个循环的每个迭代之间的板得到呈现。我只得到这个循环的最终结果。 我试图在每次迭代之前创建一个thread.sleep(2*1000),以便给渲染系统时间来绘制我的板,但它工作了。 另一个解决办法是调用

  • 我试图用libGdx和MVC模式制作一个游戏。我有一个我的游戏模型,我打算一直运行,而不是我的渲染方法从应用程序。因此,我在从libgdx扩展Game的类中做了这样的工作:首先,我将连续呈现设置为false,为了调用呈现方法,我使用gamescreen作为模型的监听器。

  • 我试图学习libGDX游戏开发的一些简单原则,并在下面的代码中获得了吸吮。我已经将更新和渲染的任务分开,但不太确定如何将它们放在一起。我所要做的就是绘制一个在屏幕上移动的简单矩形。我的代码如下所示。除了渲染,一切都正常。 使用的呈现方法:

  • 只是提醒一下,我对此很陌生,如果我的问题不清楚,我很抱歉: 然后我将文件导出到fbx,然后使用fbx-conv将其转换为.g3db文件,但当我尝试在代码中加载模型时(摘自http://blog.xoppa.com/loading-models-using-libgdx/): } 知道会出什么问题吗?提前谢谢你。