Libgdx:渲染方法



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

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

如果你的整个屏幕经常是静态的超过几毫秒,这可能是像纸牌游戏这样的情况,你可以使用Gdx.graphics.setContinuousRendering(false)禁用屏幕的持续刷新。这将节省能源,因为GPU和CPU不必辛苦工作。请参阅此处查看使用说明

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

考虑一个"frame buffer"作为内存中的位图图像,可以绘制然后显示在屏幕上。大多数移动渲染都是通过双缓冲完成的。这意味着当一个缓冲区被绘制到(后缓冲区)时,在前一帧上绘制到的前缓冲区被直接渲染到屏幕上。为了更快的渲染,他们在每一帧之间来回交换。

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

所以,即使屏幕上的一些项目是静态的,如果屏幕上有其他项目移动或改变颜色,并且它们重叠了静态项目(无论是在前面还是在后面),每次有任何变化时,你仍然需要重新绘制整个屏幕。

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

另一个策略是,如果你有一个静态对象,它是非常复杂和费力的GPU绘制,因为它有很多层或复杂的着色器,你可以把它绘制到屏幕外的帧缓冲对象(在libGDX的FrameBuffer类)一次,然后渲染该FrameBuffer的纹理到屏幕上的每一帧像一个sprite。

最新更新