После трех или более недель экспериментов я наконец-то понял, как это сделать, и это было довольно просто. Как я уже говорил в OP, XAllocColor и XSetForground занимают довольно много времени (относительно) для работы. XDrawPoint также работал медленно, так как он делает больше, чем просто помещает пиксель в точку на изображении.
Сначала я проверил, как работает цветовой формат Xlib (для unsigned long int, представленного как pixel.pixel, для которого я и нуждался в XAllocColor), и для него установлено, что 100% красного установлено в 16711680, 100% зеленого установлено в 65280 и 100% синий установлен на 255, что, очевидно, является шаблоном. Я обнаружил, что максимум составляет 50% всех цветов, 4286019447, который является сплошным серым.
Затем я убедился, что моя система XVisualInfo будет поддерживаться моей системой с помощью теста с использованием XMatchVisualInfo ([ожидаемые значения визуальной информации]). Это гарантирует глубину, которую я буду использовать, и класс TrueColor работает.
Наконец, я сделал XImage, скопированный из изображения корневого окна для манипуляции. Я использовал XPutPixel для каждого пикселя в окне и установил случайное значение между 0 и 4286019448, создав случайное изображение. Затем я использовал XPutImage, чтобы вставить изображение в окно.
Вот окончательный код:
if (!XMatchVisualInfo(display, screenNumber, 24, TrueColor, &visualInfo)) {
exit(0);
}
frameImage = XGetImage(display, rootWindow, 0, 0, screenWidth, screenHeight, AllPlanes, ZPixmap);
while (1) {
for (unsigned short x = 0; x < currentWindowWidth; x += pixelSize) {
for (unsigned short y = 0; y < currentWindowHeight; y += pixelSize) {
XPutPixel(frameImage, x, y, rand() % 4286019447);
}
}
XPutImage(display, window, graphics, frameImage, 0, 0, 0, 0, currentWindowWidth, currentWindowHeight);
}
Это помещает случайное изображение на экран со стабильными 140 кадрами в секунду на весь экран. Я не обязательно знаю, является ли это наиболее эффективным способом, но он работает лучше, чем все, что я пробовал. Дайте мне знать, если есть какой-нибудь способ сделать это лучше.