Библиотека от AMD стала причиной плохой производительности процессоров AMD в Cyberpunk 2077


    После выхода Cyberpunk 2077 пользователи процессоров AMD заметили, что игра не полностью использует все логические ядра. Выглядело это следующим образом:



    Первоначально «конспирологические теории» базировались на том, что разработчики якобы использовали компилятор Intel C++, способный иногда компилировать код, который работает медленнее на процессорах конкурента (AMD) из-за неполного использования SIMD. Однако игра собрана компилятором Visual Studio. Впоследствии в дизассемблированном коде самой игры был найден фрагмент, проверяющий, запущена ли игра на процессоре AMD или же на другом процессоре — в случае, если игра запускается на процессоре AMD и, если процессор оказывается старше поколения Bulldozer, устанавливающий число потоков игрового планировщика равным числу физических ядер.


    Этот код принадлежит библиотеке AMD GPUOpen cpu-core-counts, можете взглянуть на него:


    // This advice is specific to AMD processors and is
    // not general guidance for all processor
    // manufacturers. Remember to profile!
    DWORD getDefaultThreadCount() {
        DWORD cores, logical;
        getProcessorCount(cores, logical);
        DWORD count = logical;
        char vendor[13];
        getCpuidVendor(vendor);
        if (0 == strcmp(vendor, "AuthenticAMD")) {
            if (0x15 == getCpuidFamily()) {
                // AMD "Bulldozer" family microarchitecture
                count = logical;
            }
            else {
                count = cores;
            }
        }
        return count;
    }

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


    Для современных процессоров Ryzen с включенным SMT подавляющее большинство многопоточных игр и приложений работают лучше, если число потоков равно числу логических ядер. Но у нас есть негативный опыт с небольшим числом игр, когда увеличение числа потоков сверх числа физических ядер, снижает производительность из-за исчерпания доступных исполнительных блоков.

    Но для процессоров поколения Bulldozer мы всегда рекомендуем устанавливать число потоков равным числу логических ядер. Остальные производители (Intel) могут давать свои рекомендации.

    В любом случае, независимо от модели и производителя процессора, мы настоятельно рекомендуем разработчикам провести собственные тесты и принять решение на их основе. Наш пример кода [приведен мной выше], ошибочно осторожничает для процессоров Ryzen и тем самым призывает провести тесты производительности: функция getDefaultThreadCount() привлекает внимание тем, что возвращает значение, равное числу физических ядер.

    Оригинал

    For today’s Ryzen processors with SMT enabled, we’ve found that the vast majority of multithreaded games and applications work and scale really well when managing an active thread pool up to the number of logical cores that the processor supports. However, our experience with a small number of games is that driving a hardware thread pool with more than the number of physical cores can reduce performance, primarily due to contention for available per-core resources by the multiple running hardware threads.


    However, for our own prior generation of Bulldozer-based processors designs, we recommend a default thread count equal to the number of logical processor cores. Other processor vendors are encouraged to provide their own guidance to software developers. AMD does not provide guidance for other processor vendors.


    Therefore no matter the processor or processor vendor, we strongly recommend that you profile your games extensively to make a decision on how to manage your thread pool for the processor designs you’ll find your game code running on. Our sample code, linked below, errs on the side of caution for our Ryzen processors and encourages you to profile: the getDefaultThreadCount() function draws attention to that fact, returning a starting default count equal to the number of physical processor cores on Ryzen.


    Кажется очевидным, что число потоков должно быть равным числу логических ядер процессора. Все дело в том, что код, активно использующий векторные инструкции в любом случае может полностью загрузить все исполнительные блоки ядра, максимально загрузить шину памяти и кэши. Отсюда следует, что использование SMT будет приводить только к ненужному сбросу кэша инструкций, TLB, блока предвыборки кода и предсказателя ветвлений. С другой стороны, «неоднородный код», где работа с памятью происходит в случайных местах будет работать быстрее со включенным SMT, который снизит задержки доступа к памяти.


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


    Логичнее было бы библиотеке всегда рекомендовать число потоков, равное числу логических ядер, и иметь соответствующую документацию, где бы доступно объяснялось, почему в некоторых случаях игнорирование SMT может дать больше производительности. Сама AMD утверждает, что SMT дает прирост производительности в подавляющем большинстве случаев. Библиотеке, на мой взгляд, не помешало бы предоставлять возможность обхода процедуры автоопределения и получать значение числа потоков для планировщика из переменной окружения, чтобы упростить тестирование для разработчиков и позволить пользователям решить возможные проблемы без необходимости перекомпиляции.


    После отключения функции getDefaultThreadCount() использование процессора увеличилось в случае Ryzen 5 1600 с 60% до 85%, Ryzen 5 1400 с 60% до 90%.


    Получается, что сама AMD из-за ошибки в коде занижает производительность своих процессоров в играх относительно Intel. Неизвестно сколько еще игр "неправильно" используют библиотеку и в связи с этим хуже работают на процессорах AMD. Наверное, если бы функция getDefaultThreadCount() всегда возвращала 1, это могло бы заставить разработчика усомниться в корректности ее работы и почитать рекомендации AMD, но комментарий Remember to profile! скорее всего ускользнёт от внимания инженера, занятого более важными задачами, чем точный подбор числа потоков планировщика для каждой модели процессора.


    Мне удалось получить комментарий разработчика игр о том, почему такое случается:


    Проекты настолько большие, что зачастую многое теряется и перестает контролироваться разработчиками. Разработчики совершают такие ошибки потому что в компании для тестирования игры может быть всего две-три типовых конфигурации компьютера и они, как мы понимаем, не покрывают все разнообразие возможных конфигураций. К тому же имеет место быть так называемый синдром «я просто выполняю свою работу (над маленьким куском, а на остальное мне пофиг)». Теоретически все «косяки» можно исправить грамотными схемами управления, но в условиях постоянно меняющихся требований и рынка мы имеем то, что имеем.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 89

      +91
      Заговор оптимизации под процессоры Intel настолько велик, что в нем участвует даже AMD :)
        +2

        еще остались люди которые не забыли, что когда то интел делали хорошие процессоры, адекватные стоимости:)

          0
          Что забавно — многие утверждают, что именно сейчас процы Интел это бестбай за бакс :)
          А у АМД пока и новинки стоят как новинки, и на прошлые модели цены не понижают.
            0
            и на прошлые модели цены не понижают.

            Вы в слове «повышают» ошибку сделали. Сейчас можно только Zen+ по адекватной цене взять, даже Zen2 оверпрайснуты.
              0
              Это смотря что вам нужно получить.
              3600/x — неадекватно цену задрали, так что какой-нибудь 4650G даже может лучше будет. Или 3700PRO по акции в днс за 19,2к продается, в комплект асус 450 про геймс и норм.
              Но в плане 6/12 — сейчас i5 будет получше (опять же, если на 3700pro жаба задушила).
              Если выше, то надо смотреть, но 3950x не под игровые задачи или не только игровые задачи — не переплюнешь. А новое поколение просто добавило топовые железки в линейку по сути. 5700G (5750G?) тот же обещается — так он же просто на процентов 15-20 лучше 3700x на этапе инженерика даже…
              В общем ждем, когда интел выкатит свои 8 ядерники и цену на них, может амд немного подопустит цены…
              sumanai ну, 3700PRO как 8/16 за 19к пока есть в продаже, вроде как лучшее предложение в сегменте конкретном)
          +10

          Magic numbers и сырые строки, конечно удручают.
          А так, всё как у людей.

            +2

            Думаю, надо просто убрать эту функцию и все будет ок. Пусть разработчик пишет свою реализацию на основе модели проца и числа ядер.
            Завтра big.LITTLE может появиться и в windows, в любом случае планировщику приложения надо понимать, что не все ядра имеют одинаковую производительность.

              +1

              Зачем этот костыль в десктопах?
              Десктопам не нужна автономность.

                +10

                Но windows 10 сейчас работает и на ноутбуках и на суперавтономных планшетах. На них уже от батарейки надо во время бодрствования экономить.

                +1

                Windows уже поддерживает big.LITTLE/DynamIQ для ARM и аналогичную схему для x86-64.
                В этом году вышли первые гибридные Intel процессоры Lakefield, и можно даже купить девайсы с ними (Samsung Galaxy Book S).

                  +1

                  По-идее это уже существует в Ryzen 3xxx (видимо, и более новых). Процессор каким-то образом калибруется, в нем определяется самое производительное ядро, а также самые производительные ядра в чиплете (CCX). И эта информация может сообщаться ОС, и Windows умеет использовать информацию для планирования scheduling'а.


                  Скрин из Ryzen-master в котором отмечены эти ядра


                  Заголовок спойлера

                    0

                    Это скорее балансирование каналов памяти в режимах с 2, 4, 8 активными ядрами.
                    Но может и стабильность работы на пиковых частотах как-то тоже прошивается в них, не уверен.


                    UPD: Всё ещё сложнее. Они и оверклокинг, и каналы памяти, и общие кэши, и даже близость учитывают в выборе "любимых" ядер.
                    Вот это особенно порадовало: "CPPC2 deliberately misreports "favored cores" to the Windows scheduler — to build core rotation pairs within localized groups of cores, rather than picking cores from different CCXs or CCDs to build rotation pairs."
                    Но, в целом, это не то же самое, что гетерогенные CPU.

                  +1

                  Про magic numbers ещё можно дискутировать, но смысла в замене “AuthenticAMD” на какой-нибудь AMD_CPU_VENDOR_NAME я вижу ровно 0.

                    –2
                    там еще есть
                    — 13 в «char vendor[13];» — «13 символов в название хватит всем», конечно же
                    — 0x15 в «0x15 == getCpuidFamily()» — ну да, все же помнят полную таблицу cpuid. а печально тут то, что прямо СРАЗУ после этого пришлось вставлять коммент о том, что же это за «0x15» вместо того, чтобы написать некий «CpuidEnum.Bulldozer == getCpuidFamily()» и получить самодокументирующийся код
                      +6
                      если ничего не путаю, то на x86 результат cpuid(0) возвращается на трёх регистрах по 4 байта — это 12 байт и терминирующий ноль, итого 13.
                  +4

                  Только непонятно почему "ошибка"? Это просто такое поведение по умолчанию. Для части задач подходит для части нет. С учётом того что библиотека "для одного приложения" то подход по умолчанию выглядит логичным.

                    +3

                    Ошибка, потому что для подавляющего большинства ситуаций, лучше, если число потоков планировщика равно числу логических ядр. Глупо замедлять 90+% конфигураций.

                      0
                      Подозреваю что когда этот код писался — большинством были Bulldozer'ы.
                        0

                        Я тоже так думал, но статья раскрыла этот вопрос.
                        Похоже, я забыл дать на нее ссылку (

                    –6
                    Я конечно уже давно понимаю, что понимать то что ты пишешь сейчас не модно. И разработчиком может стать даже дворник с 3 классами пту. Но как можно было умудрится в строчке if (0x15 == getCpuidFamily()) увидеть
                    если процессор оказывается старше поколения Bulldozer
                    ? А я объясню как, достаточно просто не включая головы заниматься рерайтингом чужих статей и проигнорировать что в НЫНЕШНЕЙ версии библиотеки, с 2017 года, как раз исправленно, и код выше как раз проверяет на то что процессор обладает модулями, вместо полноценных ядер (процессоры серии fx и прочие bulldozer.). Вот вам коммит github.com/GPUOpen-LibrariesAndSDKs/cpu-core-counts/commit/49a6e7349dd3a73dfc4e85e5192b4c14215151dc

                    Тоесть смысл в том, что раздолбаи из CDPR воспользовались древней версией библиотеки, и вины ни амд, ни интела тут нет.
                    +1

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


                    Это было годами — технология как бы есть, ее продают как фичу более дорогих процов, а описания для желающих узнать — как бы и нет. И только слухи на форумах, под какие задачи лучше включать HT, а под какие выключать.


                    Здесь (в оригинале, конечно) призывается масштабировать ПО на число логических ядер. Те автор верит, чтт лигияеское не худе, чем физическое. Значит ли это, что 2 ядерный процессор вдруг стал 4-ядерным? Очевидно, нет, и все как-то сложнее.


                    Что дает тот же вывод, чтт и в приведенной автором статье — тестируйте!

                      +2

                      Грубо говоря, ядро может выполнять разные типы задач. Допустим, сложение целых чисел и сложение чисел с плавающей запятой. В обычной ситуации эти задачи будут выполняться по очереди. То есть, один из блоков будет простаивать. Логично попробовать загрузить ядро по полной и дать ему обе задачи одновременно. Но подходит такое не для каждого алгоритма. Допустим, в программе нет вычислений с плавающей запятой. Тогда ускорение получить не выйдет.

                        +2
                        Как не дают и ответа, как можно повысить производительностью, исполняя работу для двух ядер на одном.
                        Принцип работы hyperthreading становится гораздо более очевидным, если вспомнить, что одно «ядро» состоит из нескольких разнородных вычислительных блоков, обычно загруженных весьма неравномерно, а тот самый hyperthreading — это по сути просто два конвейера с инструкциями к нему. Таким образом одновременное выполнение двух потоков повышает утилизацию вычислительных блоков одного ядра.
                          0

                          Яблочный М1, кстати, делает это еще агрессивнее: в архитектуре ARM можно иметь SMT сразу в 4 потока. Причем потенциал больше, чем в х86 за счет более простого декодера коменд (из-за однородности их размера).

                            0
                            Ну IBM Power8 на одном ядре умел выполнять 8 потоков, так что всё новое — это хорошо забытое старое)
                            Причем потенциал больше, чем в х86 за счет более простого декодера коменд (из-за однородности их размера).
                            А простота декодера из-за однородности размера команд вполне компенсируется сниженной эффективностью такого кода, требующего большего количества инструкций.
                              0

                              И не только инструкций но и памяти а также пропускной способности канала (и при неудачном предсказании — физического расстояния до планки т.к. скорость света маленькая :( ).

                              +4

                              Конкретно M1 этого не делает. Там нет SMT.

                                –2

                                Да это я на пальцах, тут лучше написано. У Out-of-Order Execution и SMT очень похожие принципы работы.


                                And finally we get to the killer feature of the M1. The biggest and meanest Intel and AMD microprocessor have a total of four decoders busy cutting machine code instructions into micro-ops.
                                But this is no match for the M1, which has an absolutely unheard of number of decoders: Eight. Significantly more than anybody else in the industry. That means it can fill up the instruction buffer much quicker.
                                  +7

                                  Ну нет. Это всё-таки сильно разные вещи — несколько независимых потоков инструкций раскидывать на свободные исполнительные блоки или одним потоком все блоки насыщать.

                            0

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


                            SMT работает немного по-другом, но принцип тот же: определять, какие операции работают на разных блоках и выполнять их одновременно.

                              0
                              Это говорит в первую очередь что вы даже не пытались искать документацию и пытаться понять как это работает.

                              HT нужен в первую очередь для многопоточной задачи. Внутри одного потока HT не поможет никак. Весь смысл HT в том, что в более менее сложной задаче у вас будет дизбаланс или простои ядер связанные с доступом ко внешним ресурсам (сеть, диск). Поток идущий на соседнем логическом ядре может использовать исполнительные устройства, пока «основной» курит в простое.
                              Теперь как это сделано. Фактически дублируются регистры (общие и состояния) для ускорения переключения потоков, а исполнительные устройства сделаны в одном экземпляре. В результате старт-стоп ждущего потока и стоп-старт его соседа делаются намного быстрее, как если бы это делала ОС на уровне планировщика задач.
                                0
                                мне казалось оно чуть сложнее. У ядра есть регистровый файл (и его размер больше, чем количество РОНов и прочего) и уже он делится на двоих. Ещё можно вспомнить, что со времён Pentium внутри ядра несколько конвейеров (U и V были на пне), что позволяло исполнять более одной инструкции за такт. Но дело это не простое и 100% утилизация такой схемы — явление довольно редкое. А вот если эти конвейеры нагрузить разными потоками, то можно добиться более плотной утилизации.
                                  0

                                  Да ни о чем эти не говорит: я не разработчик, а как потребителю и покупателю, преимущества HT со стороны Intel были донесены настолько витиевато, что было похоже, словно бы авторы рекламы сами не знают принципов HT.


                                  А point моего коммента (вы же внимательно его прочли, не только начало?) был ровно в том, что без тестирования говорить о сложных и очень зависимых от задачи вещах, вроде HT, не стоит. Те речь говорить, что логические ядра не все нагружены, как бы громко, но вовсе не факт, что в каждой задаче это плохо.

                                    0
                                    Intel эту HT лицензировала у AMD.
                                    Были и другие HT, от других производителей.
                                    Объяснение HT — кривое, ибо исполняемый код — кривой.
                                    Патч был сделан во времена AM3+, процессоры ряда «строительная техника» имеют не обычные ядра, а модули (первые 2 поколения), и количество ядер для целых чисел и для плавающей точки — разное. А ещё там есть новомодные замены FPU.
                                    Появление такой ошибки говорит о криворукости разрабов игры, ибо для скорости нужно пользовать AVX2 + другие команды, и тогда были бы другие эффекты.
                                    Плюс кривой код от AMD как обыденность.
                                    Отключение HT может увеличивать производительность.
                                    Что где включать или отключать — с этим надо возиться, а никому не охота.
                                  0
                                  Смешно, но поиски, например, информации о том, что такое hyperthreading у Intel особо не дают толковой документации

                                  Может потому что информация перекочевала в википедию и т.п.
                                  ?

                                    0
                                    Тут действительно надо тестировать. Например, escape from tarkov — с НТ бывают мини фризы, которые убираются именно отключением этого НТ. Более того, прямо в игре есть галка «использовать реальные ядра», но именно на амд бывает что не работает, нужно в биосе выключать, и тогда фризы пропадают. И тут уже не важно, даёт ли прирост НТ, с ним существенно падает комфорт игры. Такая вот особенность.
                                      0

                                      Первый ответ по делу на мой коммент, где я писал, что нужно тестировать, потому что логические ядра — не фищические ядра (а разработчики не всегда имеют прямые руки). Спасибо!


                                      Остальным было приятно показать ЧСВ, и рассказать, как HT устроен — т.е. ответить на вопрос, который я не задавал, на который просто не мог найти ответа много лет назад.


                                      И это — Хабр, с его вдумчивой и читающей внимательно публикой (смайлик)!

                                        0
                                        Была ошибка в камнях при работе HT (ранние первые райзены). Исправляется (иногда) обновлением прошивки процессора. Обновите БИОС МП, может, поможет. Проверьте с более новым процессором (Ryzen 1xxx -> 2xxx -> ...).
                                      –2
                                      Вот будет весело (в относительном будущем), если getCpuidVendor вернёт строку длинее 12 символов!
                                      boundchecking, передача максимальной длины в функцию? Нет, не слышали!
                                        +10
                                        cpuid — это команда процессора, которая возвращает 12 байт в трёх 32-битных регистрах
                                          0
                                          SergeyMax, заранее извиняюсь за некоторую назойливость :(.

                                          Сигнатура функции: char* getCpuidVendor(char* vendor);
                                          То, что это 3 int-а (а размер ведь инта высечен в камне, так?) ну как бы пока известно, но что будет через ...? Там, кстати 4 инта, но используются только 3.
                                          В любом случае, такая сигнатура как бы намекает, что может быть по разному.
                                          На мой программистский взгляд это дыра-дырень.

                                          Ну и применены слова «в относительном будущем», т.е. сарказм и всё такое.
                                          В любом случае, извиняюсь за развитие темы.
                                            0

                                            Размер int таки высечен в камне для всех распостранённых data models(хотя плюсовый стандарт и говорит об at least 16 bit для типа int).
                                            Конечно, если собрать для Win16 — он будет 16 бит, но, мне кажется, это будет не самой большой проблемой.

                                              0
                                              BTW, в микроконтроллерах AVR он вполне себе 16 бит. Что вызывает недоумение у некоторых молодых программистов.
                                              А в каком-нибудь TMS320C55x sizeof(int) вообще равен 1 (что равно 16 бит).
                                                +5

                                                ya_frosia: Связка ломов, как правило, тонет.
                                                alexei: ya_frosia: Но в ртути прекрасно плавает.
                                                zoogenic: alexei: Но если ломы урановые, то и во ртути тонут.
                                                alexei: zoogenic: сам топи урановые ломы в ртути.

                                              +3
                                              Прежде чем занудствовать, изучили бы предмет. Не в 3 интах, а именно что в 3 32-битных регистрах EBX, EDX, ECX (in that order)
                                              А массив из 4 интов возвращает уже обертка над инструкцией CPUID. В целом код там сомнительного качества, но строки в 12 символов — это самая маленькая «проблема».
                                                +6
                                                что будет через ...?

                                                Будет getCpuidVendorEx
                                                Никаких пробелм с fixed size строками нет, когда речь идет о функциях подобных этой.
                                                  0

                                                  проще было поместить статический буфер в саму функцию getCpuidVendor. сигнатура и модель процессора меняться не могут.

                                                    0
                                                    Любопытно, как ведёт себя Windows, если отправить систему в гибернацию, заменить процессор, а потом включить.

                                                    P.S. Ещё придумалось: можно ли сейчас на двухпроцессорных рабочих станциях ставить процессоры разной модели. И перебрасывается ли системой процесс между ядрами разных процессоров или только в пределах одного.
                                                    0
                                                    CPUID на запрос вендора процессора возвращает 3 32-битных значения в 3 32-битных регистрах. И так будет всегда и на любом процессоре x86 начиная от первого поддерживающего инструкцию cpuid и заканчивая последним выпущенном x86-совместимым процессором в мире. Если захотят возвращать более длинную строку производителя, то будет введена другая инструкция (или другой код запроса к cpuid). Соответственно, функция этого запроса уже будет называться не getCpuidVendor, а как-то иначе.

                                                    А если забить на обратную совместимость инструкций в x86, то программа просто не дойдёт до этой строчки, так как ей до этого надо исполнить тысячи других инструкций. Гарантия, что cpuid возвращает 12 байт на запрос вендора примерно такая же как, что mov выполняет копирование значения из источника в приёмник.
                                                +3
                                                использование процессора увеличилось — а игра то пошла шустрее?
                                                Физических ядер и так дофига, неужто не хватило?
                                                  0

                                                  Да, пишут что стало заметно лучше. Сам еще не пробовал, у меня R5 1600x, как раз

                                                    0

                                                    вероятно, это актуально только для бюджетных CPU, ryzen 5800x / rtx 3070 упирается в 100% GPU даже при 1080p (в то время как проц загружен на 20-30%)

                                                    0
                                                    После выхода Cyberpunk 2077 пользователи процессоров AMD заметили, что игра не полностью использует все логические ядра.

                                                    … в дизассемблированном коде самой игры был найден фрагмент, проверяющий, запущена ли игра на процессоре AMD…

                                                    Этот код принадлежит библиотеке AMD GPUOpen cpu-core-counts, можете взглянуть на него

                                                    А в других играх, как обстоят дела? AMD GPUOpen cpu-core-counts часто используется в разработке?
                                                      0

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

                                                      0

                                                      Нагрузка в 100% CPU vs 60% CPU это конечно хорошо, но можно привести в статье насколько это влияет на FPS?

                                                        +2
                                                        Значительно, +10-15 у многих, особенно к минимальному. Понятно, что на 5950х патч ускорения не даст, но на стандартных 6-8 ядерных Райзенах с мощной видеокартах эффект виден сразу.
                                                        0
                                                        Комментарий разработчика таки доставил:
                                                        в компании для тестирования игры может быть всего две-три типовых конфигурации компьютера

                                                        Все же надо было взять комментарий у разработчика в КРУПНОЙ компании, коей является CD Projekt(штат — 1044 человека).
                                                        Я полагаю, что этот косяк, как и сотни других связаны с низким уровнем разработки и торопливостью при релизе Cyberpunk 2077. Обвинять AMD в чем-то — это все равно, что взять код со Stackoverflow и обвинять его, что код работает не так, как нужно.
                                                          0
                                                          и торопливостью при релизе Cyberpunk 2077

                                                          А много игр не торопятся к выходу? Я вот могу припомнить Factorio, но это совсем другой жанр и вообще не ААА тайтл.
                                                            –1
                                                            Все же надо было взять комментарий у разработчика в КРУПНОЙ компании

                                                            Человек работает в компании, производящей ААА игры.


                                                            коей является CD Projekt(штат — 1044 человека).

                                                            Но как раз из статьи и становится понятно, что такие промахи случаются даже в крупных компаниях.


                                                            Я полагаю, что этот косяк, как и сотни других связаны с низким уровнем разработки и торопливостью при релизе Cyberpunk 2077

                                                            3,5 бага в релизе и совершенно недосягаемый уровень игры нельзя назвать низким уровнем разработки.

                                                              +2
                                                              и совершенно недосягаемый уровень игры

                                                              Эм, разве? Игра хорошая, не спорю. Но прорыва я не увидел.
                                                                +1

                                                                Чего чего чего????
                                                                3,5 бага?)
                                                                А ты в неё играл?)


                                                                Игра сырая, что аж смотреть на неё больно
                                                                нпс просто маникены, уровень сложность вообще смешон
                                                                Видны «затычки» в механиках игры
                                                                Как тебе соперники в гонках, которые у тебя за спиной телепортируются? Ты сейчас серьезно назвал это шедевром?
                                                                А как тебе вдали невидимый поток машин (Аля пробка), которых ты никогда не догонишь)
                                                                И, кстати, это есть в пустыни, где машин вообще нет
                                                                Все механики 2010 года
                                                                Игра сделана ужасно
                                                                Она очень сырая
                                                                Дак ещё и про общее кол-во багов молчу
                                                                (А ещё о том, что это тупо ведьмак в сеттинге киберпанка, который кстати они даже осилить не смогли, понаприглашать кучу знаменитостей, а где куча отсылок к культуре этой тематике? Нет, мы бадкомедиана заплатим лучше где-то в игре, такой ор)


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

                                                                  +1
                                                                  А самое главное — она скучная блин. Как будто юбисофт какой то. Полтора квеста из сюжетки, и миллион дополнительных абсолютно одинаковых жёлтеньких маркеров на карте.
                                                                    0

                                                                    может под недосягаемым уровнем имеется ввиду заработанное на хайпе бабло?

                                                                  0
                                                                  Тут СХД за сотни килобаксов баксов не стартуют с фирменными SSD некоторых моделей, а вы про игроделов…
                                                                  –2
                                                                  Библиотека на то и библиотека, что ей пользуются как неким готовым объектом. CDPR используют тысячи библиотек, как они могли за всем уследить? Налицо небрежное отношение авторов библиотеки
                                                                    0
                                                                    С одной стороны — да, с другой стороны — это не какая-то скрытая штука, отдел тестирования просто ОБЯЗАН обратить внимание на неполную утилизацию CPU.
                                                                    +1

                                                                    Эта особенность на 99% должна была быть выявлена на ранних этапах тестирования и слабо верится что это случайность.

                                                                      0
                                                                      это геймдев, где особенностей больше, чем волос в бороде у главного разработчика.
                                                                        0

                                                                        Это правило действует когда ты работаешь на готовом движке (UE или Unity), это позволяет тебе немного абстрагироваться.

                                                                      0
                                                                      Ну скорее всего проблема куда глубже. Получить полную загрузку процессоров Ryzen в играх реально тяжело. И теперь понятно почему :)))
                                                                        +1
                                                                        А мы наоборот, на intel в своём использующем OpenCV софте по дефолту делили число ht-ядер пополам чтобы получить число эффективно работающих процессов.
                                                                          0
                                                                          А как применить данную настройку? Ждать патч от разработчиков или можно самим перепатчтить?
                                                                          У меня сложилась проблема при удаленной игре через Parsec Gaming или Steam Remote Play, в игре просто отключены виртуализированные устройства ввода. Молодцы с Reddit сделали самописный патч, и всё заработало.
                                                                          0

                                                                          Заголовок натянут, как сова.
                                                                          Ни черта они толком не тестировали, всё.
                                                                          А иначе электроны виноваты, вместе с Максвеллом )

                                                                            0
                                                                            Написал патчер для Киберпанка. Сигнатуры актуальны на момент написания комментария, как и сама проблема. При запуске патчер подтягивает сигны с репозитория, потому после каждой обновы игры можно не перекачивать сам патчер. Если, конечно, не было какой-то большой переделки.

                                                                            Ссылка на репозиторий: github.com/Pavel3333/Cyberpunk-2077-AMD-Optimization-Patcher
                                                                            Релизы (сейчас актуальная версия v1.01): github.com/Pavel3333/Cyberpunk-2077-AMD-Optimization-Patcher/releases
                                                                              0

                                                                              В 2020 сложно довериться стороннему софту для такого, тем более что в .NET исходниках много мусора и сложно найти код самого патчера.


                                                                              Не очень понимаю, зачем вы тяните скомпилированные .dll в /packages/Newtonsoft.Json.12.0.3/


                                                                              Ну и традиционная шутка: переписать бы это на раст...


                                                                              На всякий случай рекомендую людям патчить .exe вручную HEX-редактором.

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

                                                                                Патчер писал для обычных юзеров, ибо многие даже толком не знают, что за HEX-редакторы и на каких дубах вечнозеленых они растут.

                                                                                Newtonsoft.Json — это NuGet-пакет. С учётом того, что это мой первый за n лет проект на C#, то я проверил, что будет, если не взять папку packages — оказалось, что пакет не подхватится автоматически. Зацепил его на всякий случай.

                                                                                Код патчера старался расположить в самом Patcher.cs, всё остальное — хэндлеры в Patcher.Handlers.cs, сигнатурки в Patcher.Signatures.cs, дизайнер в Patcher.Designer.cs…
                                                                                  0
                                                                                  Наверно патч уже неактуален, так как проблема исправлена разработчиками в 1.05.
                                                                                    0
                                                                                    Нет, всё протестировано вчера на версии 1.05 (с утренней обновы), на 8-ядерных AMD Ryzen 7 2700X нагрузка на половину логических ядер точно такая же, как на скринах в посте. Патч актуален. См. результаты замеров в моём посте
                                                                                      0
                                                                                      Так патч 1.05 включил логические ядра для 4 и 6 ядерных. А для 8+ по их данным выгоды от этого действия в принципе нет. Так что на 2700X картинка измениться и не должна была. Вопрос в том, существенно ли это влияет на ФПС. Вы можете сравнить на вашей конфигурации?

                                                                            Only users with full accounts can post comments. Log in, please.