Чё шлангу -Ofast сделал?
argument '-Ofast' is deprecated
Clang 2024 ©
argument '-Ofast' is deprecated
Clang 2024 ©
Прога на C++ раньше сейвила конфиг в той же директории что и сам экзешник, но теперь в .appimage она может прочитать конфиг, только если он уже запакован в контейнер, а создать заново с нуля его она не может.
Программа становится ридонли и виртуально куда-то монтируется со всеми файлами? А как тогда хранить конфиг для такой проги?
Лагают функции задержки, не важно какие - usleep, this_thread::sleep_for или цикл с проверкой времени с nop или yield внутри. Отставание на 4%, игра на экране кажется медленной, но без задержек или с vsync работает быстрее, короч не могу 16.66 мс нормально выждать. На винде такой проблемы нету, HPET видит как включённый. Если на линуксе запустить с высокими приоритетами в nice и chrt, то задержка будет точной. Нет другого способа улучшить точность задержки? В perf видно тормоза в vdso_clock_gettime
У меня Windows 10 на компе с UEFI биос, я подключил к своему компу старый хард с линуксом - он был на MBR биосе, это арч с grub2 бутом. Как добавить в список для запуска этот линукс?
Я делаю игру на C++, в ней надо управлять НЛО-бумерангом и уворачиваться от пуль. Недавно я добавил в неё возможность создавать вырвиглазые графические плагины на Си и Цпп:
[ ! ] ЭПИЛЕПСИ ВОРНИНГ [ ! ]
Видео демонстрация эффектов
Теперь игру можно скачать на гитхабе и собрать в Линуксе, для этого найдите пакеты GCC/Clang, GLEW, GLFW3, OpenAL-soft и YAML-cpp, они есть в apt и pacman. Всё собирается - чекал на Арче, Манжаре и Убунте. Если будут какие-то ошибки можете писать тут в комменты, игра ещё в разработке.
Инфа как создавать плагины и делать палитры написана на странице проекта. В целом, можете дождаться релиза через сто лет и ничего не собирать, я сделаю билды в appimage.
Я использую GCC 13.2.0 и собираю приложение с флагами -msse4.2 -march=native -mtune=generic -Ofast, почему компилятор старается беречь xmm регистры и использует всего 2? У меня в проце явно больше 2-х xmm регистров.
для примера:
#include <experimental/simd>
using floatv = stdx::native_simd<float>;
void func(floatv& a, const floatv& b, const floatv& c, const floatv& d) {
a = a * b + c * d;
}
результат для sse4.2:
movaps xmm0, xmmword ptr [rsi]
mulps xmm0, xmmword ptr [rdi]
movaps xmm1, xmmword ptr [rcx]
mulps xmm1, xmmword ptr [rdx]
addps xmm1, xmm0
movaps xmmword ptr [rdi], xmm1
ret
Если собирать для AVX, то будет так:
vmovaps zmm1, ZMMWORD PTR [rdi]
vmulps zmm0, zmm1, ZMMWORD PTR [rsi]
vmovaps zmm2, ZMMWORD PTR [rdx]
vfmadd231ps zmm0, zmm2, ZMMWORD PTR [rcx]
vmovaps ZMMWORD PTR [rdi], zmm0
vzeroupper
ret
Что это значит, для AVX оптимизатор лучше написан? В clang тот же результат, берутся только xmm0 и xmm1. Во всех местах компиль юзает только по два xmm
Часто бывает, что скомпилировав бихарник на c++ в linux arch, юзеры не могут его запустить на какой-нибудь юбунте, так как им нужна новая версия libc и докачать ещё всяких зависимостей… Короч, как собрать прогу чтобы у всех пошло? Может стоит слинковать всё в один бинарь или сделать какой-то пакет для установки в специальном формате? А если распространять через исходники, то зависимости тоже хранить с кодом? Используется git и система сборки SCons, под виндой все зависимости собраны в .dll и коды выкачаны в папку thirdparty, под линуксом зависимости скачаны в виде dev пакетов через pacman и мне всегда приходится писать инструкцию чтобы юзеры качали себе такие же зависимости самостоятельно.
Компиляторы: clang/mingw/gcc
Зависимости: openmp, openal, c++20, glfw3
SEZEII — программа-видеоконвертор для Linux и Windows с поддержкой плагинов, накладывающая видеоэффекты без использования видеоредактора.
( читать дальше... )
>>> Подробности
В видеоконвертер SEZEII добавлен новый эффект, имитирующий тайловую палитровую графику компьютеров ZX Spectrum и MSX. Обработать можно видео в любом формате, и в результате вы получите стилизованное видео в lossless -качестве. Имитируется стандартная конфигурация Spectrum с областями 8x8 и стандартной палитрой, но эффект настраиваемый: можно выбирать любую палитру, размер блоков и дизеринг.
( читать дальше... )
>>> Паблик программы
Сделал новый плагин для SEZEII, который позволяет имитировать тайловую графику компьютеров ZX Spectrum и MSX
Можно выбрать любую палитру из файлов в формате paint dot net (.txt с кодами цветов в хексе) или поменять размеры закрашиваемых блоков через аргументы запуска. А как сделать свой эффект на C++ можно узнать тут.
Запуск в консоли:
./seze -i "путь к вашему видео" -o "видео на выходе" --plug "bin\plugins\linux\free\libold pc.so" --opts "-w 16 -h 16 -d 16x16 -p "palettes/zx-spectrum.txt""
Скачать для Linux x64. Зависимости: FFmpeg, SDL2, OpenMP и ласт либы для C++.
PS: пока-что я не сделал прикольный GUI и отображение прогресса как вы просили, сделал только совместимый по ABI интерфейс к плагинам.
Представляю вашему вниманию игрушку в жанре bullet hell, её я сделал за 3 дня на C++. В игре вы будете умирать от неожиданных пуль и выстрелов в спину, так же в конце уровня будет босс. Люди никогда не игравшие в такие игры могут потратить до 30 минут для прохождения, но в конце обязательно будут кое-какие призы.
Для запуска вам потребуется Linux x64 с пакетами libyaml-cpp, GLFW, GLEW и OpenMP. Исходники вы можете выиграть в самой же игре, но там не все файлы, если нужны все, то могу скинуть отдельным архивом всё что нужно для сборки. Это только мини версия, сама же игра ещё пилится и выглядит по другому.
Покажу простой способ генерации видео программами на Python и C/C++ без использования стороннего API. Вам так же потребуется ffmpeg, без него вы не сможете конвертировать файлы в читаемые форматы!
Можно экспериментировать, например вы можете создать видео максимального качества и проверять как оно будет эффективно сжиматься тем или иным видео кодеком. Можете даже создать картинку с градиентом в 64-битном цвете и с дизерингом, мало ли какие ещё извращения можно придумать. Можно ещё делать видео с быстро движущимися объектами и сохранять его в 1000 кадров в секунду и потом тестировать всякие интерполяторы движения и моушн блюры.
С помощью скрипта на Python можно создать видео. Просто сохраните этот код в какой-нибудь «main.py»
import os
import sys
state = 0; # переменная нужная для анимации смещения узора
w = 320 # ширина кадра
h = 240 # высота кадра
fps = 25 # кадров в секунду
duration = 2 * fps # сколько длится видео (2 сек)
buffer = bytearray(w * h) # для хранения данных кадра
# генерация кадров
while state < duration:
for y in range(0, h):
for x in range(0, w):
buffer[y * w + x] = ((x + state) ^ y) % 256 # генерация узора
os.write(sys.stdout.fileno(), buffer) # кадр записывается в вывод консоли
state += 1 # немного сдвинуть узор в следующем кадре
Далее исполняете команду в консоли:
python main.py | ffmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -framerate 25 -i pipe: out.mkv
В результате у вас получится двухсекундное видео с узором out.mkv. Посмотреть демо гифку
В командную строку Linux можно выводить не только текст, но и бинарные данные файлов, а так же эти данные можно перенаправлять в другую программу, в данном случае это ffmpeg который принимает RAW кадры и конвертирует их в видео. И в коде и в команде вызова должны совпадать fps/framerate и video_size/w/h иначе всё разъедется. Нельзя просто взять и написать данные пикселей в консоль через print, нужно записывать их в stdout как в файл через os.write. Если в коде изменить duration на 1, то создастся только один кадр с узором и его можно сохранить как картинку так:
python main.py | ffmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -i pipe: out.png
Конечно Питон это медленно и я покажу как сделать это на C и C++, в этих языках стандартный поток вывода stdout тоже считается файлом и в него можно записывать бинарные данные.
#ifdef WIN32
#include <fcntl.h>
#endif
#include <cstdio>
#include <iostream>
#include <cstdint>
#include <vector>
int main() {
constexpr size_t fps = 25;
constexpr size_t w = 320;
constexpr size_t h = 240;
constexpr size_t duration = fps * 5;
constexpr size_t size = w * h;
auto buffer = std::vector<uint8_t>(size);
size_t state = 0;
#ifdef WIN32
setmode(fileno(stdout), O_BINARY);
#endif
while (state < duration) {
for (size_t y = 0; y < h; ++y)
for (size_t x = 0; x < w; ++x)
buffer[y * w + x] = (((x + state) ^ y) + state) % 256u;
++state;
std::cout.write(reinterpret_cast<char*>(buffer.data()), size);
}
}
Сборка и запуск:
g++ -Wall -O2 main.cpp -o prog
prog | ffmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -framerate 25 -i pipe: out.mkv
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <malloc.h>
typedef uint8_t byte;
int main() {
const int fps = 25;
const int w = 320;
const int h = 240;
const int duratuion = fps * 5;
const int size = w * h * sizeof(byte);
byte *buffer = (byte*)malloc(size);
int state = 0;
freopen(NULL, "wb", stdout);
while (state < duratuion) {
for (int y = 0; y < h; ++y)
for (int x = 0; x < w; ++x)
buffer[y * w + x] = (((x + state) ^ y) + state) % 256;
fwrite(buffer, 1, size, stdout);
++state;
}
free(buffer);
}
Cборка и запуск:
gcc -Wall -O2 main.c -o prog
prog | ffmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -framerate 25 -i pipe: out.mkv
Я специально не указывал выходной видео кодек для упрощения команд, но вы можете добавить в ffmpeg опции -vcodec libx264rgb -crf 0
для сохранения видео в lossless качестве. Если вы модернизируете программу и добавите в неё поддержку RGBA цвета, то помните что h264 не умеет сохранять прозрачность в кадрах и вам лучше использовать кодек FFV1.
prog > video.dat
fmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -framerate 25 -i video.dat out.mkv
Это очень простой способ создания видео (для программиста). Если что, в ffmpeg уже встроены некоторые генераторы тестовых видео. Сохраняются ли гигабайты сырых кадров в оперативной памяти при использовании такого способа передачи или же на диске - мне это неизвестно, возможно что у такого способа есть какие-то ограничения на размер передаваемых данных. Помните что в передаваемом потоке данных нет никаких меток синхронизации и если что-то где-то потеряется в пути, то видео всё станет кашей, так что не пытайтесь передавать такой поток через net cat (я не пробовал).
Для наложения эффектов на видео, можно использовать фильтры FFmpeg или Frei0r плагины, но я написал свою программу с CLI и GUI интерфейсом, которая позволяет использовать фильтры из плагинов в многопотоке и отображать результат обработки через SDL2.
Программу вы можете скачать с Гитхаба или Sourceforge. Для Линукса установите зависимости: FFmpeg, SDL2. Если хотите собрать из исходников, то скачайте SCons и последнюю версию компилятора C++
Скачайте API для создания плагинов и поглядите пример фильтра инверсии цвета. В итоге вы получите .so файл, если собираете на Линуксе, и затем вы откроете ваш плагин с помощью SEZE передав путь до него через опцию --plug
. Используйте любую технологию для обработки изображений и любые оптимизации.