7

これは、マウス カーソルの位置に従って三角形を描画する簡単なプログラムです。

私 (そしてうまくいけばあなた) が気づくことができるのは、三角形がカーソルの後ろに遅れていることです.ウィンドウ全体をドラッグするときほどきつくありません.

だから私の質問は次のとおりです。私は何を間違っていますか? この遅延の原因は何ですか?

私が気付いていることの1つは、三角形の実際のピクセル値をシフトするだけで十分であり、何度もラスタライズしないことです。しかし、この 1 つの三角形をラスタライズするのは本当にコストがかかるのでしょうか? glTranslateまた、さまざまな座標で描画する代わりに使用してみましたが、ラグの改善は見られませんでした。これを効率的に描く方法を教えていただければ幸いです。

#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

float x = 0.0f;
float y = 0.0f;

static void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}

static void cursor_callback(GLFWwindow *window, double xpos, double ypos)
{
    int width, height;
    glfwGetFramebufferSize(window, &width, &height);
    float ratio = width / (float) height;
    x = ratio*(2*xpos/(float)width - 1);
    y = 2*-ypos/(float)height + 1;
}

int main(void)
{
    GLFWwindow* window;
    glfwSetErrorCallback(error_callback);
    if (!glfwInit())
        exit(EXIT_FAILURE);
    window = glfwCreateWindow(640, 480, "Following Triangle", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
    glfwMakeContextCurrent(window);
    // Callbacks
    glfwSetKeyCallback(window, key_callback);
    glfwSetCursorPosCallback(window, cursor_callback);
    // geometry for the equal sided triangle
    float r = 0.1f; // outer circle radius
    float u = r * sin(M_PI_2/3.0f);
    float l = 2.0f * r * cos(M_PI_2/3.0f);

    while (!glfwWindowShouldClose(window))
    {
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        float ratio = width / (float) height;
        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.0f, 1.0f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glBegin(GL_TRIANGLES);
            glColor3f(1.f, 0.f, 0.f);
            glVertex3f(x+0, y+r, 0.f);
            glColor3f(0.f, 1.f, 0.f);
            glVertex3f(x-l/2.0f, y-u, 0.f);
            glColor3f(0.f, 0.f, 1.f);
            glVertex3f(x+l/2.0f, y-u, 0.f);
        glEnd();

        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}
4

5 に答える 5

4

更新は純粋にイベント駆動型です。に置き換えglfwPollEventsてみてくださいglfwWaitEvents。次に、 を再実装しglfwSwapInterval(1)ます。モニターのリフレッシュ レートよりも頻繁に更新しても、何のメリットもありません。サイクルを引き裂いて焼き尽くすだけです。

于 2013-10-01T01:06:10.300 に答える
0

これはダブル バッファリングによるものだと思います。最初のバッファがウィンドウに表示されている間、OpenGL は 2 番目のバッファで描画されます。そして、バッファはコマンドを使用してスワップされます

glfwSwapBuffers()

したがって、少なくとも 1 フレームの遅延が常に発生します。つまり、30 FPS で 33 ミリ秒、60 FPS で 17 ミリ秒です。これはメソッド固有のものであり、修正することはできません。ただし、次のコマンドを使用してシステム マウスが非表示になっている場合:

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);

次に、参照マウスがなければ、脳はどういうわけかラグに慣れ、ラグは消えます。

于 2014-12-06T22:26:06.883 に答える