LINUX.ORG.RU

Сборка модуля ядра

 , , symvers, , сборка модуля


0

2

Решил тут на досуге opemu поковырять маленько.

uname -a
Linux gnu 6.8.9-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.8.9-1 (2024-05-15) x86_64 GNU/Linux
lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux trixie/sid
Release:	n/a
Codename:	trixie
dron@gnu:~/Рабочий-стол/sonc$

Сейчас у меня загружено ядро 6.8.9, в Debian для него нет linux-headers в репе. Поэтому скачал

Распаковал, далее (всё успешно)

cp /boot/config-6.8.9-amd64 ./.config
make oldconfig && make prepare

Далее в Makefile модуля подменил путь

Сам Makefile для наглядности

# --force-vermagic
###################################################
MODULE_NAME := op_emu
###################################################
$(MODULE_NAME)-objs := opemu/sse3.o           \
                       opemu/ssse3.o          \
                       opemu/sse41.o          \
                       opemu/sse42.o          \
                       opemu/opemu.o          \
                       opemu/fpins.o          \
                       opemu/trap_hook.o      \
                       opemu/opemu_math.o     \
                       libudis86/syn.o        \
                       libudis86/itab.o       \
                       libudis86/decode.o     \
                       libudis86/udis86.o     \
                       libudis86/syn-att.o    \
                       libudis86/syn-intel.o  \
###################################################
obj-m += $(MODULE_NAME).o
###################################################
KBUILD_CFLAGS += -DDEBUG -g -O2 -march=native \
                                -mtune=native \
                                -mmmx         \
                                -msse         \
                                -msse2        \
###################################################
#KERNEL_PATH ?= /lib/modules/$(shell uname -r)/build
KERNEL_PATH = /home/dron/Рабочий-стол/linux-6.8.9
###################################################
export KBUILD_CFLAGS
###################################################
all:
	make -C $(KERNEL_PATH) M=$(PWD)  modules
#	-rm ./*.order
#	-rm ./*.symvers
#	-rm ./*.mod
#	-rm ./*.o
#	-rm ./*.c
###################################################
clean:
	make -C $(KERNEL_PATH) M=$(PWD) clean
###################################################

Всё ломается на этапе

  CC [M]  /mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/libudis86/udis86.o
  CC [M]  /mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/libudis86/syn-att.o
  CC [M]  /mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/libudis86/syn-intel.o
  LD [M]  /mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.o
  MODPOST /mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/Module.symvers
WARNING: Module.symvers is missing.
         Modules may not have dependencies or modversions.
         You may get many unresolved symbol errors.
         You can set KBUILD_MODPOST_WARN=1 to turn errors into warning
         if you want to proceed at your own risk.
WARNING: modpost: "memcpy" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "vsnprintf" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "__fentry__" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "__x86_indirect_thunk_rax" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "_printk" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "__stack_chk_fail" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "kernel_fpu_begin_mask" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "kernel_fpu_end" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "__x86_indirect_thunk_rdx" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: "ftrace_set_filter_ip" [/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko] undefined!
WARNING: modpost: suppressed 11 unresolved symbol warnings because there were too many)
make[3]: *** Нет правила для сборки цели «/mnt/STORAGE/НАБРОСКИ/opemu-linux-непонятно-что-с-лицензией/op_emu.ko», требуемой для «__modfinal».  Останов.
make[2]: *** [/home/dron/Рабочий-стол/linux-6.8.9/Makefile:1854: modules] Ошибка 2
make[1]: *** [Makefile:240: __sub-make] Ошибка 2
make[1]: выход из каталога «/home/dron/Рабочий-стол/linux-6.8.9»
make: *** [Makefile:34: all] Ошибка 2

Как сгенерировать Module.symvers от текущего ядра?

Заранее, тут нету, в смысле нет каталога build что симлинк на /usr/src/linux-headers-6.8.9 котрого тоже нету ибо нет пакета. И где Module.symvers текущего загруженного ядра тогда брать? Типа собирать из исходников со своим конфигом и от туда? А без этого как? Например я хочу собрать модуль для 10ти ядер, которых даже в дистрибутиве нет, что мне каждое собирать? Пока не нагуглил, вот спрашиваю

/lib/modules/6.8.9-amd64$ ls
kernel             modules.builtin.alias.bin  modules.dep.bin  modules.symbols
modules.alias      modules.builtin.bin        modules.devname  modules.symbols.bin
modules.alias.bin  modules.builtin.modinfo    modules.order
modules.builtin    modules.dep                modules.softdep

Давно в таком виде всё это не тыкал, что я упускаю, где что недопонимаю? Сонный уже, колпачок не варит. Вот блин приключения на ровном месте, хехе.

P.S. Чисто для проверки сборки подсунул Module.symvers из /lib/modules/6.9.7-amd64/build, всё успешно собралось, но модуль такой загрузить нельзя понятное дело. Это так, для справки

Косвенно решено:

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 4)

Возможно не в тему, т.к. дело давно было, но ошибки «undefined reference to» при сборке out-of-tree модулей вываливаются из-за отсутствия зависимостей в ядре. Например, твоему модулю нужен другой модуль, которого в твоём ядре нет. Я хз как это решается с бинарными ядрами, но при сборке из сорцов я просто искал в сорцах ядра те символы, на которые он ругается, включал в самом ядре, пересобирал ядро и потом только уже получалось собрать out-of-tree модуль

u5er ★★
()
Ответ на: комментарий от u5er

Я не зря упомянул про

Чисто для проверки сборки подсунул

Всё там собирается, и раньше всё собиралось и работало, но прошло время пообновлялся, старое ядро осталось, а dev пакетов для него уже нету. Вот и котовасия с выкачиваением исходников нужного ядра и работы уже с ними. Мне можно решить проблему легко, просто перезугрузится и всё и у меня вместо 6.8.9 будет 6.9.8 и всё сходу собберётся, модуль загрузится и будет работать. Но ребутаться сейчас не могу. Пока собираю 6.8.9 и возьму Module.symvers от туда, хотя, у дебиана на ядро патчи… может и не прокатит. :( Увидим. Я уже забыл что куда там и зачем, вот и мучаюсь

На 6.8.9 у меня раньше всё работало, там всё что нужно есть.

А undefined reference to это потому что вся инфа про них в Module.symvers которого и нету, я думал его можно сгенерировать просто имея текущее ядро, может и можно, но чот вот не знаю как, поэтому пока компиляю (с дефолтным конфигом это не быстро, ждёмс).

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 4)
Ответ на: комментарий от u5er

Как его может не быть - тут уже 0_0

Ну вот нету. Я фиг знаю, не следил. А так Module.symvers должен лежать в /lib/modules/VERSION/build где каталог build это симлинк на каталог /usr/src/linux-headers-VERSION а он поставляется пакетом отдельным linux-headers-VERSION и пакета нет, видимо как ненужный удалился когда-то. Ну и всё, в репах его нету и Module.symvers поставляемый через всю эту карусель тоже соответственно тоже нету. :( Жопы.

Он генерируется командой make modules_install при сборке ядра.

🤔 Хмь… Ладно, если за час не разберусь то пофиг, завтра можно будет ребутнуться и уже просто собирать как есть. Хотя, хотелось бы без танцев с бубном для любого ядра собирать, а не только для вылизанного и рассортированного по пакетам дистрибутивного. Ну, эт ладна. Отпишусь потом чем всё закончится. Хотел приключений на 20 минут блин, там короче суть то в чём обновилась игра халф лайф блек меса и на тебе illegal instructions, а я хотел допройти, недавно же играл всё нормально было… Вот и захотел op_emu завести и отладить где оно там валится то и на чём конкретно, и запилить ещё одну эмулируюмую инструкцию если надо и поиграть потом, а тут блин опять в компиляцию играть только и получается :D

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Похоже, я маленько приврал. У себя на воиде глянул - тоже этого файла нет. Поставил дженту в чруте и собрал ядро. Этот файл собрался вместе с ядром и расположен он в каталоге /usr/src/linux. В /lib/modules он не копируется при выполнеии make modules_install. Как на бинарных ядрах его собирать я тогда вообще хз.

u5er ★★
()
Ответ на: комментарий от u5er

Собрал тоже… Получил заветный Module.symvers, собрал с ним модуль. А толку то

sudo insmod ./op_emu.ko
[sudo] пароль для dron: 
insmod: ERROR: could not insert module ./op_emu.ko: Invalid module format

Видимо надо собирать прям точно точно как в дебиане, со всеми патчами и прочим, а там нету уже нихрена, поднимать и подбирать из гита дебиановской сальсы нужный коммит для того чтобы все нужные патчи наложить и собрать определённым образом чтобы бит в бит совпадало всё я с ума сойду. Вот и получилось, осталось у меня бинарное ядрышко и к нему нихрена больше ничего :( Ну и хрен с ним что мне больше всех надо чтоль. Удаляю весь хлам, завтра ребутнусь и всё будет изкоробки. Хотя, тут прям рождается мысль, а не собирать ли мне ядро самому, тогда в случае чего у меня уж точно никуда ничего не пропадёт и не будет никаких проблем с воспроизводимой сборкой. Оно же я так понимаю это Module.symvers указывает на адреса в блобе ядра, где что находится, чуть сборка не в ту сторону и уже в Module.symvers всё смещается.

Это всё конечно интересно и хорошо бы разобраться на будущее, но пойду-ка я лучше спать.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

UDP: Ребут, всё собралось, модуль подгрузился, игра запустилась с эмуляцией инструкций, тормозов нет.

Нахера и где именно в BlackMesa впихнули ssse3 непонятно пока, так что она теперь на Phenom II x6 не запускается просто так…

Надо попозже багу зарепортить.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

А undefined reference to это потому что вся инфа про них в Module.symvers которого и нету, я думал его можно сгенерировать просто имея текущее ядро

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

PRN
()
Ответ на: комментарий от anonymous

Пока руки не дошли :( А у тебя какая программа об это спотыкается? У меня цель cs2 провести через этот барьер.

Есть пример, но там немного не то, через kvm, хотя общий принцип куда и что понятен. И в лучших традициях всё без лицензии, смотри мол, но не трогай. Но опять же, там и трогать то нечего. Я сначала у себя локально побидю проблемы всякие, в том числе 100500 варнингов, подом там нужно ещё инструкций запилить и некоторые вещи переделать. А уже потом опять предприму попытку над cpuid.

И я блин очень надеюсь что там раздуплятся по поводу того под какой же всё же лицензией код то блин под GPL под APL и какие точно куски под MIT во всё этом. Сейчас там мешанина под двумя взаимоисключающими лицензиями :(

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ну, я пока па попытку запуска Deus Ex: Mankind Divided переключился. Запустить получилось, но там пока вечная загрузка, где то с SSSE3 проблемы, толь с корректностью, толь со скоростью выполнения, надо ковырять, висит на загрузке.

Возникла ещё одна идея, а именно отказаться от этого модуля ядра и запилить чуть иное, брать бинарь, автоматически выискивать там всякие SIMD вырезать их затем генерировать для этого кусочка который например на SSE4.2 кусочек на SSE4A (или иное в зависимости от проца на хосте) и засовывать обратно в бинарник. Типа автопатчилка. Таким образом не нужно будет никакого оверхеда на 100500 переключений контекстов в ядре, перехвата и прочего, просто «пересборка» бинаря под нативные инструкции и в теории всё заработает просто влёт с нулевым оверхедом. Но там свои проблемы, когда программа просто программа это ещё ладно, но если это библиотека, то всё, у меня лапки я не знаю что делать. Есть ещё вариант, перенести перехват на пользовательский уровень…

Да и всё это сложно очень. Если тыкаться как я раз в месяц по часу, тут лет 500 надо чтобы что-то вышло, да и понималки у меня не хватает. Эхъ… Ладна. Ну хоть палочкой тыкать интересно и норм.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А причём тут настоящий sse4? Суть в том чтобы исполнить тоже самое но просто на других инструкциях, это просто пример. Вот есть

pmaxud %xmm0 %xmm1
pminud %xmm0 %xmm1

Можно это перехватить и обработать вот так (тут на ssse3_t не гляди)

void pmaxud(ssse3_t *this)
{
    uint32_t * temp1 = this->src.uint32;
    uint32_t * temp2 = this->dst.uint32;

    this->res.int32[0] = (temp1[0] > temp2[0]) ? temp1[0] : temp2[0];
    this->res.int32[1] = (temp1[1] > temp2[1]) ? temp1[1] : temp2[1];
    this->res.int32[2] = (temp1[2] > temp2[2]) ? temp1[2] : temp2[2];
    this->res.int32[3] = (temp1[3] > temp2[3]) ? temp1[3] : temp2[3];
}

void pminud(ssse3_t *this)
{
    uint32_t * temp1 = this->src.uint32;
    uint32_t * temp2 = this->dst.uint32;

    this->res.int32[0] = (temp1[0] < temp2[0]) ? temp1[0] : temp2[0];
    this->res.int32[1] = (temp1[1] < temp2[1]) ? temp1[1] : temp2[1];
    this->res.int32[2] = (temp1[2] < temp2[2]) ? temp1[2] : temp2[2];
    this->res.int32[3] = (temp1[3] < temp2[3]) ? temp1[3] : temp2[3];
}

Или как угодно по иному используя иные инструкции явно, иные, но которые выполнят туже самую работу. Пусть и не напрямую даже. В любом случае тут надо сидеть и корпеть 24/7. Опять же просто подменить инструкции мало, надо ещё выше залезать и менять области туда и как будут загружаться данные.

Это ещё повезёт что будет примерно вот такое (это из теста когда инструкции подменять пытался)


.data
nums0: .long 2, 3, 8, 9
nums1: .long 4, 5, 6, 7

format_str: .asciz "%d, %d, %d, %d\n"
.text
main:
    subq $8, %rsp
    movaps nums0, %xmm0
    movaps nums1, %xmm1
    pmaxud %xmm1, %xmm0       # XMM0 = (XMM0 + XMM1) / 2
    # XMM0 = 4, 5, 8, 9

    # выводим данные на консоль
    movd %xmm0, %esi
    psrldq $4, %xmm0
    movd %xmm0, %edx
    psrldq $4, %xmm0
    movd %xmm0, %ecx
    psrldq $4, %xmm0
    movd %xmm0, %r8d

    movq $format_str, %rdi
    call printf

    addq $8, %rsp
    ret

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

А из SSE4A можно использовать LZCNT/POPCNT/EXTRQ/INSERTQ для реализации того же pmaxud, вернее через маски и сдвиги в EXTRQ/INSERTQ выявлять наибольшее и наименьшее число. Та ещё херня получится запутанная, но SIMD. Или надеяться что компилятор сам всё обернёт в ускорянки хостового процессора, но надо код написать так чтобы он смог это сделать, дать ему подсказки так сказать .

Короче чёрт ногу сломит. Пойду извилину расслаблю, на луве попишу.

P.S. Можно сделать финт ушами и использовать аппаратную виртуализацию KVM и на уровне виртуализации подменять что хочешь и как хочешь без перехвата трапсов ядра и бинарной трансляции, но я только палочкой потыкал, там надо выделять кусок памяти просто туда всё впихивать и от туда этот кусок памяти исполнять попутно манипулируя всем что там есть как угодно, ладно туда что-то обособленное пихнуть, а вот пихнуть туда просто программу… может и можно, но это выше моего понимания как это сделать. Но тоже прикольно было бы. Типа виртуализация для отдельно взятого приложения.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от krasnh

Да.

ты пытаешься

Не пытаюсь, а использую местами успешно, а местами нет =) Но опять же, я лишь дорабатываю где могу уже готовое, не моя разработка. И что боле печальнее даже поделится не могу, там лицензионный ад. Который разрулить 5 минут, но авторам пофиг :(

для обхода ограничений игр?

Нет никакого обхода ограничений. Это просто чтобы программа работала. Для примера дабы понятнее был контекст вот сейчас нейробум все дела, попадётся тебе программа которая неэффективно используя, но включает в себя пару нейроускоряющих инструцкций которые на деле нихрена и не делают практически и их можно заменить на простые операции без потери или даже с выигрышем в производительности, вот ты берёшь и подменяешь их и программа вуаля и просто работает. Конечно бывает и часто что на всяких SIMD ведётся реально обработка больших массивов данных и их эмуляция не приносит ничего кроме тормозов и то из за копировать данных из ядра в юзер и обратно, а не из за вычислений самих часто. Всякое бывает.

Phenom II x6

Фуфыкс вечен, Феном бесконечен!

Просто камень заменить нет смысла, там если менять то всё, разве что БП оставить и корпус, они хорошие ещё. А на это надо с сохранением всего как было, но чтобы лучше тыщ 100 или рядом. Такие богатства мне не ведомы. Ну и фномчик в целом полностью удовлетворяет, за исключением вот некоторых моментов. Ну, эти моменты у всех есть, у одних есть RTX поддержка, у других нет, у одних есть ещё что-то у других нет, тут раз через раз у людей ускорение видео то работает. Пока прям ничего критичного нет и Феномчик тащит (ну или это я так думаю хехе).

«Любишь кататься, люби и саночки возить» :)

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 5)
Ответ на: комментарий от LINUX-ORG-RU

лучше тыщ 100 или рядом

Вот интересно, если взять какого-либо гипотетического юзера, который хочет время от времени поиграть в современные топовые игры, но не хочет вступать в бесконечную гонку вооружений гонку за новым производительным железом, постоянными апгрейдами - выгодно ли пользоваться облачными игровыми сервисами?
Т.е., на одной чаше денежки на собственное топовое железо, которое надо часто апгрейдить, на другой - покупка игровых часов в течении года.


p.s. А для браузинга, музычки, кино и написания кода, достаточно и старого потрепанного ноутбука. ) Или даже Phenom II x6.

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

выгодно ли пользоваться облачными игровыми сервисами?

Если ты готов мириться с (инпут) лагами, или/и играть только в неспешные бродилки и платить за дорогой интеренет и у тебя точно всегда есть интернет и, и, и, и для кого-то может и да. Но просто исполнять программу на своём ПеКа просто тогда когда ты этого захочешь без нужны соответствовать 100500 условиям, да ещё и конфиг если что вручную под себя поменять где это на голову выше и лучше. Опять же, облака, там нет ничего, АААА всякие ладно, но есть тысячи игр клёвых которых там нет. Пробовал я один раз GForce Now, если честно, проблевался. Лютейший инпут лаг, артефакты видеопотока, отстающий звук. Опять же в бродилку какую может и норм будет.

Тут не выгода, а удобство. Лучше уж на железо потратиться один раз в 10 лет, чем на соску подсаживаться. Но опять же тем кто пару раз в год играет тем удобнее просто в браузере открыть любую AAA и гамать.

которое надо часто апгрейдить

Ну, а зачем часто? Конкретно у меня, ну да уже далеко не новое. Но даже я гамаю на этом в игры 2024го года, да порой простые, а порой что-то уровня Amnesia The Bunker и около того. Игры то разные бывают, если у тебя цель играть только в АААААААААААААА игры то, ну может ты к этому так привык что для тебя покупка новой железки это почти как в магаз за хлебом сходить.

Короче, своё железо всегда лучше, а облака это не замена, это просто приколюха. Как на ютубе видосик прохождения смотреть, просто ещё попутно можно управлять с переменным успехом вот и всё. И на своём железе можно не только играть, игры это досуг и лишь часть работы для ПеКа, а не что-то определяющее, хотя и значимое иногда определяющие значимое, но не всегда.

p.s. А для браузинга, музычки, кино и написания кода, достаточно и старого потрепанного ноутбука. )

Ну, как сказать… Если у тебя APU-E350 в нём то тут ещё подумать надо о градациях «старого потрепанного ноутбука». Порой код надо ещё собирать, вот вроде пишу я на луа, да на сишке, а тут надо собрать под андроид и началось…

Или даже Phenom II x6.

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

Я одновременно и хочу обновится и не хочу. Что-то новенькое само по себе интересно тыкать, это да. Но надёжную как топор машинку жалко куда то девать. Хотя чёита я у меня всё равно денях нету. Буду с феномом до гроба походу :D Техпроцесс 60нм там ломаться нечему. Бульдозер.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Но просто исполнять программу на своём ПеКа просто тогда когда ты этого захочешь без нужны соответствовать 100500 условиям

Ты ещё забыл указать, что эти условия не всегда технически обоснованы. По запросу «avx патч» находится довольно много игр, которые после применения этого самого патча нормально играются => инструкции avx просто навязаны по тем или иным причинам.

u5er ★★
()
Ответ на: комментарий от u5er

нормально играются

Обычно после проверки это оказывается 24, если повезёт, 40 фпс с микрофризами.

инструкции avx просто навязаны

Если посмотреть на рекомендуемые системные требования, там давно нету никаких i7-2600 где появился этот avx, а уже требуются аж i7-12700, где все и более новые инструкции просто есть по умолчанию. Т.е. смотрим предыдущий пункт про 24фпс с просадочками.

Хотя действительно с точки зрения издателя казалось бы выгодно максимально расширить список поддерживаемого железа. Тут как обычно очевидно дело не в каких то инструкциях а в макаках называемых программистами, у них же априори какие-от оптимизации это табу, байтодрочерство и «компьютеры щас же быстрые».

anonymous
()
Ответ на: комментарий от anonymous

Обычно после проверки это оказывается 24, если повезёт, 40 фпс с микрофризами.

Стабильные 30 фпс довольно неплохо играются. Особенно в не особо динамичных играх. В любом случае это лучше, чем ничего.

u5er ★★
()
Ответ на: комментарий от anonymous

Ты так говоришь

Я говорю исключительно за себя.

Ну если так ставить вопрос…

А как ещё? Изначально все эти танцы с бубнами затеяны для того, чтоб совместить несовместимое. (Разумеется, я в курсе, что можно пойти и купить новое железо.)

u5er ★★
()