Контекст OpenGL и честный счетчик кадров

Пункт ноль плана: клиент теперь просит контекст 3.3 в режиме
совместимости, а не тот, что выпадал по умолчанию.

Зачем: дальний вид будет писаться шейдером GLSL 330, и контекст должен
гарантированно быть не ниже 3.3. В профиле совместимости работают и
шейдеры игры (#version 120, их 34 штуки), и наши 330-е. LWJGL 2.9.4 выше
3.3 контекст не заказывает - ограничение в его конструкторе, а не в
драйвере. Драйвер при этом дает 4.6, и расширение GL_EXT_gpu_shader4,
которое просит FXAA-шейдер игры, в этом контексте на месте.

Замер кадров теперь пишется в лог каждую секунду: средний, медиана,
1% и 0.1% low. Одного среднего мало: клиент, который идет со 60
кадрами и дважды в секунду проваливается в 10, в среднем остается 60 и
ощущается как slideshow. Медленные кадры - это то, что чувствует
игрок, поэтому окно держит все времена кадров и говорит про хвост.

Среднее и процентили видны и в HUD, так что их не надо вылавливать из
скриншотов.

Замер: 307 fps | med 2.9 ms | 1% 6.0 ms | 0.1% 18.1 ms.
This commit is contained in:
sasheg dev
2026-10-20 21:21:19 +03:00
parent 5b451c38da
commit c0db40f624
8 changed files with 303 additions and 2 deletions
@@ -135,6 +135,33 @@ public final class RsxBootstrap {
}
}
/**
* Writes down what OpenGL we ended up with.
*
* The far view is written against a modern context, and the first thing to
* ask when it draws nothing is what the driver actually gave us.
*/
public static void logGl() {
try {
Log.info("OpenGL " + org.lwjgl.opengl.GL11.glGetString(
org.lwjgl.opengl.GL11.GL_VERSION)
+ " | " + org.lwjgl.opengl.GL11.glGetString(
org.lwjgl.opengl.GL11.GL_RENDERER)
+ " | " + org.lwjgl.opengl.GL11.glGetString(
org.lwjgl.opengl.GL11.GL_VENDOR));
// The game's own FXAA shader asks for an extension that modern
// drivers no longer hand out. It is worth knowing whether it is
// there before a player turns the effect on and the game falls
// over.
String extensions = org.lwjgl.opengl.GL11.glGetString(
org.lwjgl.opengl.GL11.GL_EXTENSIONS);
Log.info("OpenGL EXT_gpu_shader4: "
+ (extensions != null && extensions.contains("GL_EXT_gpu_shader4")));
} catch (Throwable throwable) {
Log.error("RustNotMC: could not read the OpenGL version", throwable);
}
}
/**
* Runs one game tick of mod work.
*
@@ -172,6 +199,7 @@ public final class RsxBootstrap {
* the state it did not set alone.
*/
public static void renderFrame(Minecraft minecraft) {
RsxFrameStats.frame();
if (client != null) {
client.advanceFrame();
}