LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

Одна из самых главных проблем терминалов, это то что они мерцают кусками, для проверки мерцания придумал такие тесты, таймер для вашего монитора нужно подкорректировать так, что бы графическая версия не мерцала.

// gcc video.c $(pkg-config --libs --cflags sdl2) -o video
#include <string.h>
#include <time.h>
#include <SDL.h>

int main(int argc, char **argv)
{
	SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
	SDL_Window *window = SDL_CreateWindow("", 100, 100, 1000, 1000, SDL_WINDOW_SHOWN);
	SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
	struct timespec t = { 0, 2000000 };
	for (;;) {
		SDL_SetRenderDrawColor(render, 255, 255, 255, 255);
		SDL_RenderClear(render);
		SDL_RenderPresent(render);

		SDL_SetRenderDrawColor(render, 0, 0, 0, 255);
		SDL_RenderClear(render);
		SDL_RenderPresent(render);

		nanosleep(&t, NULL);
		SDL_Event e;
		while (SDL_PollEvent(&e)) {
			if (e.type == SDL_QUIT) return 0;
		}
	}
	return 0;
}

// gcc term.c -lcurses -o term
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <ncurses/ncurses.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
	int h, w;
	struct winsize size;
	ioctl(0, TIOCGWINSZ, (char *) &size);
	h = size.ws_row;
	w = size.ws_col;

	char buff1[h][w];
	char buff2[h][w];

	memset(buff1, '#', sizeof(buff1));
	memset(buff2, ' ', sizeof(buff2));
	for (int i = 0; i < h; i++) {
		buff1[i][w - 1] = '\n';
	       	buff2[i][w - 1] = '\n';	
	}
	struct timespec t = { 0, 2000000 };
	for (;;) {
		clear();
		write(1, buff1, sizeof(buff1));
		clear();
		write(1, buff2, sizeof(buff2));
		nanosleep(&t, NULL);
	}
	return 0;
}
  • rxvt нет мерцания
  • xterm нет мерцания
  • st нет мерцания
  • xfce4-terminal заметное мерцание
  • konsole заметное мерцание

Но xterm и другие терминалы точно иногда мерцают у меня даже на простом выводе вне этого теста, хотя в тесте все ок. Возможно придумаю тест который показывает проблемы Xterm.

Исправление MOPKOBKA, :

Одна из самых главных проблем терминалов, это то что они мерцают кусками, для проверки мерцания придумал такие тесты, таймер для вашего монитора нужно подкорректировать так, что бы графическая версия не мерцала.

// gcc video.c $(pkg-config --libs --cflags sdl2) -o video
#include <string.h>
#include <time.h>
#include <SDL.h>

int main(int argc, char **argv)
{
	SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
	SDL_Window *window = SDL_CreateWindow("", 100, 100, 1000, 1000, SDL_WINDOW_SHOWN);
	SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
	struct timespec t = { 0, 2000000 };
	for (;;) {
		SDL_SetRenderDrawColor(render, 255, 255, 255, 255);
		SDL_RenderClear(render);
		SDL_RenderPresent(render);

		SDL_SetRenderDrawColor(render, 0, 0, 0, 255);
		SDL_RenderClear(render);
		SDL_RenderPresent(render);

		nanosleep(&t, NULL);
		SDL_Event e;
		while (SDL_PollEvent(&e)) {
			if (e.type == SDL_QUIT) return 0;
		}
	}
	return 0;
}

// gcc term.c -lcurses -o term
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <ncurses/ncurses.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
	int h, w;
	struct winsize size;
	ioctl(0, TIOCGWINSZ, (char *) &size);
	h = size.ws_row;
	w = size.ws_col;

	char buff1[h][w];
	char buff2[h][w];

	memset(buff1, '#', sizeof(buff1));
	memset(buff2, ' ', sizeof(buff2));
	for (int i = 0; i < h; i++) {
		buff1[i][w - 1] = '\n';
	       	buff2[i][w - 1] = '\n';	
	}
	struct timespec t = { 0, 2000000 };
	for (;;) {
		clear();
		write(1, buff1, sizeof(buff1));
		clear();
		write(1, buff2, sizeof(buff2));
		nanosleep(&t, NULL);
	}
	return 0;
}
  • rxvt нет мерцания
  • xterm нет мерцания
  • st нет мерцания
  • xfce4-terminal заметное мерцание
  • konsole заметное мерцание

Но xterm и другие терминалы точно иногда мерцают у меня даже на простом выводе, но возможно на более сложном тексте? Пока не придумал как проверить.

Исправление MOPKOBKA, :

Одна из самых главных проблем терминалов, это то что они мерцают кусками, для проверки мерцания придумал такие тесты, таймер для вашего монитора нужно подкорректировать так, что бы графическая версия не мерцала.

// gcc video.c $(pkg-config --libs --cflags sdl2) -o video
#include <string.h>
#include <time.h>
#include <SDL.h>

int main(int argc, char **argv)
{
	SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
	SDL_Window *window = SDL_CreateWindow("", 100, 100, 1000, 1000, SDL_WINDOW_SHOWN);
	SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
	struct timespec t = { 0, 2000000 };
	for (;;) {
		SDL_SetRenderDrawColor(render, 255, 255, 255, 255);
		SDL_RenderClear(render);
		SDL_RenderPresent(render);

		SDL_SetRenderDrawColor(render, 0, 0, 0, 255);
		SDL_RenderClear(render);
		SDL_RenderPresent(render);

		nanosleep(&t, NULL);
		SDL_Event e;
		while (SDL_PollEvent(&e)) {
			if (e.type == SDL_QUIT) return 0;
		}
	}
	return 0;
}

// gcc term.c -lcurses -o term
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <ncurses/ncurses.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
	int h, w;
	struct winsize size;
	ioctl(0, TIOCGWINSZ, (char *) &size);
	h = size.ws_row;
	w = size.ws_col;

	char buff1[h][w];
	char buff2[h][w];

	memset(buff1, '#', sizeof(buff1));
	memset(buff2, ' ', sizeof(buff2));
	for (int i = 0; i < h; i++) {
		buff1[i][w - 1] = '\n';
	       	buff2[i][w - 1] = '\n';	
	}
	struct timespec t = { 0, 2000000 };
	for (;;) {
		clear();
		write(1, buff1, sizeof(buff1));
		clear();
		write(1, buff2, sizeof(buff2));
		nanosleep(&t, NULL);
	}
	return 0;
}
  • rxvt нет мерцания
  • xterm нет мерцания
  • st нет мерцания
  • xfce4-terminal заметное мерцание
  • konsole заметное мерцание

Но xterm и другие терминалы точно мерцают даже на простом выводе, но возможно на более сложном тексте? Пока не придумал как проверить.

Исходная версия MOPKOBKA, :

Одна из самых главных проблем терминалов, это то что они мерцают кусками, для проверки мерцания придумал такие тесты, таймер для вашего монитора нужно подкорректировать так, что бы графическая версия не мерцала.

// gcc video.c $(pkg-config --libs --cflags sdl2) -o video
#include <string.h>
#include <time.h>
#include <SDL.h>

int main(int argc, char **argv)
{
	SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
	SDL_Window *window = SDL_CreateWindow("", 100, 100, 1000, 1000, SDL_WINDOW_SHOWN);
	SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
	struct timespec t = { 0, 2000000 };
	for (;;) {
		SDL_SetRenderDrawColor(render, 255, 255, 255, 255);
		SDL_RenderClear(render);
		SDL_RenderPresent(render);

		SDL_SetRenderDrawColor(render, 0, 0, 0, 255);
		SDL_RenderClear(render);
		SDL_RenderPresent(render);

		nanosleep(&t, NULL);
		SDL_Event e;
		while (SDL_PollEvent(&e)) {
			if (e.type == SDL_QUIT) return 0;
		}
	}
	return 0;
}
// gcc term.c -lcurses -o term
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <ncurses/ncurses.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
	int h, w;
	struct winsize size;
	ioctl(0, TIOCGWINSZ, (char *) &size);
	h = size.ws_row;
	w = size.ws_col;

	char buff1[h][w];
	char buff2[h][w];

	memset(buff1, '#', sizeof(buff1));
	memset(buff2, ' ', sizeof(buff2));
	for (int i = 0; i < h; i++) {
		buff1[i][w - 1] = '\n';
	       	buff2[i][w - 1] = '\n';	
	}
	struct timespec t = { 0, 2000000 };
	for (;;) {
		clear();
		write(1, buff1, sizeof(buff1));
		clear();
		write(1, buff2, sizeof(buff2));
		nanosleep(&t, NULL);
	}
	return 0;
}
  • rxvt нет мерцания
  • xterm нет мерцания
  • st нет мерцания
  • xfce4-terminal заметное мерцание
  • konsole заметное мерцание

Но xterm и другие терминалы точно мерцают даже на простом выводе, но возможно на более сложном тексте? Пока не придумал как проверить.