SDL2 обычный джиттер при перемещении простой текстуры - даже на высоких fps без vsync - PullRequest
3 голосов
/ 20 января 2020

Я пытаюсь сделать очень простое приложение SDL2, которое просто прокручивает текстуру с изображения по экрану. Мне нужно запустить его на довольно старом устройстве:

$ inxi -a
CPU: Single Core Intel Atom N270 (-MT-) speed/min/max: 1600/800/1600 MHz
Kernel: 4.9.126-antix.1-486-smp i686 Up: 1m Mem: 94.4/992.7 MiB (9.5%) Storage: 14.92 GiB (32.0% used)
Procs: 154 Shell: bash 4.4.12 inxi: 3.0.36
urve@urve:~
$ inxi -G
Graphics:  Device-1: Intel Mobile 945GSE Express Integrated Graphics driver: i915 v: kernel
           Display: server: X.org 1.19.2 driver: intel tty: 111x45
           Message: Advanced graphics data unavailable in console. Try -G --display

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         76M        666M         60M        249M        833M
Swap:          2.0G          0B        2.0G

Он работает Linux Antix:

$ uname -a
Linux urve 4.9.126-antix.1-486-smp #1 SMP Mon Sep 10 16:55:08 BST 2018 i686 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: antiX
Description:    antiX 17.2
Release:        17.2
Codename:       stretch

Вот вывод glxinfo:

DISPLAY=:0.0 glxinfo
name of display: :0.0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.4
server glx extensions:
    GLX_ARB_create_context, GLX_ARB_create_context_profile,
    GLX_ARB_fbconfig_float, GLX_ARB_framebuffer_sRGB, GLX_ARB_multisample,
    GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile,
    GLX_EXT_fbconfig_packed_float, GLX_EXT_framebuffer_sRGB,
    GLX_EXT_import_context, GLX_EXT_libglvnd, GLX_EXT_texture_from_pixmap,
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_INTEL_swap_event,
    GLX_MESA_copy_sub_buffer, GLX_OML_swap_method, GLX_SGIS_multisample,
    GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGIX_visual_select_group,
    GLX_SGI_make_current_read, GLX_SGI_swap_control
client glx vendor string: Mesa Project and SGI
client glx version string: 1.4
client glx extensions:
    GLX_ARB_create_context, GLX_ARB_create_context_profile,
    GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
    GLX_ARB_framebuffer_sRGB, GLX_ARB_get_proc_address, GLX_ARB_multisample,
    GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile,
    GLX_EXT_create_context_es_profile, GLX_EXT_fbconfig_packed_float,
    GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context,
    GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating,
    GLX_INTEL_swap_event, GLX_MESA_copy_sub_buffer,
    GLX_MESA_multithread_makecurrent, GLX_MESA_query_renderer,
    GLX_MESA_swap_control, GLX_OML_swap_method, GLX_OML_sync_control,
    GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer,
    GLX_SGIX_visual_select_group, GLX_SGI_make_current_read,
    GLX_SGI_swap_control, GLX_SGI_video_sync
GLX version: 1.4
GLX extensions:
    GLX_ARB_create_context, GLX_ARB_create_context_profile,
    GLX_ARB_fbconfig_float, GLX_ARB_framebuffer_sRGB,
    GLX_ARB_get_proc_address, GLX_ARB_multisample,
    GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile,
    GLX_EXT_fbconfig_packed_float, GLX_EXT_framebuffer_sRGB,
    GLX_EXT_import_context, GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info,
    GLX_EXT_visual_rating, GLX_INTEL_swap_event, GLX_MESA_copy_sub_buffer,
    GLX_MESA_multithread_makecurrent, GLX_MESA_query_renderer,
    GLX_MESA_swap_control, GLX_OML_swap_method, GLX_OML_sync_control,
    GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer,
    GLX_SGIX_visual_select_group, GLX_SGI_make_current_read,
    GLX_SGI_swap_control, GLX_SGI_video_sync
Extended renderer info (GLX_MESA_query_renderer):
    Vendor: Intel Open Source Technology Center (0x8086)
    Device: Mesa DRI Intel(R) 945GME x86/MMX/SSE2 (0x27ae)
    Version: 13.0.6
    Accelerated: yes
    Video memory: 192MB
    Unified memory: yes
    Preferred profile: compat (0x2)
    Max core profile version: 0.0
    Max compat profile version: 2.1
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 2.0
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) 945GME x86/MMX/SSE2
OpenGL version string: 2.1 Mesa 13.0.6
OpenGL shading language version string: 1.20
OpenGL extensions:
    GL_3DFX_texture_compression_FXT1, GL_AMD_shader_trinary_minmax,
    GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5,
    GL_APPLE_object_purgeable, GL_APPLE_packed_pixels,
    GL_APPLE_vertex_array_object, GL_ARB_ES2_compatibility,
    GL_ARB_clear_buffer_object, GL_ARB_compressed_texture_pixel_storage,
    GL_ARB_copy_buffer, GL_ARB_debug_output, GL_ARB_depth_texture,
    GL_ARB_draw_buffers, GL_ARB_draw_elements_base_vertex,
    GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location,
    GL_ARB_fragment_program, GL_ARB_fragment_shader,
    GL_ARB_framebuffer_object, GL_ARB_get_program_binary,
    GL_ARB_get_texture_sub_image, GL_ARB_half_float_pixel,
    GL_ARB_internalformat_query, GL_ARB_invalidate_subdata,
    GL_ARB_map_buffer_alignment, GL_ARB_map_buffer_range, GL_ARB_multi_bind,
    GL_ARB_multisample, GL_ARB_multitexture, GL_ARB_occlusion_query,
    GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite,
    GL_ARB_program_interface_query, GL_ARB_provoking_vertex,
    GL_ARB_robustness, GL_ARB_sampler_objects, GL_ARB_separate_shader_objects,
    GL_ARB_shader_objects, GL_ARB_shading_language_100, GL_ARB_shadow,
    GL_ARB_sync, GL_ARB_texture_border_clamp, GL_ARB_texture_compression,
    GL_ARB_texture_cube_map, GL_ARB_texture_env_add,
    GL_ARB_texture_env_combine, GL_ARB_texture_env_crossbar,
    GL_ARB_texture_env_dot3, GL_ARB_texture_mirrored_repeat,
    GL_ARB_texture_non_power_of_two, GL_ARB_texture_rectangle,
    GL_ARB_texture_storage, GL_ARB_transpose_matrix,
    GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_binding,
    GL_ARB_vertex_buffer_object, GL_ARB_vertex_program, GL_ARB_vertex_shader,
    GL_ARB_window_pos, GL_ATI_blend_equation_separate, GL_ATI_draw_buffers,
    GL_ATI_separate_stencil, GL_ATI_texture_env_combine3, GL_EXT_abgr,
    GL_EXT_bgra, GL_EXT_blend_color, GL_EXT_blend_equation_separate,
    GL_EXT_blend_func_separate, GL_EXT_blend_minmax, GL_EXT_blend_subtract,
    GL_EXT_compiled_vertex_array, GL_EXT_copy_texture,
    GL_EXT_draw_range_elements, GL_EXT_fog_coord, GL_EXT_framebuffer_blit,
    GL_EXT_framebuffer_object, GL_EXT_gpu_program_parameters,
    GL_EXT_multi_draw_arrays, GL_EXT_packed_depth_stencil,
    GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object, GL_EXT_point_parameters,
    GL_EXT_polygon_offset, GL_EXT_provoking_vertex, GL_EXT_rescale_normal,
    GL_EXT_secondary_color, GL_EXT_separate_specular_color,
    GL_EXT_shadow_funcs, GL_EXT_stencil_two_side, GL_EXT_stencil_wrap,
    GL_EXT_subtexture, GL_EXT_texture, GL_EXT_texture3D,
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_cube_map,
    GL_EXT_texture_edge_clamp, GL_EXT_texture_env_add,
    GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3,
    GL_EXT_texture_filter_anisotropic, GL_EXT_texture_lod_bias,
    GL_EXT_texture_object, GL_EXT_texture_rectangle, GL_EXT_texture_sRGB,
    GL_EXT_texture_sRGB_decode, GL_EXT_vertex_array,
    GL_IBM_multimode_draw_arrays, GL_IBM_rasterpos_clip,
    GL_IBM_texture_mirrored_repeat, GL_INGR_blend_func_separate,
    GL_KHR_context_flush_control, GL_KHR_debug, GL_MESA_pack_invert,
    GL_MESA_window_pos, GL_MESA_ycbcr_texture, GL_NV_blend_square,
    GL_NV_light_max_exponent, GL_NV_packed_depth_stencil,
    GL_NV_texgen_reflection, GL_NV_texture_env_combine4,
    GL_NV_texture_rectangle, GL_OES_EGL_image, GL_OES_read_format,
    GL_S3_s3tc, GL_SGIS_generate_mipmap, GL_SGIS_texture_border_clamp,
    GL_SGIS_texture_edge_clamp, GL_SGIS_texture_lod, GL_SUN_multi_draw_arrays

OpenGL ES profile version string: OpenGL ES 2.0 Mesa 13.0.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 1.0.16
OpenGL ES profile extensions:
    GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5,
    GL_APPLE_texture_max_level, GL_EXT_blend_minmax,
    GL_EXT_discard_framebuffer, GL_EXT_draw_buffers,
    GL_EXT_draw_elements_base_vertex, GL_EXT_map_buffer_range,
    GL_EXT_multi_draw_arrays, GL_EXT_read_format_bgra,
    GL_EXT_separate_shader_objects, GL_EXT_texture_border_clamp,
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_filter_anisotropic,
    GL_EXT_texture_format_BGRA8888, GL_EXT_texture_type_2_10_10_10_REV,
    GL_EXT_unpack_subimage, GL_KHR_context_flush_control, GL_KHR_debug,
    GL_NV_draw_buffers, GL_NV_fbo_color_attachments, GL_NV_read_buffer,
    GL_NV_read_depth, GL_NV_read_depth_stencil, GL_NV_read_stencil,
    GL_OES_EGL_image, GL_OES_EGL_sync, GL_OES_depth24, GL_OES_depth_texture,
    GL_OES_draw_elements_base_vertex, GL_OES_element_index_uint,
    GL_OES_fbo_render_mipmap, GL_OES_get_program_binary, GL_OES_mapbuffer,
    GL_OES_packed_depth_stencil, GL_OES_rgb8_rgba8, GL_OES_stencil8,
    GL_OES_surfaceless_context, GL_OES_texture_3D,
    GL_OES_texture_border_clamp, GL_OES_texture_npot,
    GL_OES_vertex_array_object

12 GLX Visuals
    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
----------------------------------------------------------------------------
0x020 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x021 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x077 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x078 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x079 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x07a 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x07b 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x07c 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x07d 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x07e 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x07f 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x05e 32 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None

24 GLXFBConfigs:
    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
----------------------------------------------------------------------------
0x05f  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x060  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x061  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x062  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x063 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x064 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x065 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x066 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x067  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x068  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x069 32 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x06a 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x06b  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x06c  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x06d  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x06e  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x06f 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x070 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x071 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x072 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x073  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x074  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x075 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x076 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow

Проблема в том, что, хотя переход выглядит плавным, каждые 3 секунды или около того происходит постоянный джиттер. Выглядит так, как будто движущаяся текстура отскочила назад, вместо того чтобы двигаться вперед.

Я пробовал много разных способов сгладить это. Я использовал движение на основе дельта-времени, затем отключил VSyn c и ограничил FPS вручную, затем я обнаружил этот вопрос: https://gamedev.stackexchange.com/questions/163477/how-can-i-avoid-jittery-motion-in-sdl2

И я применил тот же метод ограничения частота кадров, как в ответе. Все еще не помогает. Даже при использовании 120FPS (что я на самом деле могу достичь), это лучше, но все еще есть видимый джиттер.

Я распечатал разницу между последним X pos и током во время 120FPS:

2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2.01
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2

Таким образом, результаты выглядят очень хорошо для меня.

С 60FPS печать времени кадра и положения X также выглядит очень хорошо:


4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4.004
Frame time: 0.01668
4
Frame time: 0.01667
4
Frame time: 0.01667
4.003
Frame time: 0.01668
4
Frame time: 0.01667
4
Frame time: 0.01667
4.008
Frame time: 0.0167
4
Frame time: 0.01667
4
Frame time: 0.01667
4.002
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4.003
Frame time: 0.01668
4
Frame time: 0.01667
4
Frame time: 0.01667
4.001
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667
4
Frame time: 0.01667

Нет видимых шипов больше, чем что вы видите здесь, но дрожание все еще есть.

Система работает с принудительным разрешением 1280x768 при 60 Гц, но я попытался применить другие разрешения (либо с использованием gtf и cvt моделинов), но это ничего не изменило. Я также попытался отключить VSyn c для всей системы, используя файл .drirc, как указано здесь: https://wiki.archlinux.org/index.php/Intel_graphics

, но он все тот же, хотя лучше, чем при работе с vsyn c и SDL_RENDERER_PRESENT_VSYNC.

Удивительно, но установка AccelMethod в uxa (вместо значения по умолчанию sna) фактически избавляет от обычного дрожания, но конечный результат очень мерцает и вредит глаза ...

У меня заканчиваются идеи.

Я проверил, если что-то перегружает GPU, но он даже не используется на 50%:

$ sudo intel_gpu_top
render clock: 166 Mhz  display clock: 200 Mhz
                   render busy:  33%: ██████▋                                render space: 36/131072

                          task  percent busy
                   Bypass FIFO:  32%: ██████▌
              Color calculator:  32%: ██████▌
                    Map filter:  29%: █████▉
                Intermediate Z:  23%: ████▋
                    Windowizer:  22%: ████▌
     Perspective interpolation:   3%: ▋
                  Pixel shader:   3%: ▋
                  Setup engine:   2%: ▌
                    Dispatcher:   2%: ▌
               Strips and fans:   2%: ▌
                 Sampler Cache:   0%:
                        Map L2:   0%:
                     Filtering:   0%:
         Texture decompression:   0%:
            Projection and LOD:   0%:
 Dependent address calculation:   0%:
                 Texture fetch:   0%:

Вот очень простой c код из одного файла приложения:

#include <iostream>
#include <iomanip>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <time.h>
#include <unistd.h>

#define WIDTH 1280
#define HEIGHT 156

SDL_Renderer* ren = nullptr;
using namespace std;

struct Timer {
    Uint64 previous_ticks{};
    float elapsed_seconds{};

    void tick() {
        const Uint64 current_ticks{SDL_GetPerformanceCounter()};
        const Uint64 delta{ current_ticks - previous_ticks };
        previous_ticks = current_ticks;

        static const Uint64 TICKS_PER_SECOND { SDL_GetPerformanceFrequency() };
        elapsed_seconds = delta / static_cast<float>(TICKS_PER_SECOND);
    }
};

class Object {
    public:
    Object(string fileName, SDL_Renderer* ren) {
        this->ren = ren;
        surf = IMG_Load(fileName.c_str());
        tx = SDL_CreateTextureFromSurface(ren, surf);
        this->setRect(0, 0, surf->w, surf->h);
        SDL_FreeSurface(surf);
    }

    ~Object() {
        SDL_DestroyTexture(tx);
    }

    SDL_Rect* getDest() { return &dest; };
    SDL_Rect* getSrc() { return &src; };
    SDL_Texture* getTexture() { return tx; };
    void setRect(int x, int y, int w, int h) { 
        //src.x = x;
        //src.y = y;
        src.x = 0;
        src.y = 0;
        src.w = w;
        src.h = h;

        dest.y = y;
        dest.x = x;
        dest.w = w;
        dest.h = h;
        pos_x = static_cast<float>(x);
    }

    void setX(float x) {
        pos_x = x;
        dest.x = roundf(x);
        if(dest.x <= -dest.w) {
            dest.x = WIDTH; 
            pos_x = static_cast<float>(WIDTH); // reset
        }
        cout << setprecision(4) << (last_x - pos_x) << endl;
        last_x = pos_x;
    }

    void setXY(int x, int y) {
        this->setX(static_cast<float>(x));
        dest.y = y;
    }

    void move(float timestep) {
        this->setX(pos_x - (240.0f * (timestep) ));
    }

    void draw() {
        SDL_RenderCopy(this->ren, this->tx, &this->src, &this->dest);
    }

    private:
    float pos_x = 0.0f;
    float last_x = (float)WIDTH;
    SDL_Rect dest;
    SDL_Rect src;
    SDL_Texture *tx = nullptr;
    SDL_Surface *surf = nullptr;
    SDL_Renderer *ren = nullptr;
};

void loop();

int main(int argc, char *argv[]) {
    // Create the SDL window, accelerated renderer without vsync

    SDL_Init(0);
    SDL_Window* win = SDL_CreateWindow("SDLTest", 0, 0, WIDTH, HEIGHT, 0);
    ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
    SDL_SetRenderDrawColor(ren, 255, 255, 255, 255);

    loop();
    SDL_Quit();
    return 1;
}



void loop() {
    bool running = true;
    SDL_Rect bg_rect;
    bg_rect.x = 0;
    bg_rect.y = 0;
    bg_rect.w = WIDTH;
    bg_rect.h = HEIGHT;

    const int UPDATE_FREQUENCY { 60 };
    const float CYCLE_TIME { 1.0f / UPDATE_FREQUENCY };

    static Timer timer;
    float accumulated_seconds = 0.0f;

    /*struct timespec tv_sleep;
    tv_sleep.tv_sec = 0;
    tv_sleep.tv_nsec = 10;*/

    Object obj("test.png", ren);
    obj.setXY(WIDTH, 20);
    int iterCount = 0;

    while(running) {

        iterCount++;
        // cap framerate
        timer.tick();
        accumulated_seconds += timer.elapsed_seconds;
        if(accumulated_seconds >= CYCLE_TIME*2.0f || accumulated_seconds <= 0.0 )
            accumulated_seconds = CYCLE_TIME;

        if(std::isgreaterequal(accumulated_seconds, CYCLE_TIME)) {
            SDL_Event e;
            while(SDL_PollEvent(&e)) {
                if(e.type == SDL_QUIT) {
                    running = false;
                    cout << "QUIT" << endl;
                    return;
                }
            }

            SDL_RenderClear(ren);

            SDL_RenderFillRect(ren, &bg_rect);

            // Draw moving stuff here
            obj.move(accumulated_seconds);
            obj.draw();

            SDL_RenderPresent(ren);

            cout << "Frame time: " << setprecision(4) << accumulated_seconds << endl;

            accumulated_seconds -= CYCLE_TIME;
        }

        /*if(iterCount == 1000) {
            iterCount = 0;
            //sleep(0);
        }*/
    }
}  

(вам просто нужно изображение test.png в том же каталоге, в котором SDL загружает его в текстуру)

Я также пытался использовать FPSManager из SDL2_framrate.h, но он очень похож результаты, если не хуже.

Я хотел применить этот метод сглаживания дельты: http://frankforce.com/?p=2636

Но я не смог найти никакой реализации GetMonitorRefreshRate() fun c, и использование SDL SDL_GetDisplayMode() фактически возвращает 0 для каждого значения в структуре режима отображения. И даже если оно вернулось, refresh_rate - это целое число, так что я не думаю, что оно действительно поможет.

Я начинаю, что это какая-то проблема с самой системой, какой-то отсутствующий / поврежденный драйвер или что-то еще, но я попытался установить почти все, что смог найти без удачи.

Вот мой /etc/X11/xorg.conf.d/20-intel-flicker-fix.conf файл:

Section "Device"
    Identifier "Intel Graphics"
    Driver "intel"
    Option "TearFree" "true"
    Option "AccelMethod" "sna"
EndSection

Мне нужно было добавить опцию TearFree, потому что был огромный разрыв на изображении при прокрутке. Вот модельная строка gtf, которую я использую:

"1280x768_60.00"  80.00  1280 1344 1480 1680  768 769 772 795  -HSync +Vsync
...