X ray сталкер чистое небо. X-Ray - игровой движок серии STALKER

0) Устанавливаем Visual Studio 2008 SP1 (Proffesional или Team, я собирал в первой), сервис пак из архива engine.vc2008.fixed.rar подходит только к английской версии студии, для русской нужно будет скачать отдельно.

1) Создаём на диске папку, в ней ещё одну папку.

2) В эту папку помещаем только папку engine.vc2008 из архива "engine.vc2008.fixed - фикшенный мною проект vs2008", папку SDK от туда не трогаем.

3) Папку SDK берём из архива "stasvn\sources\engine.vc2005-2008(~1.6.02 бенчмарк) - март 2010", из под-папки sources.
Помещаем её в одну папку к engine.vc2008

4) Вот теперь поверх неё докладываем папку SDK из архива engine.vc2008.fixed.rar, соглашаемся на замену всех файлов

5) Качаем с сайта майкрософт два DirectX SDK - 2009 March и 2010 June. (Вес каждой около 500 мб), можно использовать только версию 2009, но тогда не сможете собрать xrRender_R4. (LINK: fatal error LNK1181: cannot open input file "d3d11.lib"), а если будете использовать только 2010 - игра с R4 не запустится.

После установки двух DX SDK убедитесь что они прописали свои пути в студию, файлы 2010-го СДК должны быть после 2009-го, как показано на рисунке:

Аналогично для разделов Executable files и Include files. Если возникнут вопросы, ищите информацию в гугле по словам "подключение directx sdk visual studio 2008"

При неправильных версиях СДК (или его не-подключении) в логе будет ругань на отсутствие файлов типа d3dXX.lib\.h)
Перемещать папки из уже установленного DirectX SDK никуда не нужно. Достаточно прописать к ним пути глобально для студии (или для каждого проекта вручную)

Комментарий от loxotron: достаточно скопировать и переименовать d3d11_beta.lib в d3d11.lib в папке с директовским сдк, а еще лучше скачать и поставить DX SDK August 2009 и не париться с неподходящими версиями.

6) На всякий случаи можно установить ещё SDK\OpenALwEAX.exe, но не уверен что он критически необходим.

7) Запускаем проект через..\CoP\Project\engine.vc2008\engine.sln. Когда он загрузится, вверху студии режим сборки с Debug_Dedicated (или любой другой) меняем на Release. Далее слева\справа будет список папок с файлами движка, нам нужна, в первую очередь, папка 3rd_party - жмём на неё правой кнопкой мыши и выбираем Build\Построить.

Если всё будет правильно, то в конце лог внизу напишет об 11 успешных проектах (или число будет меньше, если некоторые проекты уже были собраны до этого, лог об этом тоже сообщит "пропущены\up to date") Главное чтобы Ошибок\Fatal везде было 0
У меня собрались полностью все проекты без ошибок. (warning за полноценные ошибки не считаются)

8) По аналогии, сверху вниз, можно собрать другие Dll-ки, папки editor\dedicated\utils\plugins собирать не обязательно - к движку они не относятся. Дольше всего будет собираться xrGame.dll. Остальные достаточно быстро.

Собирать все Dll-ки к слову не обязательно. Можно лишь нужные. Когда они будут готовы - создать чистую папку bin в папке с игрой. Закинуть туда все созданные dll файлы (можно вместе с.pdb). При необходимости, можно докинуть отсутствующие файлы из оригинальной bin ЗП (2-ой патч), если игра будет их требовать. (Навроде wrap_oal.dll)
Игру я запускал с оригинального Stalker-COP.exe

Если всё верно, то в логе\консоли игры в первых строчках будет указан билд игры и дата построения.

X-Ray Engine – это язык программирования, который создан компанией GSC Game World для внутреннего пользования. Все, кто играл в компьютерную игру Сталкер, слышали об этой компании. Официальный движок SDK (Software Development Kit) и исходный код для языка программирования игры используется создателями неофициальных модов.

В процессе создания «Сталкер» - Тень Чернобыля разработчики использовали X-Ray, а также выпустили две версии игры, которые продолжили оригинал: Чистое небо и Зов Припяти. Изменённая версия «движка» использовалась для создания проекта Сталкер 2, но разработка прекратилась ещё в 2011 году.

Назначение

Разработчики игр используют X-Ray Engine для создания новых модов. Сталкер - это многосерийная игра, к которой выпустили очень много модификаций. В помощь разработчикам модов компания GSC Game World создала инструменты SDK. На каждую часть игры выпущено много модов с разным качеством графики и изменениями.

Создатели уникального движка забыли «заверить» его официальными документами. Первые разработчики модов создавали их в полусыром виде. Во время разработок первых модов и написания этого обзора было много инструкций и тематических форумов. Благодаря этим инструкциям, люди общаются и делятся опытом работы с SDK.

Технические характеристики

Финальная версия движка запускается на средстве диагностики и библиотеке DirectX 11. В языке программирования есть поддержка объёмного света и сложных эффектов с дымом, а также он позволяет рендерить сложные игровые сцены и работает с Ragdoll-физикой.

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

Ключевые особенности

  • официальный SDK для создателей модифицированных карт для игры;
  • язык программирования поддерживает библиотеки DirectX 11;
  • создание физики с реалистичным движением и собственной системой ИИ (A-Life);
  • внедрение технологии, которая создаёт рельефные текстуры объектов;
  • поддержка мягких теней и объёмного света;
  • отображение около четырёх млн. полигонов в одном кадре;
  • язык программирования игры не заверен и не распространяется официально;
  • прорисовка сложных игровых сцен и поддержка физики нового поколения.

Решил хоть чем-то занять вас и рассказать вам(или напомнить)про движок игры серии STALKER...

X-Ray - игровой движок, созданный украинским разработчиком компьютерных игр GSC Game World для игры S.T.A.L.K.E.R.: Тень Чернобыля. Движок был представлен общественности ещё в 2001 году. Изначально он был ориентирован на DirectX 8, но впоследствии многократно дорабатывался, чтобы соответствовать своему времени.

Таким образом в нём появилась поддержка DirectX9, а с выходом S.T.A.L.K.E.R.: Clear Sky добавился и DirectX 10. После выхода патча 1.5.07 для S.T.A.L.K.E.R.: Clear Sky в игре появилась поддержка DirectX 10.1. В S.T.A.L.K.E.R.: Зов Припяти в движке появилась поддержка DirectX 11.

Над движком работали программисты Олесь Шишковцов и Александр Максимчук (они же работали в 4A Games над проектом Metro 2033 по одноимённой книге Дмитрия Глуховского).

Характеристики и особенности движка

Графический движок
Графический движок, основной компонент игрового движка «X-Ray», использует технологию отложенного освещения и затенения (англ. Deferred shading), которая позволяет достичь высокой достоверности в рендеринге освещения при высокой геометрической сложности сцены. Поддерживается рендеринг в высоком динамическом диапазоне с плавающей запятой.

Изначально движок был ориентирован на DirectX 8, но впоследствии он многократно дорабатывался, чтобы соответствовать своему времени. Таким образом в нём появилась поддержка DirectX 9, и в игре S.T.A.L.K.E.R.: Тень Чернобыля пользователь мог в графических опциях игры выбирать тип графического API. В версии движка X-Ray 1.5, которая появилась в игре S.T.A.L.K.E.R.: Чистое небо 2008 года выхода, разработчики добавили Direct3D 10. Патч 1.5.07 к этой игре добавил в движок поддержку Direct3D 10.1.

9 сентября 2009 года старший маркетинговый менеджер AMD-ATi Ян МакНоутон (англ. Ian “Cabrtosr” McNaughton) в своём блоге опубликовал статью «DirectX 11 – What to expect!», в которой описал преимущества и основные особенности Direct3D 11. В этой статье он заявил, что «S.T.A.L.K.E.R.: Зов Припяти», наряду с «BattleForge» и «Colin McRae: Dirt 2», будет использовать DirectX 11.

Таким образом, последняя версия движка (1.6) поддерживает следующие версии Direct3D:

* DirectX 8 (шейдерная модель 1.1)
* DirectX 9 (шейдерная модель 2.0)
* DirectX 9.0с (шейдерная модель 3.0)
* Direct3D 10 (шейдерная модель 4.0)
* Direct3D 10.1 (шейдерная модель 4.1)
* Direct3D 11 (шейдерная модель 5.0)

Графический движок поддерживает рендеринг до 1 000 000 полигонов в кадре. Движок способен качественно рендерить как закрытые, так и открытые пространства, площадь открытых пространств может достигать 4 кв. км. Имеется система динамической смены дня и ночи, поддержка различных погодных эффектов, таких как дождь, ветер, туман.

Система освещения является полностью динамической и попиксельной. Поддерживаются мягкие тени и используется технология Screen Space Ambient Occlusion. Из технологий рельефного текстурирования используются Normal mapping и Parallax mapping.

Из-за особенности реализации технологии отложенного освещения и затенения движок не может одновременно использовать её совместно с полноэкранным сглаживанием.

Физический движок
В «X-Ray» используется свободный физический движок Open Dynamics Engine .

Игровой ИИ
Игровой искусственный интеллект в движке «X-Ray» называется «A-Life» (англ. artificial life - рус. искусственная жизнь).

Суть заключается в том, что персонажи в игре живут своей жизнью и существуют всё время, а не только когда их видит игрок. Это идёт вразрез с привычными оптимизациями, используемыми при разработке игр [...] Мы ввели два термина, характеризующие 2 модели поведения персонажа, отличающихся степенью детализации: оффлайн и онлайн. Оффлайновое поведение персонажа является очень простым с точки зрения детализации: персонаж не отыгрывает анимации, звуки, не управляет активно инвентарём, не строит детализированные сглаженные пути (хотя строит пути по глобальному навигационному графу, но об этом позже) и т.д. Онлайновое поведение напротив имеет полную степень детализации. Т.о. можно считать, что оффлайновое поведение является лодом онлайнового.

В нашей системе пока игрок играет на своём уровне, другие персонажи живут на других уровнях, т.е. находятся в оффлайне, т.е. используют оффлайновое поведение. Более того, в виду большой населённости, не все персонажи в пределах одного уровня имеют онлайновое поведение, а лишь те, кто находится в заданном радиусе от игрока (это может зависеть от уровней, обычно в районе 150 метров) или же по желанию гейм дизайнеров.

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

Далее стоит сказать о навигации объектов в онлайне и оффлайне. У нас в игре есть уровни, для каждого из которых создаётся свой навигационный граф, который используют персонажи для передвижения в онлайне. Мы называем его детальным графом. Для каждого детального графа также создаётся его менее детализированный аналог, вершины которого можно связать с вершинами такого же графа другого уровня/ей. Т.о. после объединения всех таких графов воедино мы получаем граф, который объединяет все уровни. Он и используется персонажами для передвижения в оффлайне. Также им пользуются персонажи в онлайне, когда они выполняют свои стратегические цели. Например, если персонаж в онлайне решил идти на другой уровень, то он строит путь по глобальному графу, затем строит путь по детальному графу своего уровня со своей позиции до точки глобального графа. Если эта точка уже на другом уровне, то он телепортируется туда и автоматически переходит в оффлайн. Для того, чтобы это не происходило на глазах у игрока, мы точки перехода для игровых персонажей ставили дальше точки перехода игрока, где-то «за углом»

Звуковой движок
Звуковой движок использует технологию en:Head-related transfer function (HRTF) для качественной генерации звука. Поддерживается вывод шестиканального (5.1) звука. Звуковые данные сохраняются в медиаконтейнерах MP3, MP2, WMA, ADPCM, Ogg.

Работа с сетью
Движок использует сетевую модель «клиент-сервер» и технологию распределённых вычислений. Движком поддерживается до 32 игроков в одном матче.

Список игр с использованием X-Ray
* S.T.A.L.K.E.R.: Тень Чернобыля (20 марта 2007 года)
* S.T.A.L.K.E.R.: Чистое небо (22 августа 2008 года)
* S.T.A.L.K.E.R.: Зов Припяти (2 октября 2009 года)

Предрелиз S.T.A.L.K.E.R.: Shadow of Chernobyl - X-Ray Engine (из истори)
С реализмом который является главной составляющей игры S.T.A.L.K.E.R., мы знали что нам также придется сфокусировать огромное внимание на разработке реалистичной физической модели для игры. Мы знали что мы можем сделать природу реалистичной с хорошей прорисовкой деталей, но чтобы добраться до следующего уровня, мы чувствовали что нам придется создать новый физический движок для того чтобы сделать геймплей более реалистичным. Чем лучше наш физический движок, тем большее ощущение реализма.

Этот абсолютно новый физический движок позволил нам создать природу в которой обьекты по настоящему интерактивны. Стулья, столы, кирпичи, банки, и многие другие обьекты можно толкнуть, ударить по ним, разрушить их и делать с ними все что можно делать в жизни. На данный момент многие игры ограничивают предметы так называемыми?квестовыми предметам?, S.T.A.L.K.E.R. же убирает эти преграды так что вы можете полностью иследовать мир реалистичных манер. Например если вы наткнулись сподкнулись об какой-нибудь предмет, после чего вы встаете то ваш взгялд будет размазан, вы будете видеть дисперсию света.

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

Возможность поднятия тела будет доступна не только Сталкерам. Большинство существ в игре также обладают интелектом и смогут использовать разные предметы как захотят.
Какие то обьекты вы сможете использовать для атаки противников, в то время как другие вы сможете использовать для защиты от взрывов или от пуль. Но в то же время они могу и не защитить вас от атаки, например не все материалы смогут обеспечить вам защиты от АК-47:-)

Мы уделили много внимания физике тела. S.T.A.L.K.E.R. имеет продвинутую скелетную анимацию которая управляет реалистичностью движений тела на очень высоком уровне детализации. Каждый персонаж в игре состоин из 50 костей. Наш движок опирается на максимальную силу костей, суставов и веса, на равне с другими факторами. Все это будет реагировать на то что, если тело упало или было подстреленно. К примеру если вы были подстрелены несколько раз ваши движения будут намного медленей. Если ваша рука ранена вам будет тяжело прицелиться по врагу.

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

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

Физика это главная часть игры, которая открывает игрокам невиданные возможности интерактивной игры. S.T.A.L.K.E.R. обещает вам высоко-технологический физический движок который даст вам полное ощущение реализма, которого вы еще никогда не видели.

* 300.000 - 3.000.000 полигонов в кадре - чем мощнее у вас видеокарта, тем лучше для вас. С хорошей видеокартой вы увидите очень хорошую картинку и я думаю, останетесь довольны, и не пожалеете о том, что вы выложили кругленькую сумму за эту самую видеокарту. Движок построен таким образом, что он подстраивается под вашу общую систему, чем она лучше у вас, тем движок больше выжимается на всю. Динамические тени и освещение - на счет теней и освещения в игре все продумано, разработчики постарались сделать все на высшем уровне. Если вы видели ролик, который демонстрирует динамические тени и освещение, то вам наверное и так все ясно. Тени от объектов правильно падают на персонажей - согласитесь, еще одна важная деталь. Мощный физический движок - управление техникой, детальные объекты, баллистика пуль, связи в скелете и т.д. - управление техникой сделали на достойном уровне, не забыли про такую деталь. В игре очень хорошо прорисованны все объекты, трава, облака - это не просто грубо нанесенная текстура, а хорошо приросованные объекты, есть очевидцы, которые утверждают, что в игре почти отсутствует или вообще нет так называемого тумана войны. Болистика оружия тоже на достаточно высоком уровне, есть свидетели, которые видели, как на столак разработчиков лежали энциклопедии оружия, также у разработчиков была информация о скорострельности оружия, калибре путь и т.д., все это, то есть реальное поведение ствола, постарались воплотить в игре. У всех живых и не совсем живых сущест Зоны есть скилеты, это значит, что тело не будет таким, как резина, за физику твердых тел в игре твердо отвечает главный физик проета, если бы все то, что происходит в игре с твердыми телами повторилось бы в реальной жизни, то все бы так почти и выглядело. Реалистичный AI - персонажи игры ведут себя адекватно событиям и окружающему миру. Солдаты патрулируют периметр Зоны. Сталкеры путешествуют по Зоне параллельно с игроком, собирая аномальные образования, торгуясь, общаясь и сражаясь, друг с другом. Мутанты увеличивают свою популяцию, мигрируют по Зоне, пожирают друг друга, сталкеров, солдат, отдыхают и спят. Время от времени вы общаетесь с другими персонажами, обмениваетесь с ними различной информацией. Сталкер, владеющий очень хорошим и дорогим артифактом, будет стараться избегать людей, и попытается по быстрее продать или спрятать этот артифакт.

На этом все,спасибо за внимание...

Источник stalker64.net.ru .

Статья взята с: http://stalker.by

Также рекоммендуем:

X-Ray был создан украинской компанией GSC GameWorld для игры S.T.A.L.K.E.R.: Тень Чернобыля. Движок включает рендер с поддержкой DirectX 8.1/9.0c/10/10.1/11, физический и звуковой движки, мультиплеер и систему искусственного интеллекта A-Life. Впоследствии компания создавала движок версии 2.0 для своей новой игры, но разработка была прекращена и исходные коды утекли в сеть.

Проект вместе со всеми его зависимостями легко собирается в Visual Studio 2015. Для проверки использовался исходный код движка версии 1.6 из репозитория на GitHub и статический анализатор кода PVS-Studio 6.04, загрузить который можно по ссылке .

Copy-paste

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

MxMatrix& MxQuadric::homogeneous(MxMatrix& H) const { .... unsigned int i, j; for(i=0; iПредупреждение PVS-Studio : V533 It is likely that a wrong variable is being incremented inside the "for" operator. Consider reviewing "i". mxqmetric.cpp 76

Анализатор обнаружил, что во вложенном цикле for инкрементируется переменная i , а проверяется переменная j , что приводит к бесконечному циклу. Скорее всего, при копировании её просто забыли поменять.
void CBaseMonster::settings_read(CInifile const * ini, LPCSTR section, SMonsterSettings &data) { .... if (ini->line_exist(ppi_section,"color_base")) sscanf(ini->r_string(ppi_section,"color_base"), "%f,%f,%f", &data.m_attack_effector.ppi.color_base.r, &data.m_attack_effector.ppi.color_base.g, &data.m_attack_effector.ppi.color_base.b); if (ini->line_exist(ppi_section,"color_base")) sscanf(ini->r_string(ppi_section,"color_gray"), "%f,%f,%f", &data.m_attack_effector.ppi.color_gray.r, &data.m_attack_effector.ppi.color_gray.g, &data.m_attack_effector.ppi.color_gray.b); if (ini->line_exist(ppi_section,"color_base")) sscanf(ini->r_string(ppi_section,"color_add"), "%f,%f,%f", &data.m_attack_effector.ppi.color_add.r, &data.m_attack_effector.ppi.color_add.g, &data.m_attack_effector.ppi.color_add.b); .... }
Предупреждения PVS-Studio :

  • V581 The conditional expressions of the "if" operators situated alongside each other are identical. Check lines: 445, 447. base_monster_startup.cpp 447
  • V581 The conditional expressions of the "if" operators situated alongside each other are identical. Check lines: 447, 449. base_monster_startup.cpp 449
В данном фрагменте используются подряд несколько одинаковых условных выражений. Очевидно, что необходимо заменить color_base на color_gray и color_add в соответствии с кодом в теле if ветви.
/* process a single statement */ static void ProcessStatement(char *buff, int len) { .... if (strncmp(buff,"\\pauthr\\",8) == 0) { ProcessPlayerAuth(buff, len); } else if (strncmp(buff,"\\getpidr\\",9) == 0) { ProcessGetPid(buff, len); } else if (strncmp(buff,"\\getpidr\\",9) == 0) { ProcessGetPid(buff, len); } else if (strncmp(buff,"\\getpdr\\",8) == 0) { ProcessGetData(buff, len); } else if (strncmp(buff,"\\setpdr\\",8) == 0) { ProcessSetData(buff, len); } }
Предупреждение PVS-Studio : V517 The use of "if (A) {...} else if (A) {...}" pattern was detected. There is a probability of logical error presence. Check lines: 1502, 1505. gstats.c 1502

Как и в предыдущем примере, здесь используются два одинаковых условия (strncmp(buff,"\\getpidr\\",9) == 0 ). Сложно сказать наверняка, является ли это ошибкой или просто недостижимым кодом, но на это точно стоит обратить внимание. Возможно, что здесь должны быть блоки с getpidr /setpidr по аналогии с getpdr /setpdr .
class RGBAMipMappedCubeMap { .... size_t height() const { return cubeFaces.height(); } size_t width() const { return cubeFaces.height(); } .... };
Предупреждение PVS-Studio : V524 It is odd that the body of "width" function is fully equivalent to the body of "height" function. tpixel.h 1090

Методы height() и width() имеют одинаковое тело. Учитывая, что вычисляются размеры граней куба, возможно, ошибки здесь нет. Но лучше переписать метод width() следующим образом:
size_t width() const { return cubeFaces.width(); }

Неправильное использование C++

C++ - замечательный язык, который предоставляет программисту много возможностей… отстрелить себе ногу особо жестоким образом. Неопределённое поведение, утечки памяти и, конечно же, опечатки - об ошибках такого рода пойдёт речь в текущем разделе.

Template struct _matrix33 { public: typedef _matrix33Self; typedef Self& SelfRef; .... IC SelfRef sMTxV(Tvector& R, float s1, const Tvector& V1) const { R.x = s1*(m * V1.x + m * V1.y + m * V1.z); R.y = s1*(m * V1.x + m * V1.y + m * V1.z); R.z = s1*(m * V1.x + m * V1.y + m * V1.z); } .... }
Предупреждение PVS-Studio : V591 Non-void function should return a value. _matrix33.h 435

В конце метода пропущен return *this . По стандарту подобный код приведёт к неопределённому поведению. Так как возвращаемое значение является ссылкой, это, скорее всего, приведёт к падению программы при попытке обратиться к возвращаемому значению.
ETOOLS_API int __stdcall ogg_enc(....) { .... FILE *in, *out = NULL; .... input_format *format; .... in = fopen(in_fn, "rb"); if(in == NULL) return 0; format = open_audio_file(in, &enc_opts); if(!format){ fclose(in); return 0; }; out = fopen(out_fn, "wb"); if(out == NULL){ fclose(out); return 0; } .... }
Предупреждение PVS-Studio : V575 The null pointer is passed into "fclose" function. Inspect the first argument. ogg_enc.cpp 47

Довольно интересный пример. Анализатор обнаружил, что аргумент в вызове fclose равен nullptr , что делает вызов функции бессмысленным. Можно предположить, что должны были закрыть поток in.
void NVI_Image::ABGR8_To_ARGB8() { // swaps RGB for all pixels assert(IsDataValid()); assert(GetBytesPerPixel() == 4); UINT hxw = GetNumPixels(); for (UINT i = 0; i < hxw; i++) { DWORD col; GetPixel_ARGB8(&col, i); DWORD a = (col >> 24) && 0x000000FF; DWORD b = (col >> 16) && 0x000000FF; DWORD g = (col >> 8) && 0x000000FF; DWORD r = (col >> 0) && 0x000000FF; col = (a << 24) | (r << 16) | (g << 8) | b; SetPixel_ARGB8(i, col); } }
Предупреждения PVS-Studio:

  • V560 A part of conditional expression is always true: 0x000000FF. nvi_image.cpp 170
  • V560 A part of conditional expression is always true: 0x000000FF. nvi_image.cpp 171
  • V560 A part of conditional expression is always true: 0x000000FF. nvi_image.cpp 172
  • V560 A part of conditional expression is always true: 0x000000FF. nvi_image.cpp 173
В данном участке кода перепутаны логические и битовые операции. Результат будет не таким, какого ожидал программист: col будет всегда равен 0x01010101 независимо от входных данных.

Правильный вариант:
DWORD a = (col >> 24) & 0x000000FF; DWORD b = (col >> 16) & 0x000000FF; DWORD g = (col >> 8) & 0x000000FF; DWORD r = (col >> 0) & 0x000000FF;
Ещё один пример странного кода:
VertexCache::VertexCache() { VertexCache(16); }
Предупреждение PVS-Studio : V603 The object was created but it is not being used. If you wish to call constructor, "this->VertexCache::VertexCache(....)" should be used. vertexcache.cpp 6

Вместо вызова одного конструктора из другого для инициализации экземпляра будет создан и тут же уничтожен новый объект типа VertexCache . В результате члены создаваемого объекта останутся непроинициализированными.
BOOL CActor::net_Spawn(CSE_Abstract* DC) { .... m_States.empty(); .... }
Предупреждение PVS-Studio : V530 The return value of function "empty" is required to be utilized. actor_network.cpp 657

Анализатор предупреждает, что возвращаемое функцией значение не используется. Похоже, что программист перепутал методы empty() и clear() : empty() не очищает массив, а проверяет, является ли он пустым.

Такие ошибки нередко встречаются в различных проектах. Проблема в том, что имя empty() не очевидно: некоторые воспринимают его как действие - удаление. Для того, чтобы подобной неоднозначности не возникало лучше добавлять глаголы has, is к началу метода: действительно, isEmpty() с clear() сложно перепутать.

Похожее предупреждение:

V530 The return value of function "unique" is required to be utilized. uidragdroplistex.cpp 780
size_t xrDebug::BuildStackTrace(EXCEPTION_POINTERS* exPtrs, char *buffer, size_t capacity, size_t lineCapacity) { memset(buffer, capacity*lineCapacity, 0); .... }
Предупреждение PVS-Studio : V575 The "memset" function processes "0" elements. Inspect the third argument. xrdebug.cpp 104

При вызове memset аргументы перепутали местами и в итоге буфер не обнуляется, как изначально задумывалось. Подобная ошибка может жить в проекте очень долго, так как её очень трудно обнаружить. В таких местах на выручку программисту приходит статический анализатор.

Корректное использование memset :
memset(buffer, 0, capacity*lineCapacity);
Следующая ошибка связана с неправильно составленным логическим выражением.
void configs_dumper::dumper_thread(void* my_ptr) { .... DWORD wait_result = WaitForSingleObject(this_ptr->m_make_start_event, INFINITE); while (wait_result != WAIT_ABANDONED) || (wait_result != WAIT_FAILED)) .... }
Предупреждение PVS-Studio : V547 Expression is always true. Probably the "&&" operator should be used here. configs_dumper.cpp 262

Выражения вида "x != a || x != b" всегда являются истинным. Вероятнее всего вместо оператора || подразумевался оператор &&.

Подробнее об ошибках в логических выражениях можно прочитать в статье "Логические выражения в C/C++. Как ошибаются профессионалы ".
void SBoneProtections::reload(const shared_str& bone_sect, IKinematics* kinematics) { .... CInifile::Sect &protections = pSettings->r_section(bone_sect); for (CInifile::SectCIt i=protections.Data.begin(); protections.Data.end() != i; ++i) { string256 buffer; BoneProtection BP; .... BP.BonePassBullet = (BOOL) (atoi(_GetItem(i->second.c_str(), 2, buffer))>0.5f); .... } }
Предупреждение PVS-Studio : V674 The "0.5f" literal of the "float" type is compared to a value of the "int" type. boneprotections.cpp 54

Анализатор обнаружил сравнение целочисленного значения с вещественной константой. Возможно, что здесь по аналогии должна была использоваться функция atof , а не atoi , в другом случае стоит переписать это сравнение, чтобы оно не выглядело подозрительно. Однако сказать наверняка, является ли этот пример ошибочным или нет, может только разработчик, писавший его.
class IGameObject: public virtual IFactoryObject, public virtual ISpatial, public virtual ISheduled, public virtual IRenderable, public virtual ICollidable { public: .... virtual u16 ID() const = 0; .... } BOOL CBulletManager::test_callback(const collide::ray_defs& rd, IGameObject* object, LPVOID params) { bullet_test_callback_data* pData = (bullet_test_callback_data*)params; SBullet* bullet = pData->pBullet; if((object->ID() == bullet->parent_id) && (bullet->fly_distflags.ricochet_was)) return FALSE; BOOL bRes = TRUE; if (object){ .... } return bRes; }
Предупреждение PVS-Studio : V595 The "object" pointer was utilized before it was verified against nullptr. Check lines: 42, 47. level_bullet_manager_firetrace.cpp 42

Проверка указателя object на равенство nullptr идёт после того, как разыменовали object->ID() . В случае, когда object равен nullptr, это приведёт к падению программы.
#ifdef _EDITOR BOOL WINAPI DllEntryPoint(....) #else BOOL WINAPI DllMain(....) #endif { switch (ul_reason_for_call) { .... case DLL_THREAD_ATTACH: if (!strstr(GetCommandLine(), "-editor")) CoInitializeEx(NULL, COINIT_MULTITHREADED); timeBeginPeriod(1); break; .... } return TRUE; }
Предупреждение PVS-Studio : V718 The "CoInitializeEx" function should not be called from "DllMain" function. xrcore.cpp 205

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

Ошибки в приоритетах

int sgetI1(unsigned char **bp) { int i; if (flen == FLEN_ERROR) return 0; i = **bp; if (i > 127) i -= 256; flen += 1; *bp++; return i; }
Предупреждение PVS-Studio : V532 Consider inspecting the statement of "*pointer++" pattern. Probably meant: "(*pointer)++". lwio.c 316

Ошибка связана с использованием инкремента. Для наглядности перепишем данное выражение, расставив скобки:
*(bp++);
То есть произойдёт сдвиг не содержимого по адресу bp, а самого указателя, что в данном контексте бессмысленно. Ниже по коду есть фрагменты вида *bp += N , из-за чего я и сделал вывод, что это ошибка.

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

Аналогичные предупреждения:

  • V532 Consider inspecting the statement of "*pointer++" pattern. Probably meant: "(*pointer)++". lwio.c 354
  • V532 Consider inspecting the statement of "*pointer++" pattern. Probably meant: "(*pointer)++". lwob.c 80
void CHitMemoryManager::load (IReader &packet) { .... if (!spawn_callback || !spawn_callback->m_object_callback) if(!g_dedicated_server) Level().client_spawn_manager().add(delayed_object.m_object_id,m_object->ID(),callback); #ifdef DEBUG else { if (spawn_callback && spawn_callback->m_object_callback) { VERIFY(spawn_callback->m_object_callback == callback); } } #endif // DEBUG }
Предупреждение PVS-Studio : V563 It is possible that this "else" branch must apply to the previous "if" statement. hit_memory_manager.cpp 368

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

Рекомендация проста - в более-менее сложных ветвлениях расставляйте фигурные скобки.
void HUD_SOUND_ITEM::PlaySound(HUD_SOUND_ITEM& hud_snd, const Fvector& position, const IGameObject* parent, bool b_hud_mode, bool looped, u8 index) { .... hud_snd.m_activeSnd->snd.set_volume(hud_snd.m_activeSnd->volume * b_hud_mode?psHUDSoundVolume:1.0f); }
Предупреждение PVS-Studio : V502 Perhaps the "?:" operator works in a different way than it was expected. The "?:" operator has a lower priority than the "*" operator. hudsound.cpp 108

У тернарного условного оператора приоритет ниже, чем у умножения, поэтому порядок операций будет следующим:
(hud_snd.m_activeSnd->volume * b_hud_mode)?psHUDSoundVolume:1.0f
Очевидно, что правильный код должен выглядеть так:
hud_snd.m_activeSnd->volume * (b_hud_mode?psHUDSoundVolume:1.0f)
Выражения, содержащие тернарный оператор, несколько if-else ветвей или операции И/ИЛИ, - это те случаи, когда лучше поставить лишние скобки.

Аналогичные предупреждения:

  • V502 Perhaps the "?:" operator works in a different way than it was expected. The "?:" operator has a lower priority than the "+" operator. uihudstateswnd.cpp 487
  • V502 Perhaps the "?:" operator works in a different way than it was expected. The "?:" operator has a lower priority than the "+" operator. uicellcustomitems.cpp 106

Лишние сравнения

void CDestroyablePhysicsObject::OnChangeVisual() { if (m_pPhysicsShell){ if(m_pPhysicsShell)m_pPhysicsShell->Deactivate(); .... } .... }
Предупреждение PVS-Studio : V571 Recurring check. The "if (m_pPhysicsShell)" condition was already verified in line 32. destroyablephysicsobject.cpp 33

В данном примере дважды проверяется m_pPhysicsShell . Скорее всего, вторая проверка лишняя.
void CSE_ALifeItemPDA::STATE_Read(NET_Packet &tNetPacket, u16 size) { .... if (m_wVersion > 89) if ((m_wVersion > 89)&&(m_wVersion < 98)) { .... }else{ .... } }
Предупреждение PVS-Studio : V571 Recurring check. The "m_wVersion > 89" condition was already verified in line 987. xrserver_objects_alife_items.cpp 989

Очень странный код. То ли здесь забыли выражение после if (m_wVersion > 89) , то ли целую серию else-if . Данный метод требует более подробного рассмотрения разработчиком проекта.
void ELogCallback(void *context, LPCSTR txt) { .... bool bDlg = ("#"==txt)||((0!=txt)&&("#"==txt)); if (bDlg){ int mt = ("!"==txt)||((0!=txt)&&("!"==txt))?1:0; .... } }
Предупреждения PVS-Studio :

  • V590 Consider inspecting the "(0 != txt) && ("#" == txt)" expression. The expression is excessive or contains a misprint. elog.cpp 29
  • V590 Consider inspecting the "(0 != txt) && ("!" == txt)" expression. The expression is excessive or contains a misprint. elog.cpp 31
В выражениях инициализации переменных bDlg и mt проверка (0 != txt) является избыточной. Если её опустить, выражения станут читаться значительно легче:
bool bDlg = ("#"==txt)||("#"==txt); int mt = ("!"==txt)||("!"==txt)?1:0;

Ошибки в типах данных


Float CRenderTarget::im_noise_time; CRenderTarget::CRenderTarget() { .... param_blur = 0.f; param_gray = 0.f; param_noise = 0.f; param_duality_h = 0.f; param_duality_v = 0.f; param_noise_fps = 25.f; param_noise_scale = 1.f; im_noise_time = 1/100; im_noise_shift_w = 0; im_noise_shift_h = 0; .... }
Предупреждение PVS-Studio : V636 The "1 / 100" expression was implicitly cast from "int" type to "float" type. Consider utilizing an explicit type cast to avoid the loss of a fractional part. An example: double A = (double)(X) / Y;. gl_rendertarget.cpp 245

Значение выражения 1/100 равно 0, так как выполняется операция целочисленного деления. Чтобы получить значение 0.01f, нужно использовать вещественный литерал, переписав выражение: 1/100.0f. Хотя возможно, что данное поведение было предусмотрено автором, и ошибки здесь нет.
CSpaceRestriction::merge(....) const { .... LPSTR S = xr_alloc(acc_length); for (; I != E; ++I) temp = strconcat(sizeof(S),S,*temp,",",*(*I)->name()); .... }
Предупреждение PVS-Studio : V579 The strconcat function receives the pointer and its size as arguments. It is possibly a mistake. Inspect the first argument. space_restriction.cpp 201

Функция strconcat , в качестве первого параметра принимает длину буфера. Буфер S объявлен, как LPSTR , то есть как указатель на строку. sizeof(S) будет равен размеру указателя в байтах, то есть sizeof(char *) , а не количеству символов в строке. Для вычисления длины следует использовать strlen(S) .
class XRCDB_API MODEL { .... u32 status; // 0=ready, 1=init, 2=building .... } void MODEL::build (Fvector* V, int Vcnt, TRI* T, int Tcnt, build_callback* bc, void* bcp) { .... BTHREAD_params P = { this, V, Vcnt, T, Tcnt, bc, bcp }; thread_spawn(build_thread,"CDB-construction",0,&P); while (S_INIT == status) Sleep(5); .... }
Предупреждение PVS-Studio : V712 Be advised that compiler may delete this cycle or make it infinity. Use volatile variable(s) or synchronization primitives to avoid this. xrcdb.cpp 100

Компилятор может убрать проверку S_INIT == status в качестве оптимизации, так как переменная status не модифицируется в цикле. Для того, чтобы избежать подобного поведения, нужно использовать volatile переменные или типы синхронизации данных между потоками.

Аналогичные предупреждения:

  • V712 Be advised that compiler may delete this cycle or make it infinity. Use volatile variable(s) or synchronization primitives to avoid this. levelcompilerloggerwindow.cpp 23
  • V712 Be advised that compiler may delete this cycle or make it infinity. Use volatile variable(s) or synchronization primitives to avoid this. levelcompilerloggerwindow.cpp 232
void CAI_Rat::UpdateCL() { .... if (!Useful()) { inherited::UpdateCL (); Exec_Look (Device.fTimeDelta); CMonsterSquad *squad = monster_squad().get_squad(this); if (squad && ((squad->GetLeader() != this && !squad->GetLeader()->g_Alive()) || squad->get_index(this) == u32(-1))) squad->SetLeader(this); .... } .... }
Предупреждение PVS-Studio : V547 Expression "squad->get_index(this) == u32(- 1)" is always false. The value range of unsigned char type: . ai_rat.cpp 480

Для того, чтобы понять, почему это выражение всегда ложно, вычислим значения отдельных операндов. u32(-1) равен 0xFFFFFFFF или 4294967295. Тип, возвращаемый методом squad->get_index(....) , - u8, следовательно его максимальное значение - 0xFF или 255, что строго меньше, чем u32(-1). Соответственно, значением такого сравнения всегда будет false . Данный код легко исправить, поменяв тип данных на u8:
squad->get_index(this) == u8(-1)
Та же диагностика срабатывает и для избыточных сравнений беззнаковых переменных:
namespace ALife { typedef u64 _TIME_ID; } ALife::_TIME_ID CScriptActionCondition::m_tLifeTime; IC bool CScriptEntityAction::CheckIfTimeOver() { return((m_tActionCondition.m_tLifeTime >= 0) && ((m_tActionCondition.m_tStartTime + m_tActionCondition.m_tLifeTime) < Device.dwTimeGlobal)); }
Предупреждение PVS-Studio : V547 Expression "m_tActionCondition.m_tLifeTime >= 0" is always true. Unsigned type value is always >= 0. script_entity_action_inline.h 115

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

Аналогичное предупреждение:

V547 Expression "m_tActionCondition.m_tLifeTime < 0" is always false. Unsigned type value is never < 0. script_entity_action_inline.h 143
ObjectFactory::ServerObjectBaseClass * CObjectItemScript::server_object (LPCSTR section) const { ObjectFactory::ServerObjectBaseClass *object = nullptr; try { object = m_server_creator(section); } catch(std::exception e) { Msg("Exception [%s] raised while creating server object from " "section [%s]", e.what(),section); return (0); } .... }
Предупреждение PVS-Studio : V746 Type slicing. An exception should be caught by reference rather than by value. object_item_script.cpp 39

Функция std::exception::what() является виртуальной и может быть переопределена в наследуемых классах. В данном примере исключение ловится по значению, следовательно, экземпляр класса будет скопирован и вся информация о полиморфном типе будет потеряна. Обращаться к what() в таком случае бессмысленно. Исключение стоит перехватывать по ссылке:
catch(const std::exception& e) {

Разное

void compute_cover_value (....) { .... float value ; .... if (value < .999f) { value = value; } .... }
Предупреждение PVS-Studio : V570 The "value" variable is assigned to itself. compiler_cover.cpp 260

Переменная value присваивается сама себе. Зачем это делать - непонятно. Возможно, ей должно было быть присвоено другое значение.
void CActor::g_SetSprintAnimation(u32 mstate_rl, MotionID &head, MotionID &torso, MotionID &legs) { SActorSprintState& sprint = m_anims->m_sprint; bool jump = (mstate_rl&mcFall) || (mstate_rl&mcLanding) || (mstate_rl&mcLanding) || (mstate_rl&mcLanding2) || (mstate_rl&mcJump); .... }
Предупреждение PVS-Studio : V501 There are identical sub-expressions "(mstate_rl & mcLanding)" to the left and to the right of the "||" operator. actoranimation.cpp 290

Вероятнее всего здесь просто лишняя проверка mstate_rl & mcLanding , но часто подобные предупреждения сигнализируют об ошибке в логике и нерассмотренных значениях enum.

Аналогичные предупреждения:

  • V501 There are identical sub-expressions "HudItemData()" to the left and to the right of the "&&" operator. huditem.cpp 338
  • V501 There are identical sub-expressions "list_idx == e_outfit" to the left and to the right of the "||" operator. uimptradewnd_misc.cpp 392
  • V501 There are identical sub-expressions "(D3DFMT_UNKNOWN == fTarget)" to the left and to the right of the "||" operator. hw.cpp 312
RELATION_REGISTRY::RELATION_MAP_SPOTS::RELATION_MAP_SPOTS() { .... spot_names = "enemy_location"; spot_names = "enemy_location"; .... }
Предупреждение PVS-Studio : V519 The variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 57, 58. relation_registry.cpp 58

Анализатор обнаружил, что одной переменной присваиваются подряд два значения. В данном случае похоже, что это просто мёртвый код и его стоит удалить.
void safe_verify(....) { .... printf("FATAL ERROR (%s): failed to verify data\n"); .... }
Предупреждение PVS-Studio : V576 Incorrect format. A different number of actual arguments is expected while calling "printf" function. Expected: 2. Present: 1. entry_point.cpp 41

В функцию printf передаётся недостаточное количество аргументов: формат "%s" указывает на то, что должен быть передан указатель на строку. Такая ситуация может привести к ошибке доступа к памяти и экстренному завершению программы. Добавить метки

    Содержание
  • Lada XRAY, наряду с моделью Vesta, отныне можно назвать новой надеждой и опорой АвтоВАЗа. Именно эти автомобили представляют лицо компании и новый виток в ее развитии. Неудивительно, что разработка нового хэтчбека Икс Рей велась со всей тщательностью. Причем особое внимание было уделено не только внешности, но и технической составляющей. А двигатель, как известно, есть «сердце автомобиля», так что моторы всегда были в приоритете инженеров компании.

    Краткая характеристика двигателей Лада Икс Рей.

    Список двигателей Лада Икс Рей

    Всего хэтчбек получит три мотора, причем пару отечественных агрегатов разбавили одним «заморским». Перечень двигателей:

    Технические характеристики и конструктивные особенности

    Все силовые агрегаты новой модели вполне современны и отвечают всем нынешним критериям, которые предъявляются для данного сегмента.

    ВАЗ-21129

    Это отечественный бензиновый двигатель, выпускающийся достаточно давно и устанавливаемый также на другие модели АвтоВАЗа, в том числе и Лада Веста.

    • объем – 1 596 см³;
    • конфигурация – рядный;
    • расположение – поперечно;
    • число цилиндров – 4;
    • число клапанов – 16;
    • max мощность – 106 л. с. (78,2 кВт) на 5 800 оборотах/мин;
    • max крутящий момент – 148 Нм на 4 200 оборотах;
    • привод ГРМ – ремень;
    • динамика – 11.4 сек.;
    • max скорость – 176 км/ч;
    • степень сжатия – 11 ед.;
    • диаметр цилиндра – 82 мм;
    • ход поршня – 75.6 мм;
    • экологические нормы – Euro-5;
    • горючее – АИ-95;
    • расход топлива (город/трасса/смешанный режим) – 9.3 л/7.2 л/5.9 л.
    • Потенциал – 400+ л. с.
    • Без потери ресурса – 150 л. с.

    Двигатель Икс Рей ВАЗ 21129.

    Двигатель Лада Икс Рей ВАЗ-21129 был создан на основе мотора серии ВАЗ-21127, который предназначается для модели Приора. В него был внесен ряд изменений и усовершенствований. Наиболее существенными являются применение комплекса заслонок во впускном коллекторе, посредством которых изменяется его длина, что гарантирует работу на низких и высоких оборотах в оптимальном режиме. Кроме того, в конструкции двигателя инженеры отказались от датчика массового расхода воздуха. Вместо него были поставлены два других устройства – это датчики температуры воздуха и абсолютного давления. Подобное решение обеспечивает возможность более полного контроля над горючей смесью, а еще ликвидирует вероятность «плавания» оборотов в режиме холостого хода.

    За привычным всем объемом в 1.6 л и 16-ю клапанами скрывается множество нюансов.

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

    В данном сюжете подробно рассказывается о двигателе ВАЗ 21129:

    HR16DE

    Двигатель Renault-Nissan H4M-HR16DE был предоставлен партнерами АвтоВАЗа из Alliance Renault Nissan. Он выпускается достаточно давно и успешно устанавливается на множество иных моделей французской и японской компаний – это Nissan Tiida, Nissan Wingroad, Nissan Note, Lada Vesta, Nissan Qashqai и другие.

    Двигатель Икс Рей серии HR16DE во всей красе.

    • объем – 1 598 см³;
    • конфигурация – рядный;
    • расположение – поперечно;
    • число цилиндров – 4;
    • число клапанов – 16;
    • тип питания – распределенный впрыск горючего с электронным управлением;
    • max мощность – 110 л. с. (81 кВт) на 5 500 оборотах/мин;
    • max крутящий момент – 150 Нм на 4 000 оборотах;
    • привод ГРМ – цепь;
    • динамика – 11.1 сек.;
    • max скорость – 181 км/ч;
    • степень сжатия – 10.7 ед.;
    • диаметр цилиндра – 76 мм;
    • ход поршня – 88 мм;
    • экологические нормы – Euro-4/5;
    • горючее – АИ-92/95;
    • расход топлива (город/трасса/смешанный режим) – 8.9 л/6.8 л/5.6 л.
    • Потенциал – 150+ л. с.
    • Без потери ресурса – 125 л. с.

    У этого силового агрегата Лада Икс Рей имеется несколько особенностей. Наиболее характерной является снижение мощности – если на прочих моделях она варьируется со 114 до 118 л. с., то в случае с Икс Реем ее уменьшили до 110 л. с., что было сделано в целях адаптации данного двигателя под реалии России и прочих стран СНГ.

    Применение цепи в приводе ГРМ делает его априори надежнее.

    Так, вместо привычного для владельцев Лада ремня, в его конструкции применена цепь, что значительно повышает надежность, ведь она не рвется, да и растягивается нескоро. Модных нынче гидрокомпенсаторов не имеется – вместо них обычные регулируемые клапана. Впрочем, процедура регулировки толкателя не потребуется ранее 80 000 — 100 000 км. В числе прочих особенностей можно выделить использование комплекса изменения фаз газораспределения, фиксацию фазовращателя непосредственно на впускном валу, наличие пары форсунок в каждом цилиндре, а еще применение дроссельной заслонки электронного типа.

    Отказ от гидрокоменсаторов оборачивается необходимостью регулировки клапанов.

    Кроме того, в процессе модернизации были уменьшены показатели трения компонентов силового агрегата Лада Икс Рей. Это было достигнуто за счет использования фторового покрытия в направляющей цепи, полировки (зеркальной), а также механической обработки коленчатого вала. На холостом ходу были уменьшены потери (топливные и насосные), что обеспечивается путем наращивания угла преобразования C-VTС, а также посредством пересчета управления (временного).

    ВАЗ-21179

    Это новый отечественный двигатель, разрабатывавшийся специально для моделей Икс Рей и Веста. В качестве основы для него был выбран силовой агрегат серии ВАЗ 21126, от которого позаимствовали блок цилиндров. Однако этим их сходство и заканчивается.

    Самый мощный в линейке — двигатель ВАЗ-21179.

  1. объем – 1 774 см³;
  2. конфигурация – рядный;
  3. расположение – поперечно;
  4. число цилиндров – 4;
  5. число клапанов – 16;
  6. тип питания – распределенный впрыск горючего с электронным управлением;
  7. max мощность – 122 л. с. (90 кВт) на 6 050 оборотах/мин;
  8. max крутящий момент – 170 Нм на 3 750 оборотах;
  9. привод ГРМ – ремень;
  10. число распределительных валов – 2 (тип DOHC);
  11. динамика – 10.9 сек.;
  12. max скорость – 186 км/ч;
  13. степень сжатия – 9.8 ед.;
  14. ход поршня – 84 мм;
  15. экологические нормы – Euro-5;
  16. горючее – АИ-95;
  17. расход топлива (город/трасса/смешанный режим) – 8.6 л/6.8 л/5.8 л.
  • Потенциал – нет данных;
  • Без потери ресурса – нет данных.

Этот двигатель Лада Икс Рей разительно отличается от прочих ВАЗовских моторов. В конструкции силового агрегата была использована новая дроссельная заслонка, лишенная механического привода, головку блока цилиндров укомплектовали новыми клапанами (облегченными) от Mahle, а еще к регулятору фаз подвели дополнительные масляные каналы.

Дроссельная заслонка лишена механического привода.

Больший ход поршней обеспечил наращивание рабочего объема, коленвал характеризуется повышенным радиусом кривошипа, а входные каналы коллектора от Экоальянса (Россия) увеличены в диаметре до 39 мм. Кислородный датчик поставляется компанией Bosch, а кислородный насос – фирмой GMB (Корея). Эта же корейская компания ответственна за поставки маслонасоса, отличающегося повышенной производительностью.

У коленвалов увеличен радиус кривошипа.

От бренда Federal Мogul поступает шатунно-поршневая группа (облегченного типа), а немецкая компания INA поставляет автоматы натяжения зубчатого ремня, оснащенные парой роликов. Топливная рампа закупается у концерна Continental. Его форсунки характеризуются выросшей производительностью, в результате чего распыл специально подгонялся под работу нового двигателя Икс Рей.

Сами распределительные валы поступают из Кореи.

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

На видео показан процесс сборки нового 1.8-литрового двигателя для Лада Икс Рей: