Error del motor de rayos X: descripción y solución de problemas

X-Ray fue creado por la empresa ucraniana GSC GameWorld para el juego S.T.A.L.K.E.R.: Shadow of Chernobyl. El motor incluye renderizado con soporte para DirectX 8.1/9.0c/10/10.1/11, motores de física y sonido, multijugador y el sistema de inteligencia artificial A-Life. Posteriormente, la empresa creó la versión 2.0 del motor para su nuevo juego, pero el desarrollo se detuvo y los códigos fuente se filtraron en línea.

El proyecto, junto con todas sus dependencias, se ensambla fácilmente en Visual Studio 2015. Para las pruebas utilizamos el código fuente del motor versión 1.6 del repositorio de GitHub y el analizador de código estático PVS-Studio 6.04, que se puede descargar desde enlace.

Copiar pegar

Primero, veamos los errores asociados con la copia de código. El escenario de su aparición en diferentes casos suele ser similar: copiaron el código, cambiaron algunas de las variables y olvidaron algunas. Estos errores pueden propagarse rápidamente a través del código base y, sin un analizador estático, es muy fácil pasarlos por alto.

MxMatrix& MxQuadric::homogéneo(MxMatrix& H) const ( .... unsigned int i, j; for(i=0; i Advertencia PVS-Studio: V533 Es probable que se esté incrementando una variable incorrecta dentro del operador "for". Considere revisar "i". mxqmetric.cpp 76

El analizador detectó que en un bucle anidado para la variable se incrementa i, y se comprueba la variable j, lo que conduce a un bucle infinito. Lo más probable es que simplemente se olvidaron de cambiarlo al copiar.
void CBaseMonster::settings_read(CInifile const * ini, sección LPCSTR, 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); .... )
Advertencias de PVS-Studio:

  • V581 Las expresiones condicionales de los operadores "if" situados uno al lado del otro son idénticas. Líneas de verificación: 445, 447. base_monster_startup.cpp 447
  • V581 Las expresiones condicionales de los operadores "if" situados uno al lado del otro son idénticas. Líneas de verificación: 447, 449. base_monster_startup.cpp 449
En este fragmento se utilizan varias expresiones condicionales idénticas seguidas. Obviamente hay que cambiarlo base_color en color gris Y color_añadir según el código en el cuerpo si sucursales .
/* procesar una sola declaración */ 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); ) )
Advertencia PVS-Studio: V517 Se detectó el uso del patrón "si (A) (...) si no (A) (...)". Existe una probabilidad de presencia de error lógico. Líneas de verificación: 1502, 1505. gstats.c 1502

Como en el ejemplo anterior, aquí se utilizan dos condiciones idénticas ( strncmp(buff,"\\getpidr\\",9) == 0). Es difícil decir con certeza si se trata de un error o simplemente de un código inalcanzable, pero definitivamente vale la pena prestarle atención. Es posible que haya bloques con obtenerpidr/setpidr por analogía con obtenerpdr/setpdr.
clase RGBAMipMappedCubeMap ( .... size_t height() const ( return cubeFaces.height(); ) size_t width() const ( return cubeFaces.height(); ) .... );
Advertencia PVS-Studio: V524 Es extraño que el cuerpo de la función "ancho" sea totalmente equivalente al cuerpo de la función "alto". tpixel.h 1090

Métodos altura() Y ancho() tener el mismo cuerpo. Teniendo en cuenta que se están calculando las dimensiones de las caras del cubo, es posible que aquí no haya ningún error. Pero es mejor reescribir el método. ancho() de la siguiente manera:
size_t ancho() const (retorna cubeFaces.width(); )

Mal uso de C++

C++ es un lenguaje maravilloso que le da al programador muchas oportunidades... de pegarse un tiro en el pie de una manera particularmente cruel. Comportamiento indefinido, pérdidas de memoria y, por supuesto, errores tipográficos: errores de este tipo se analizarán en la sección actual.

Plantilla estructura _matrix33 (público: typedef _matrix33 Ser; 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); ) .... )
Advertencia PVS-Studio: V591 La función no nula debe devolver un valor. _matriz33.h 435

Al final del método se omite. devolver *esto. Según el estándar, dicho código dará lugar a un comportamiento indefinido. Dado que el valor de retorno es una referencia, lo más probable es que esto provoque que el programa se bloquee al intentar acceder al valor de retorno.
ETOOLS_API int __stdcall ogg_enc(....) ( .... ARCHIVO *in, *out = NULL; .... input_format *format; .... in = fopen(in_fn, "rb"); if(in == NULL) devuelve 0; formato = open_audio_file(in, &enc_opts); if(!format)( fclose(in); devuelve 0; ); out = fopen(out_fn, "wb"); if(out == NULL) ( fclose(out); devolver 0; ) .... )
Advertencia PVS-Studio: V575 El puntero nulo se pasa a la función "fclose". Inspeccione el primer argumento. ogg_enc.cpp 47

Un ejemplo bastante interesante. El analizador detectó que el argumento en la llamada cerrar es igual nulo, lo que hace que la llamada a la función sea inútil. Se puede suponer que la corriente debería haberse cerrado. en.
void NVI_Image::ABGR8_To_ARGB8() ( // intercambia RGB por todos los píxeles afirmar(IsDataValid()); afirmar(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 = (una<< 24) | (r << 16) | (g << 8) | b; SetPixel_ARGB8(i, col); } }
Advertencias de PVS-Studio:

  • V560 Una parte de la expresión condicional siempre es verdadera: 0x000000FF. nvi_image.cpp 170
  • V560 Una parte de la expresión condicional siempre es verdadera: 0x000000FF. nvi_image.cpp 171
  • V560 Una parte de la expresión condicional siempre es verdadera: 0x000000FF. nvi_image.cpp 172
  • V560 Una parte de la expresión condicional siempre es verdadera: 0x000000FF. nvi_image.cpp 173
En esta sección del código, se mezclan operaciones lógicas y de bits. El resultado no será el que esperaba el programador: columna siempre será igual a 0x01010101 independientemente de los datos de entrada.

Opción correcta:
DWORD a = (col >> 24) & 0x000000FF; DWORD b = (col >> 16) & 0x000000FF; DWORD g = (col >> 8) & 0x000000FF; DWORD r = (col >> 0) & 0x000000FF;
Otro ejemplo de código extraño:
VertexCache::VertexCache() ( VertexCache(16); )
Advertencia PVS-Studio: V603 El objeto fue creado pero no se está utilizando. Si desea llamar al constructor, debe utilizar "this->VertexCache::VertexCache(....)". vertexcache.cpp 6

En lugar de llamar a un constructor desde otro para inicializar una instancia, se creará un nuevo objeto de tipo y se destruirá inmediatamente. Caché de vértice. Como resultado, los miembros del objeto creado permanecerán sin inicializar.
BOOL CActor::net_Spawn(CSE_Abstract* DC) ( .... m_States.empty(); .... )
Advertencia PVS-Studio: V530 Es necesario utilizar el valor de retorno de la función "vacía". actor_network.cpp 657

El analizador advierte que el valor devuelto por la función no se utiliza. Parece que el programador confundió los métodos. vacío() Y claro(): vacío() no borra la matriz, pero comprueba si está vacía.

Estos errores suelen ocurrir en varios proyectos. El problema es que el nombre vacío() No es obvio: algunos lo perciben como una acción: la eliminación. Para evitar que surja tal ambigüedad, es mejor agregar los verbos has, is al comienzo del método: de hecho, esta vacio() Con claro() difícil de confundir.

Advertencia similar:

V530 Es necesario utilizar el valor de retorno de la función "única". uidragdroplistex.cpp 780
size_t xrDebug::BuildStackTrace(EXCEPTION_POINTERS* exPtrs, char *buffer, size_t capacidad, size_t lineCapacity) ( memset(buffer, capacidad*lineCapacity, 0); .... )
Advertencia PVS-Studio: V575 La función "memset" procesa elementos "0". Inspeccione el tercer argumento. xrdebug.cpp 104

al llamar conjunto de memorias los argumentos se intercambian y, como resultado, el búfer no se restablece como se pretendía originalmente. Un error como este puede permanecer en un proyecto durante mucho tiempo, ya que es muy difícil de detectar. En esos lugares, un analizador estático viene al rescate del programador.

Uso correcto conjunto de memorias:
memset(buffer, 0, capacidad*lineCapacity);
El siguiente error está relacionado con una expresión lógica compuesta incorrectamente.
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)) .... )
Advertencia PVS-Studio: V547 La expresión siempre es verdadera. Probablemente aquí debería utilizarse el operador "&&". configs_dumper.cpp 262

Expresiones como "x != a || x != b" siempre son verdaderas. Lo más probable es que, en lugar del operador || el operador && estaba implícito.

Puedes leer más sobre errores en expresiones lógicas en el artículo "Expresiones lógicas en C/C++. Cómo los profesionales cometen errores".
void SBoneProtections::reload(const share_str& bone_sect, IKinematics* cinemática) ( .... CInifile::Sect &protections = pSettings->r_section(bone_sect); for (CInifile::SectCIt i=protections.Data.begin(); protecciones .Data.end() != i; ++i) ( buffer string256; BoneProtection BP; .... BP.BonePassBullet = (BOOL) (atoi(_GetItem(i->segundo.c_str(), 2, buffer) )>0,5f); .... ) )
Advertencia PVS-Studio: V674 El literal "0.5f" del tipo "float" se compara con un valor del tipo "int". proteccioneshuesas.cpp 54

El analizador detectó una comparación de un valor entero con una constante real. Es posible que aquí, por analogía, se debería haber utilizado la función. atof, pero no atoí, en otro caso, vale la pena reescribir esta comparación para que no parezca sospechosa. Sin embargo, sólo el desarrollador que lo escribió puede decir con seguridad si este ejemplo es incorrecto o no.
clase IGameObject: IFactoryObject virtual público, ISpatial virtual público, ISheduled virtual público, IRenderable virtual público, ICollidable virtual público (público: .... virtual u16 ID() const = 0; .... ) BOOL CBulletManager::test_callback(const collide::ray_defs& rd, objeto IGameObject*, parámetros LPVOID) ( bullet_test_callback_data* pData = (bullet_test_callback_data*)params; SBullet* bala = pData->pBullet; if((objeto->ID() == bala->parent_id) && (bala->fly_dist flags.ricochet_was)) devuelve FALSO; BOOL bRes = VERDADERO; si (objeto)(....) devuelve bRes; )
Advertencia PVS-Studio: V595 El puntero "objeto" se utilizó antes de verificarlo con nullptr. Líneas de verificación: 42, 47.level_bullet_manager_firetrace.cpp 42

verificación de puntero objeto por la igualdad nulo va tras la desreferenciación objeto->ID(). En caso objeto es igual a nullptr, esto hará que el programa falle.
#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; .... ) devuelve VERDADERO; )
Advertencia PVS-Studio: V718 La función "CoInitializeEx" no debe llamarse desde la función "DllMain". xrcore.cpp 205

En cuerpo DllPrincipal No puede utilizar algunas funciones de WinAPI, incluidas CoInitializeEx. Puede verificar esto leyendo la documentación en MSDN. Es imposible dar un consejo definitivo sobre cómo reescribir esta función, pero vale la pena comprender que tal situación es peligrosa, ya que puede provocar un bloqueo mutuo de subprocesos o una terminación anormal.

Errores en las prioridades

int sgetI1(unsigned char **bp) ( int i; if (flen == FLEN_ERROR) devuelve 0; i = **bp; if (i > 127) i -= 256; flen += 1; *bp++; devuelve i ; )
Advertencia PVS-Studio: V532 Considere inspeccionar la declaración del patrón "*pointer++". Probablemente significó: "(*puntero)++". lwio.c 316

El error está relacionado con el uso de incremento. Para mayor claridad, reescribamos esta expresión, colocando paréntesis:
*(pb++);
Es decir, el contenido no se trasladará a la dirección. pb, sino el puntero en sí, que en este contexto no tiene sentido. A continuación en el código hay fragmentos como *pb += N, por lo que llegué a la conclusión de que se trataba de un error.

Colocar paréntesis ayudaría a evitar ese error, lo que haría más claro el orden de los cálculos. Otra buena técnica es utilizar constante para argumentos que no deberían cambiar.

Advertencias similares:

  • V532 Considere inspeccionar la declaración del patrón "*pointer++". Probablemente significó: "(*puntero)++". lwio.c 354
  • V532 Considere inspeccionar la declaración del patrón "*pointer++". Probablemente significó: "(*puntero)++". 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( ), devolución de llamada); #ifdef DEBUG else ( if (spawn_callback && spawn_callback->m_object_callback) ( VERIFY(spawn_callback->m_object_callback == callback); ) ) #endif // DEBUG )
Advertencia PVS-Studio: V563 Es posible que esta rama "else" deba aplicarse a la declaración "if" anterior. hit_memory_manager.cpp 368

En este fragmento la rama demás pertenece al segundo si debido a su asociatividad por la derecha, que no coincide con el formato del código. Afortunadamente, este caso no afecta el funcionamiento del programa, sin embargo, puede complicar el proceso de depuración y prueba.

La recomendación es simple: utilice llaves en ramas más o menos complejas.
void HUD_SOUND_ITEM::PlaySound(HUD_SOUND_ITEM& hud_snd, const Fvector& posición, const IGameObject* padre, bool b_hud_mode, bool looped, índice u8) ( .... hud_snd.m_activeSnd->snd.set_volume(hud_snd.m_activeSnd->volume * b_hud_mode? psHUDSoundVolume:1.0f); )
Advertencia PVS-Studio: V502 Quizás el operador "?:" funciona de forma diferente a lo esperado. El operador "?:" tiene una prioridad menor que el operador "*". hudsound.cpp 108

El operador condicional ternario tiene menor prioridad que la multiplicación, por lo que el orden de las operaciones es el siguiente:
(hud_snd.m_activeSnd->volumen * b_hud_mode)?psHUDSoundVolume:1.0f
Obviamente el código correcto debería verse así:
hud_snd.m_activeSnd->volumen * (b_hud_mode?psHUDSoundVolume:1.0f)
Hay varias expresiones que contienen el operador ternario. si no ramas u operaciones AND/OR son aquellos casos en los que es mejor poner paréntesis adicionales.

Advertencias similares:

  • V502 Quizás el operador "?:" funciona de forma diferente a lo esperado. El operador "?:" tiene una prioridad menor que el operador "+". uihudstateswnd.cpp 487
  • V502 Quizás el operador "?:" funciona de forma diferente a lo esperado. El operador "?:" tiene una prioridad menor que el operador "+". uicellcustomitems.cpp 106

Comparaciones adicionales

void CDestroyablePhysicsObject::OnChangeVisual() ( if (m_pPhysicsShell)( if(m_pPhysicsShell)m_pPhysicsShell->Deactivate(); .... ) .... )
Advertencia PVS-Studio: V571 Comprobación recurrente. La condición "if (m_pPhysicsShell)" ya se verificó en la línea 32. destroyablephysicsobject.cpp 33

EN en este ejemplo doblemente verificado m_pFísicaShell. Lo más probable es que la segunda comprobación sea innecesaria.
void CSE_ALifeItemPDA::STATE_Read(NET_Packet &tNetPacket, tamaño u16) ( .... if (m_wVersion > 89) if ((m_wVersion > 89)&&(m_wVersion< 98)) { .... }else{ .... } }
Advertencia PVS-Studio: V571 Comprobación recurrente. La condición "m_wVersion > 89" ya se verificó en la línea 987. xrserver_objects_alife_items.cpp 989

Código muy extraño. Quizás olvidaron la expresión después si (m_wVersion > 89), o una serie completa más-si. Este método requiere una consideración más detallada por parte del desarrollador del proyecto.
void ELogCallback(void *context, LPCSTR txt) ( .... bool bDlg = ("#"==txt)||((0!=txt)&&("#"==txt)); if (bDlg) ( int mt = ("!"==txt)||((0!=txt)&&("!"==txt))?1:0; .... ) )
Advertencias de PVS-Studio:

  • V590 Considere inspeccionar la expresión "(0 != txt) && ("#" == txt)". La expresión es excesiva o contiene un error tipográfico. elog.cpp 29
  • V590 Considere inspeccionar la expresión "(0 != txt) && ("!" == txt)". La expresión es excesiva o contiene un error tipográfico. elog.cpp 31
En expresiones de inicialización de variables. bDlg Y monte examen (0 != texto) es redundante. Si lo omites, las expresiones serán mucho más fáciles de leer:
bool bDlg = ("#"==txt)||("#"==txt); int mt = ("!"==txt)||("!"==txt)?1:0;

Errores de tipo de datos


Flotador 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; .... )
Advertencia PVS-Studio: V636 La expresión "1/100" se convirtió implícitamente del tipo "int" al tipo "float". Considere la posibilidad de utilizar una conversión de tipos explícita para evitar la pérdida de una parte fraccionaria. Un ejemplo: doble A = (doble)(X) / Y;. gl_rendertarget.cpp 245

El valor de 1/100 es 0 porque es una operación de división de enteros. Para obtener el valor 0.01f, es necesario utilizar un literal real, reescribiendo la expresión: 1/100.0f. Aunque es posible que este comportamiento fuera intencionado por el autor, y aquí no hay ningún error.
CSpaceRestriction::merge(....) const ( .... LPSTR S = xr_alloc (longitud_acc); for (; I != E; ++I) temp = strconcat(sizeof(S),S,*temp,",",*(*I)->name()); .... )
Advertencia PVS-Studio: V579 La función strconcat recibe el puntero y su tamaño como argumentos. Posiblemente sea un error. Inspeccione el primer argumento. restricción_espacial.cpp 201

Función strconcat, toma la longitud del búfer como primer parámetro. Buffer S anunciado como LPSTR, es decir, como puntero a una cadena. tamaño de (S) será igual al tamaño del puntero en bytes, es decir tamaño de (carácter *), no el número de caracteres de la línea. Para calcular la longitud debes utilizar estirar(S).
clase XRCDB_API MODEL ( .... estado u32; // 0=listo, 1=init, 2=construyendo .... ) 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 = = estado) Dormir(5); .... )
Advertencia PVS-Studio: V712 Tenga en cuenta que el compilador puede eliminar este ciclo o hacerlo infinito. Utilice variables volátiles o primitivas de sincronización para evitar esto. xrcdb.cpp 100

El compilador puede eliminar el cheque. S_INIT == estado como optimización, ya que la variable estado no se modifica en el bucle. Para evitar este comportamiento, debe utilizar volátil variables o tipos de sincronización de datos entre hilos.

Advertencias similares:

  • V712 Tenga en cuenta que el compilador puede eliminar este ciclo o hacerlo infinito. Utilice variables volátiles o primitivas de sincronización para evitar esto. nivelcompilerloggerwindow.cpp 23
  • V712 Tenga en cuenta que el compilador puede eliminar este ciclo o hacerlo infinito. Utilice variables volátiles o primitivas de sincronización para evitar esto. nivelcompilerloggerwindow.cpp 232
void CAI_Rat::UpdateCL() ( .... if (!Useful()) ( heredado::UpdateCL (); Exec_Look (Device.fTimeDelta); CMonsterSquad *squad = monster_squad().get_squad(this); if (squad && ((escuadrón->GetLeader() != esto && !escuadrón->GetLeader()->g_Alive()) || escuadrón->get_index(esto) == u32(-1))) escuadrón->SetLeader(este ); .... ) .... )
Advertencia PVS-Studio: V547 La expresión "escuadrón->get_index(this) == u32(- 1)" siempre es falsa. El rango de valores del tipo de carácter sin firmar: . ai_rat.cpp 480

Para entender por qué esta expresión es siempre falsa, calculemos los valores de los operandos individuales. u32(-1) es igual a 0xFFFFFFFF o 4294967295. El tipo de retorno del método escuadrón->get_index(....), - u8, por lo tanto valor máximo- 0xFF o 255, que es estrictamente menor que u32(-1). En consecuencia, el valor de tal comparación siempre será FALSO. Este código se puede solucionar fácilmente cambiando el tipo de datos a u8:
escuadrón->get_index(esto) == u8(-1)
El mismo diagnóstico funciona para comparaciones redundantes de variables sin signo:
espacio de nombres 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)); }
Advertencia PVS-Studio: V547 La expresión "m_tActionCondition.m_tLifeTime >= 0" siempre es verdadera. El valor del tipo sin firmar siempre es >= 0. script_entity_action_inline.h 115

Variable m_tLifeTime no está firmado, por lo que siempre es mayor o igual a cero. Si se trata de una comprobación innecesaria o si hay un error oculto en la lógica, depende del desarrollador juzgar.

Advertencia similar:

V547 Expresión "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 (sección LPCSTR) const ( ObjectFactory::ServerObjectBaseClass *object = nullptr; try ( object = m_server_creator(sección); ) catch(std::exception e) ( Msg("Exception [%s ] generado al crear un objeto de servidor desde " "sección [%s]", e.what(),sección); return (0); ) .... )
Advertencia PVS-Studio: V746 Tipo rebanado. Una excepción debe detectarse por referencia y no por valor. objeto_item_script.cpp 39

Función std::excepción::qué() es virtual y se puede anular en clases heredadas. En este ejemplo, la excepción se detecta por valor, por lo tanto, la instancia de clase se copiará y se perderá toda la información sobre el tipo polimórfico. hablar con qué() en ese caso no tiene sentido. La excepción debe detectarse mediante el enlace:
captura(const std::excepción& e) (

Misceláneas

void Compute_cover_value (....) ( .... valor flotante; .... si (valor< .999f) { value = value; } .... }
Advertencia PVS-Studio: V570 La variable "valor" se asigna a sí misma. compilador_cover.cpp 260

Variable valor asignado a sí mismo. No está claro por qué hacer esto. Quizás se le debería haber dado un significado diferente.
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& mcLanding) 2) | | (mstate_rl&mcJump); .... )
Advertencia PVS-Studio: V501 Hay subexpresiones idénticas "(mstate_rl & mcLanding)" a la izquierda y a la derecha de "||" operador. actoranimation.cpp 290

Lo más probable es que se trate sólo de una comprobación adicional. mstate_rl y mcLanding, pero a menudo estas advertencias indican un error en la lógica y valores de enumeración no examinados.

Advertencias similares:

  • V501 Hay subexpresiones idénticas "HudItemData()" a la izquierda y a la derecha del operador "&&". huditem.cpp 338
  • V501 Hay subexpresiones idénticas "list_idx == e_outfit" a la izquierda y a la derecha de "||" operador. uimptradewnd_misc.cpp 392
  • V501 Hay subexpresiones idénticas "(D3DFMT_UNKNOWN == fTarget)" a la izquierda y a la derecha de "||" operador. hw.cpp 312
RELATION_REGISTRY::RELATION_MAP_SPOTS::RELATION_MAP_SPOTS() ( .... nombres_de_lugar = "ubicación_enemiga"; nombres_de_lugar = "ubicación_enemiga"; .... )
Advertencia PVS-Studio: V519 A la variable se le asignan valores dos veces seguidas. Quizás esto sea un error. Líneas de verificación: 57, 58. Relationship_registry.cpp 58

El analizador ha detectado que se asignan dos valores seguidos a una variable. En este caso, parece que se trata simplemente de un código inactivo y debería eliminarse.
void safe_verify(....) ( .... printf("ERROR GRAVE (%s): no se pudieron verificar los datos\n"); .... )
Advertencia PVS-Studio: V576 Formato incorrecto. Se espera una cantidad diferente de argumentos reales al llamar a la función "printf". Esperado: 2. Presente: 1. Entry_point.cpp 41

Funcionar imprimirf No se pasan suficientes argumentos: el formato "%s" indica que se debe pasar un puntero a una cadena. Esta situación puede provocar un error de acceso a la memoria y la finalización de emergencia del programa.

  • pvs-estudio
  • análisis de código estático
  • C++
  • acosador
  • Agregar etiquetas
      Contenido
    • Lada XRAY, junto con el modelo Vesta, ahora puede considerarse la nueva esperanza y apoyo de AvtoVAZ. Estos son los coches que representan la cara de la empresa y nueva ronda en su desarrollo. No es de extrañar que el desarrollo del nuevo hatchback X-Ray se haya llevado a cabo con sumo cuidado. Además Atención especial Se prestó atención no sólo a la apariencia, sino también al componente técnico. Y el motor, como saben, es el "corazón del automóvil", por lo que los motores siempre han sido una prioridad para los ingenieros de la empresa.

      Breves características de los motores Lada X-Ray.

      Lista de motores Lada X-Ray

      En total, el hatchback recibirá tres motores, y un par de unidades nacionales se diluirán con una “extranjera”. Lista de motores:

      Características técnicas y características de diseño.

      Todas las unidades de potencia del nuevo modelo son bastante modernas y cumplen con todos los criterios actuales presentados para este segmento.

      VAZ-21129

      Se trata de un motor de gasolina nacional, producido desde hace bastante tiempo y también instalado en otros modelos de AvtoVAZ, incluido el Lada Vesta.

      • volumen – 1.596 cm³;
      • configuración – en línea;
      • ubicación – transversal;
      • número de cilindros – 4;
      • número de válvulas – 16;
      • potencia máxima – 106 l. Con. (78,2 kW) a 5.800 rpm;
      • par máximo: 148 Nm a 4.200 rpm;
      • transmisión de sincronización – correa;
      • dinámica – 11,4 segundos;
      • velocidad máxima – 176 km/h;
      • relación de compresión – 11 unidades;
      • diámetro del cilindro – 82 mm;
      • carrera del pistón – 75,6 mm;
      • normas medioambientales – Euro-5;
      • combustible - AI-95;
      • Consumo de combustible (ciudad/carretera/modo mixto): 9,3 l/7,2 l/5,9 l.
      • Potencial – 400+ l. Con.
      • Sin pérdida de recursos - 150 l. Con.

      Motor de rayos X VAZ 21129.

      El motor Lada X-Ray VAZ-21129 se creó sobre la base del motor de la serie VAZ-21127, que está destinado al modelo Priora. Se le han realizado una serie de cambios y mejoras. El más significativo es el uso de un conjunto de trampillas en el colector de admisión, a través de las cuales se modifica su longitud, lo que garantiza un funcionamiento óptimo a bajas y altas velocidades. Además, los ingenieros abandonaron el sensor de flujo masivo de aire en el diseño del motor. En su lugar, se instalaron otros dos dispositivos: sensores de temperatura del aire y presión absoluta. Esta solución brinda la posibilidad de un control más completo sobre la mezcla combustible y también elimina la posibilidad de que la velocidad "flote" en modo inactivo.

      Detrás del volumen habitual de 1,6 litros y 16 válvulas se esconden muchos matices.

      También en el diseño del motor se aplicaron nuevas soluciones a la suspensión de la unidad, que está instalada sobre un bastidor auxiliar, y también se realizaron cambios en los sistemas de escape y admisión. Estas medidas garantizaron al motor, entre otras cosas, una reducción del ruido de funcionamiento, así como una reducción de la toxicidad y del consumo de combustible.

      Esta historia cuenta en detalle sobre el motor VAZ 21129:

      HR16DE

      El motor Renault-Nissan H4M-HR16DE fue proporcionado por los socios de AvtoVAZ de la Alianza Renault Nissan. Se produce desde hace bastante tiempo y se instala con éxito en muchos otros modelos de empresas francesas y japonesas: Nissan Tiida, Nissan Wingroad, Nissan Note, Lada Vesta, Nissan Qashqai y otras.

      Motor X-Ray HR16DE en todo su esplendor.

      • volumen – 1.598 cm³;
      • configuración – en línea;
      • ubicación – transversal;
      • número de cilindros – 4;
      • número de válvulas – 16;
      • tipo de potencia: inyección distribuida de combustible con control electrónico;
      • potencia máxima – 110 l. Con. (81 kW) a 5500 rpm;
      • par máximo: 150 Nm a 4.000 rpm;
      • transmisión de sincronización – cadena;
      • dinámica – 11,1 segundos;
      • velocidad máxima – 181 km/h;
      • relación de compresión – 10,7 unidades;
      • diámetro del cilindro – 76 mm;
      • carrera del pistón – 88 mm;
      • normas medioambientales – Euro-4/5;
      • combustible – AI-92/95;
      • Consumo de combustible (ciudad/carretera/modo mixto): 8,9 l/6,8 l/5,6 l.
      • Potencial – 150+ l. Con.
      • Sin pérdida de recursos - 125 l. Con.

      Esta unidad de potencia Lada X-Ray tiene varias características. Lo más característico es la disminución de potencia, mientras que en otros modelos varía de 114 a 118 CV. s., luego en el caso de X-Ray se redujo a 110 CV. p., lo que se hizo para adaptar este motor a las realidades de Rusia y otros países de la CEI.

      El uso de una cadena en la transmisión de sincronización lo hace a priori más confiable.

      Entonces, en lugar del cinturón habitual para los propietarios de Lada, en su diseño se utiliza una cadena, lo que aumenta significativamente la confiabilidad, ya que no se rompe ni se estira rápidamente. No existen compensadores hidráulicos modernos; en su lugar, hay válvulas ajustables ordinarias. Sin embargo, el procedimiento de ajuste del empujador no será necesario antes de 80.000 - 100.000 km. Entre otras características, se puede destacar el uso de un complejo para cambiar la sincronización de válvulas, la fijación del desfasador directamente en el eje de admisión, la presencia de un par de inyectores en cada cilindro y también el uso de una válvula de mariposa electrónica.

      El rechazo de los compensadores hidráulicos resulta en la necesidad de ajustar las válvulas.

      Además, durante el proceso de modernización, se redujeron los índices de fricción de los componentes de la unidad de potencia Lada X-Ray. Esto se logró mediante el uso de un recubrimiento de flúor en la guía de la cadena, pulido (espejo), así como mecanizado cigüeñal. En ralentí se han reducido las pérdidas (combustible y bombeo), lo que se consigue aumentando el ángulo de conversión del C-VTC, así como recalculando el control (temporal).

      VAZ-21179

      Se trata de un nuevo motor doméstico, desarrollado específicamente para los modelos X-Ray y Vesta. Se eligió como base la unidad de potencia de la serie VAZ 21126, de la cual se tomó prestado el bloque de cilindros. Sin embargo, aquí es donde terminan sus similitudes.

      El más potente de la línea es el motor VAZ-21179.

    1. volumen – 1.774 cm³;
    2. configuración – en línea;
    3. ubicación – transversal;
    4. número de cilindros – 4;
    5. número de válvulas – 16;
    6. tipo de potencia: inyección distribuida de combustible con control electrónico;
    7. potencia máxima – 122 l. Con. (90 kW) a 6.050 rpm;
    8. par máximo: 170 Nm a 3.750 rpm;
    9. transmisión de sincronización – correa;
    10. número de árboles de levas – 2 (tipo DOHC);
    11. dinámica – 10,9 segundos;
    12. velocidad máxima – 186 km/h;
    13. relación de compresión – 9,8 unidades;
    14. carrera del pistón – 84 mm;
    15. normas medioambientales – Euro-5;
    16. combustible - AI-95;
    17. Consumo de combustible (ciudad/carretera/modo mixto): 8,6 l/6,8 l/5,8 l.
    • Potencial: sin datos;
    • Sin pérdida de recursos, sin datos.

    Este motor Lada X-Ray es sorprendentemente diferente de otros motores VAZ. En el diseño de la unidad de potencia, se utilizó una nueva válvula de mariposa, desprovista de accionamiento mecánico, la culata del cilindro estaba equipada con válvulas nuevas (ligeras) de Mahle y se conectaron canales de aceite adicionales al regulador de fase.

    La válvula de mariposa no tiene accionamiento mecánico.

    La mayor carrera del pistón aseguró un aumento en el volumen de trabajo, el cigüeñal se caracteriza por un mayor radio de cigüeñal y los canales de entrada del colector de Ecoalliance (Rusia) aumentaron su diámetro a 39 mm. El sensor de oxígeno lo suministra Bosch y la bomba de oxígeno la suministra GMB (Corea). La misma empresa coreana es la encargada de suministrar una bomba de aceite de mayor rendimiento.

    Los cigüeñales tienen un radio de cigüeñal aumentado.

    La marca Federal Mogul suministra un grupo de biela y pistón (tipo ligero) y la empresa alemana INA suministra tensores automáticos de correa de distribución equipados con un par de rodillos. El riel de combustible se compra al consorcio Continental. Sus inyectores se caracterizan por un mayor rendimiento, como resultado de lo cual el patrón de pulverización se adapta especialmente al funcionamiento del nuevo motor de rayos X.

    Los propios árboles de levas proceden de Corea.

    Como se puede ver, a pesar del desarrollo ruso, una parte importante de los componentes se compran a empresas extranjeras.

    El video muestra el proceso de montaje de un nuevo motor de 1.8 litros para el Lada X-Ray:

    Decidí al menos ocuparte con algo y contarte (o recordarte) sobre el motor de juego de la serie STALKER...

    X-Ray es un motor de juego creado por un desarrollador ucraniano juegos de computadora GSC Game World para el juego S.T.A.L.K.E.R.: Shadow of Chernobyl. El motor fue presentado al público en 2001. Fue diseñado originalmente para DirectX 8, pero posteriormente se desarrolló muchas veces para adaptarse a su época.

    Por lo tanto, apareció soporte para DirectX9, y con el lanzamiento de S.T.A.L.K.E.R.: Clear Sky, se agregó DirectX 10. Después del lanzamiento del parche 1.5.07 para S.T.A.L.K.E.R.: Clear Sky, apareció soporte para DirectX 10.1 en el juego. En S.T.A.L.K.E.R.: Call of Pripyat, se agregó compatibilidad con DirectX 11 al motor.

    Los programadores trabajaron en el motor. Oles Shishkovtsov Y Alexander Maksimchuk(También trabajaron en 4A Games en el proyecto Metro 2033 basado en el libro del mismo nombre de Dmitry Glukhovsky).

    Características y características del motor.

    motor grafico
    El motor gráfico, el componente principal del motor del juego X-Ray, utiliza tecnología de sombreado diferido, que permite lograr una alta fidelidad en la representación de la iluminación con una alta complejidad geométrica de la escena. Se admite la representación de punto flotante de alto rango dinámico.

    Inicialmente, el motor se centró en DirectX 8, pero posteriormente se modificó muchas veces para adaptarse a su época. Así, apareció soporte para DirectX 9, y en el juego S.T.A.L.K.E.R.: Shadow of Chernobyl el usuario podía seleccionar el tipo de API de gráficos en las opciones de gráficos del juego. En la versión 1.5 del motor X-Ray, que apareció en el juego de 2008 S.T.A.L.K.E.R.: Clear Sky, los desarrolladores agregaron Direct3D 10. El parche 1.5.07 para este juego agregó soporte para Direct3D 10.1 al motor.

    El 9 de septiembre de 2009, Ian “Cabrtosr” McNaughton, gerente senior de marketing de AMD-ATi, publicó un artículo en su blog “DirectX 11 – ¡Qué esperar!”, en el que describió las ventajas y características principales de Direct3D 11. En este artículo, afirmó que "S.T.A.L.K.E.R.: Call of Pripyat", junto con "BattleForge" y "Colin McRae: Dirt 2", utilizarán DirectX 11.

    Por tanto, la última versión del motor (1.6) admite las siguientes versiones de Direct3D:

    * DirectX 8 (modelo de sombreador 1.1)
    * DirectX 9 (modelo de sombreado 2.0)
    * DirectX 9.0c (modelo de sombreador 3.0)
    * Direct3D 10 (modelo de sombreador 4.0)
    * Direct3D 10.1 (modelo de sombreador 4.1)
    * Direct3D 11 (modelo de sombreado 5.0)

    El motor de gráficos admite la renderización de hasta 1.000.000 de polígonos por cuadro. El motor es capaz de representar con alta calidad espacios tanto cerrados como abiertos; el área de espacios abiertos puede alcanzar los 4 metros cuadrados. km. Existe un sistema de cambios dinámicos de día y de noche, compatible con diversos efectos climáticos como lluvia, viento y niebla.

    El sistema de iluminación es completamente dinámico y por píxel. Se admiten sombras suaves y se utiliza la tecnología Screen Space Ambient Occlusion. Las tecnologías de texturizado en relieve utilizadas son el mapeo normal y el mapeo Parallax.

    Debido a la implementación específica de la tecnología de iluminación y sombreado diferido, el motor no puede usarla simultáneamente junto con el suavizado de pantalla completa.

    motor de fisica
    X-Ray utiliza un motor de física gratuito Motor de dinámica abierta.

    IA para juegos
    La inteligencia artificial del juego en el motor de rayos X se llama "A-Life" (vida artificial en inglés, vida artificial en ruso).

    La cuestión es que los personajes del juego viven sus propias vidas y existen todo el tiempo, y no sólo cuando el jugador los ve. Esto va en contra de las optimizaciones habituales utilizadas en el desarrollo de juegos [...] Hemos introducido dos términos que caracterizan dos modelos de comportamiento de personajes que difieren en el grado de detalle: fuera de línea y en línea. El comportamiento fuera de línea del personaje es muy simple en términos de detalle: el personaje no reproduce animaciones, sonidos, no administra activamente el inventario, no construye caminos detallados y fluidos (aunque construye caminos de acuerdo con el gráfico de navegación global, pero más sobre eso más adelante), etc. El comportamiento en línea, por el contrario, tiene un grado total de granularidad. Eso. Podemos considerar que el comportamiento fuera de línea es un subconjunto del comportamiento en línea.

    En nuestro sistema, mientras el jugador juega en su nivel, otros personajes viven en otros niveles, es decir. están fuera de línea, es decir utilizar el comportamiento fuera de línea. Además, debido a la gran población, no todos los personajes dentro del mismo nivel tienen comportamiento en línea, sino solo aquellos que se encuentran dentro de un radio determinado del jugador (esto puede depender de los niveles, generalmente alrededor de 150 metros) o a petición del jugador. diseñadores de juegos.

    Para implementar esto, el simulador monitorea el movimiento del jugador y los objetos fuera de línea y los transfiere en línea/fuera de línea. Al calcular la transición de objetos, se utiliza un truco estándar con inercia: el radio de transición a fuera de línea es mayor que el radio de transición a en línea.

    A continuación, cabe mencionar la navegación de objetos online y offline. Tenemos niveles en el juego, cada uno de los cuales tiene su propio gráfico de navegación, que utilizan los personajes para moverse en línea. Lo llamamos gráfico detallado. Para cada gráfico detallado, también se crea su análogo menos detallado, cuyos vértices se pueden conectar con los vértices del mismo gráfico de otro nivel. Eso. Después de combinar todos estos gráficos, obtenemos un gráfico que combina todos los niveles. Lo utilizan los personajes para desconectarse. También lo utilizan los personajes en línea cuando cumplen sus objetivos estratégicos. Por ejemplo, si un personaje en línea decide ir a otro nivel, entonces construye un camino a lo largo del gráfico global, luego construye un camino a lo largo del gráfico detallado de su nivel desde su posición hasta un punto en el gráfico global. Si este punto ya está en otro nivel, entonces se teletransporta allí y automáticamente se desconecta. Para evitar que esto suceda frente al jugador, colocamos puntos de transición para los personajes del juego más lejos que el punto de transición del jugador, en algún lugar "a la vuelta de la esquina".

    motor de sonido
    El motor de sonido utiliza la tecnología de función de transferencia relacionada con la cabeza (HRTF) para generar sonido de alta calidad. Se admite salida de audio de seis canales (5.1). Los datos de sonido se guardan en contenedores de medios MP3, MP2, WMA, ADPCM y Ogg.

    Redes
    El motor utiliza el modelo de red cliente-servidor y tecnología informática distribuida. El motor admite hasta 32 jugadores en una partida.

    Lista de juegos que utilizan X-Ray
    * S.T.A.L.K.E.R.: La sombra de Chernobyl (20 de marzo de 2007)
    * S.T.A.L.K.E.R.: Clear Sky (22 de agosto de 2008)
    * S.T.A.L.K.E.R.: Call of Pripyat (2 de octubre de 2009)

    Prelanzamiento de S.T.A.L.K.E.R.: Shadow of Chernobyl - Motor de rayos X(de la historia)
    Dado que el realismo es el objetivo principal de S.T.A.L.K.E.R., sabíamos que también tendríamos que centrar mucha atención en desarrollar un modelo de física realista para el juego. Sabíamos que podíamos hacer que la naturaleza pareciera realista con buenos detalles, pero para pasar al siguiente nivel, sentimos que tendríamos que crear un nuevo motor de física para hacer que el juego fuera más realista. Cuanto mejor sea nuestro motor de físicas, mayor será la sensación de realismo.

    Este motor de física completamente nuevo nos permitió crear una naturaleza donde los objetos son verdaderamente interactivos. Sillas, mesas, ladrillos, latas y muchos otros objetos se pueden empujar, golpear, destruir y hacer con todo lo que puedes hacer en la vida. Por el momento, muchos juegos limitan los elementos a los llamados elementos de misión, S.T.A.L.K.E.R. Elimina estas barreras para que puedas explorar completamente el mundo de los modales realistas. Por ejemplo, si tropieza con algún objeto y luego se levanta, su vista se volverá borrosa y verá la dispersión de la luz.

    Creemos que nuestro potente motor de física añade no sólo realismo, sino también capacidades tácticas en entornos de combate. Por ejemplo, es posible que estés explorando un área con poca luz, te pongas nervioso al ver un movimiento inesperado cerca y abras fuego. Después de lo cual, a medida que te acerques, notarás que este no es un monstruo, sino otro Stalker, tal vez de una de las pandillas, si ven su cuerpo, se opondrán a ti, después de lo cual arrastrarás el cuerpo hacia la sombra. para que no sea visible.

    La capacidad de levantar el cuerpo estará disponible no solo para los Stalkers. La mayoría de las criaturas del juego también tienen inteligencia y podrán usar diferentes elementos como deseen.
    Algunos objetos puedes usarlos para atacar a los oponentes, mientras que otros puedes usarlos para protegerte contra explosiones o balas. Pero al mismo tiempo, es posible que no te protejan de un ataque; por ejemplo, no todos los materiales pueden brindarte protección contra un AK-47 :-)

    Prestamos mucha atención a la física del cuerpo. ACOSADOR Tiene animación esquelética avanzada que controla el realismo de los movimientos corporales en un grado muy alto. nivel alto detallando. Cada personaje del juego consta de 50 huesos. Nuestro motor se basa en la máxima resistencia de los huesos, las articulaciones y el peso, junto con otros factores. Todo esto reaccionará si el cuerpo se cayera o recibiera un disparo. Por ejemplo, si te han disparado varias veces, tus movimientos serán mucho más lentos. Si tienes la mano herida, te resultará difícil apuntar al enemigo.

    También prestamos gran atención a las armas, todos los modelos están hechos con texturas fotográficas reales, por lo que no parecerá que todas las texturas las hemos creado nosotros mismos. Las armas se pueden modificar.

    El transporte tendrá una preocupación especial; para mantener tu coche en funcionamiento tendrás que controlar los niveles de combustible y los daños. Habrá espacio en el coche para tu equipo, podrás dejar tus cosas allí. Si una bala impacta en las llantas de un automóvil, este volcará y el conductor puede morir a causa de este tipo de accidente.

    La física es la parte principal del juego, lo que abre posibilidades sin precedentes para el juego interactivo para los jugadores. ACOSADOR te promete un motor de física de alta tecnología que te brindará una sensación de realismo total que nunca antes habías visto.

    * 300.000 - 3.000.000 de polígonos por fotograma: cuanto más potente sea su tarjeta de vídeo, mejor para usted. Con una buena tarjeta de video, verá una muy buena imagen y creo que quedará satisfecho y no se arrepentirá de haber pagado una buena suma por esta misma tarjeta de video. El motor está construido de tal manera que se adapta a su sistema común, cuanto mejor es, más se lleva el motor al límite. Sombras e iluminación dinámicas: todo está pensado en las sombras y la iluminación en el juego, los desarrolladores intentaron hacerlo todo al más alto nivel. Si ha visto un vídeo que muestra sombras e iluminación dinámicas, probablemente todo esté claro para usted. Las sombras de los objetos caen correctamente sobre los personajes; estás de acuerdo, otro detalle importante. Potente motor de física: control de vehículos, objetos detallados, balística de balas, conexiones en el esqueleto, etc. - El control del equipo se realizó a un nivel decente, no se olvidaron de ese detalle. Todos los objetos del juego están muy bien dibujados, la hierba y las nubes no son sólo texturas toscamente aplicadas, sino objetos bien desarrollados; hay testigos presenciales que afirman que en el juego casi no hay, o no hay, la llamada niebla de guerra. Las estadísticas de armas también están en un nivel bastante alto, hay testigos que vieron enciclopedias de armas en la mesa de los desarrolladores, los desarrolladores también tenían información sobre la velocidad de disparo, calibre, etc. del arma, intentaron implementar todo esto, es decir , el comportamiento real del cañón en Game. Todos los seres vivos y no del todo vivos de la Zona tienen esqueletos, esto significa que el cuerpo no será como goma, el físico jefe del proyecto es firmemente responsable de la física de los cuerpos sólidos en el juego, si todo lo que sucede en el juego con cuerpos sólidos se repitieron V vida real, entonces todo se vería casi así. IA realista: los personajes del juego se comportan de manera apropiada ante los eventos y el mundo que los rodea. Los soldados patrullan el perímetro de la Zona. Los acosadores viajan a través de la Zona en paralelo con el jugador, recolectando formaciones anómalas, negociando, comunicándose y luchando entre sí. Los mutantes aumentan su población, migran por toda la Zona, se devoran unos a otros, acosadores, soldados, descansan y duermen. De vez en cuando te comunicas con otros personajes e intercambias información diversa con ellos. Un acosador que posee un artefacto muy bueno y costoso intentará evitar a las personas e intentará vender u ocultar rápidamente este artefacto.

    Eso es todo, gracias por su atención...

    Fuente stalker64.net.ru.

    Artículo tomado de: http://stalker.by

    También recomendamos:

    Los juegos en la computadora son una excelente manera de "matar el tiempo", divertirse y simplemente relajarse. Incluso sin ser un ávido jugador, una persona suele tener sus propias preferencias en el campo del desarrollo de juegos. Algunas personas aman los shooters, otras no pueden vivir sin estrategias.

    En 2006, un hecho real fue el lanzamiento de STALKER: Shadow of Chernobyl. El juego ha ganado millones de fanáticos en todo el mundo. Ultima versión, Call of Pripyat, se lanzó en 2009, después de lo cual el número de fanáticos del juego aumentó considerablemente: la atmósfera de la central nuclear de Chernobyl es tan cautivadora que incluso los adultos pueden sentarse durante horas.

    Desafortunadamente, muchos usuarios se quejan de que el error de XRay Engine les impide disfrutar del juego. ¿Qué causa su aparición y cómo deshacerse de él? Esto es exactamente a lo que está dedicado nuestro artículo.

    ¿Qué son los rayos X?

    Para saber cómo resolver el problema, es necesario comprender su causa raíz con más detalle. Comencemos con el hecho de que XRay es un motor de juego que se utiliza en todas las partes de Stalker.

    Fue creado específicamente para este juego y esto sucedió en 2001. Dado que el proyecto STALKER resultó ser simplemente una “construcción a largo plazo” épica, vio la luz solo cinco años después. Al principio, los desarrolladores pretendían usarlo exclusivamente con DirectX 8, pero cuando se lanzó la primera parte de la trilogía, agregaron soporte para DirectX 9. En 2008, cuando se anunció el lanzamiento del sufrido Clear Sky, Allí también se agregó la versión 10.

    Finalmente, "Call of Pripyat" también recibió DirectX 11. Sin embargo, dada cierta "aspereza" en el código del juego, el motor no pudo liberar todo el potencial de la undécima versión.

    ¿Cuál es la manifestación del error?

    Este momento no se puede confundir con nada. El juego se detiene repentinamente y luego se bloquea en el escritorio. Dado que el cuadro de diálogo que describe el código de error muestra un escarabajo grande, el motor de rayos X a menudo se denomina "desastre verde" y "escarabajo de la desgracia" en los foros de fans.

    Sin embargo, basta de lirismo. ¿Cuál es el motivo de la aparición del “escarabajo”?

    Razones de la apariencia

    Lamentablemente, simplemente no existe una respuesta clara a una pregunta tan candente. Los desarrolladores de GSC no comentaron particularmente las razones, incluso en el momento en que la empresa todavía existía, y ahora es completamente inútil esperar respuestas detalladas.

    Utilizando el método de prueba y error, se descubrió que el juego falla con mayor frecuencia en las computadoras de aquellos usuarios que no tienen instalados los controladores más recientes para su tarjeta de video. Entonces, si no sabes qué versión de este software está instalada en tu máquina, es hora de actualizarla.

    Actualizamos el juego en sí.

    Si fuiste testigo de la aparición de Clear Sky, entonces recuerdas muy bien todos esos epítetos "halagadores" que los jugadores otorgaron a los desarrolladores. ¡Y había una razón para ello! De hecho, era completamente imposible jugar y el error del motor XRay era aún menor.

    ¡Basta con mirar a los francotiradores inmortales y el “Valle Oscuro” completamente vacío! Pude jugar normalmente solo con el complemento 1.5.04 y todos los guardados que se realizaron en versiones anteriores no funcionaron. En definitiva, si tienes Internet, no seas perezoso y accede a la web del desarrollador. Todos los parches existentes para todos los juegos de la serie están ahí, por lo que solo necesitas descargarlos e instalarlos. En este caso, el error de XRay Engine en Stalker probablemente aparecerá con mucha menos frecuencia.

    Versiones piratas

    Dado que los desarrolladores no tuvieron en cuenta los intereses de los usuarios finales, el juego está protegido contra copias ilegales mediante el conocido sistema StarForce. No es de extrañar que muchos usuarios prefieran descargar NoDVD incluso en los casos en los que tienen un disco con licencia con el juego en sus manos.

    Desafortunadamente, muchas de estas “pastillas” hacen que aparezca el error XRay Engine. ¿Qué hacer si no quieres estropear el sistema operativo StarForce, pero tampoco quieres ver el “error verde” todo el tiempo?

    Por desgracia, sólo hay una salida. Compra el juego en Steam. Dado que en esta tienda de contenidos digitales el juego también está disponible para usuarios extranjeros (donde StarForce está prohibido en principio), definitivamente te librarás del problema.

    Otras razones

    Otro factor importante que puede contribuir al error puede ser el hardware de su computadora. Es posible que los componentes demasiado nuevos o viejos no se lleven bien con el misterioso motor ucraniano, después de lo cual el error del motor XRay lo perseguirá constantemente. "Call of Pripyat" es actualmente la versión "más reciente" del juego, que tiene los problemas de hardware menos comunes. "Shadow of Chernobyl" y "Clear Sky" son mucho más antiguos en este sentido y, por lo tanto, a menudo se niegan por completo a ser amigos de las nuevas tarjetas de video.

    Modificaciones

    Cuando se acaba de lanzar “Stalker”, el deleite de los jugadores no tuvo límites. El juego realmente daba una sensación de libertad casi ilimitada. El GG podía ir a cualquier parte, siendo prácticamente ilimitado en la dirección de su movimiento. A medida que pasaba el tiempo, el entusiasmo era cada vez menor.

    Quedó claro que los desarrolladores no iban a devolver las ubicaciones cortadas y que no había suficiente acción en el juego. Fue entonces cuando aparecieron los MOD (modificaciones del juego), que en ocasiones realizaban cambios verdaderamente globales en Stalker.

    El más famoso fue el proyecto AMK, sin el cual los jugadores con experiencia ahora no recomiendan completar "La sombra de Chernobyl". Algunas modificaciones tuvieron mucho éxito, otras no tanto. Pero casi todos tienen un error del motor de rayos X. "Call of Pripyat" es mucho menos susceptible a este fenómeno porque hay muchas menos modificaciones para este juego.

    Entonces, si estás usando un MOD, entonces solo hay una salida: comunicarte directamente con su desarrollador o examinar cientos de páginas de foros, donde los jugadores a veces publican buenos "parches" caseros que, bajo ciertas condiciones, pueden eliminar este error. Por supuesto, no siempre se puede esperar esto, ya que en el caso del XRay Engine (“Call of Pripyat” en particular), es difícil decir algo concreto.

    Trucos

    Otros jugadores, que encuentran algunos niveles demasiado difíciles, a menudo se dejan llevar por los trucos, con la ayuda de los cuales pueden construir un número ilimitado de armas y equipos, y obtener los mejores artefactos a su disposición.

    Como siempre, hay que pagar por todo. En este caso particular, esto se expresa en una pérdida de estabilidad del programa, cuando el error XRay Engine en Stalker comienza a aparecer cada pocos segundos. Si esto sucede, simplemente intenta buscar una versión diferente del truco. Afortunadamente, hoy en día se pueden encontrar miles de copias en Internet. ¡Finalmente, intenta pasar el nivel difícil con honestidad! Quizás de esta manera disfrutes mucho más del juego.

    "Chamanismo"

    Por desgracia, incluso los métodos más lógicos y correctos, a primera vista, fallan cuando se trata de este motor de juego. Por ejemplo, si no estás jugando con una resolución "nativa", esta puede ser la razón de este error.

    La resolución de tu monitor es 1280x1024, pero ¿prefieres jugar a 800x600? Es probable que el XRay Engine aparezca en Stalker precisamente por esto. Cambie la resolución a la nativa (recomendada para este monitor). En algunos casos, una medida tan sencilla ayuda a eliminar por completo el error.

    A veces, el problema ocurre cuando el archivo de página es demasiado pequeño. Idealmente, su tamaño debería ser el doble de la cantidad de RAM.

    ¿Cómo aumentar el tamaño del archivo de intercambio?

    En realidad, es bastante fácil de hacer. Para hacer esto, haga clic derecho en "Mi PC" y luego seleccione "Propiedades" en el menú contextual. En el cuadro de diálogo que se abre, seleccione la opción "Configuración avanzada del sistema". Haga clic en el botón "Opciones" en el elemento "Rendimiento" y luego seleccione la pestaña "Avanzado". Luego debe hacer clic en "Cambiar" en el elemento "Memoria virtual", luego ingresar el valor que necesita allí y hacer clic izquierdo en "Aceptar".

    Ocasionalmente, el juego se puede iniciar si el sistema tiene menos de 512 MB de memoria, pero no debes hacer esto: el error del motor XRay y los terribles "frenos" aún no te dejarán jugar.

    Finalmente, debemos hablar de las características del juego en sí. Es recomendable desactivar las opciones innecesarias de mejora de imagen. Esta afirmación es especialmente cierta cuando se trata de "Stalker Call of Pripyat". XRay Engine apareció muy a menudo en la versión 1.6.0 cuando el jugador intentó establecer la configuración de calidad máxima.

    Y más sobre conductores. No es tan raro que un error afecte a aquellos usuarios cuyas computadoras tienen una tarjeta de audio discreta. Intente actualizar los controladores y, en casos particularmente difíciles, desactive el dispositivo desde el Panel de control. ¡Atención! Haga esto con cuidado, de lo contrario podría perder todo el sonido de su computadora.

    ¿Qué podemos decir al final de toda nuestra historia? ¡Le deseamos que ningún error le impida establecer nuevos récords en el juego! Esperamos que nuestras recomendaciones le ayuden en este asunto.

    0) Instale Visual Studio 2008 SP1 (Profesional o Equipo, lo monté en el primero), el paquete de servicio del archivo motor.vc2008.fixed.rar es adecuado solo para la versión en inglés del estudio, para la rusa usted deberá descargarlo por separado.

    1) Cree una carpeta en el disco y otra carpeta en él.

    2) En esta carpeta colocamos solo la carpeta Engine.vc2008 del archivo "engine.vc2008.fixed - el proyecto vs2008 que arreglé", no tocamos la carpeta SDK desde allí.

    3) Tomamos la carpeta SDK del archivo "stasvn\sources\engine.vc2005-2008 (~1.6.02 benchmark) - March 2010", de la subcarpeta de fuentes.
    Lo colocamos en una carpeta debajo de Engine.vc2008.

    4) Ahora agregamos la carpeta SDK del archivo Engine.vc2008.fixed.rar encima y aceptamos reemplazar todos los archivos.

    5) Descargue dos SDK de DirectX del sitio web de Microsoft: marzo de 2009 y junio de 2010. (Cada uno pesa alrededor de 500 MB), solo puede usar la versión 2009, pero entonces no podrá compilar xrRender_R4. (ENLACE: error fatal LNK1181: no se puede abrir el archivo de entrada "d3d11.lib"), y si usas solo 2010, el juego con R4 no se iniciará.

    Después de instalar dos SDK de DX, asegúrese de que hayan registrado sus rutas al estudio; los archivos del SDK de 2010 deben ser posteriores a 2009, como se muestra en la figura:

    Lo mismo ocurre con las secciones Archivos ejecutables y Archivos incluidos. Si tiene alguna pregunta, busque información en Google usando las palabras "connecting directx sdk visual studio 2008"

    Si las versiones del SDK son incorrectas (o no están conectadas), el registro se quejará de la ausencia de archivos como d3dXX.lib\.h)
    No es necesario mover carpetas del SDK de DirectX ya instalado a ninguna parte. Basta con registrar las rutas a ellos globalmente para el estudio (o para cada proyecto manualmente)

    Comentario de loxotron: simplemente copie y cambie el nombre de d3d11_beta.lib a d3d11.lib en la carpeta con Direct SDK, o mejor aún, descargue e instale DX SDK de agosto de 2009 y no se moleste con versiones inapropiadas.

    6) Por si acaso, también puedes instalar SDK\OpenALwEAX.exe, pero no estoy seguro de que sea críticamente necesario.

    7) Inicie el proyecto a través de ..\CoP\Project\engine.vc2008\engine.sln. Cuando se cargue, en la parte superior del estudio, cambie el modo de compilación de Debug_Dedicated (o cualquier otro) a Release. A continuación, a la izquierda/derecha habrá una lista de carpetas con archivos del motor, necesitamos, en primer lugar, la carpeta 3rd_party: haga clic derecho sobre ella y seleccione Build\Construct.

    Si todo es correcto, al final el registro a continuación escribirá alrededor de 11 proyectos exitosos(o el número será menor, si algunos proyectos ya se han compilado antes, el registro también informará "omitido\actualizado") Lo principal es que debería haber 0 Errores\Fatales en todas partes
    He completado todos los proyectos sin errores. (advertencia: los errores totales no se consideran)

    8) Por analogía, de arriba a abajo, puede recopilar otros archivos DLL; no es necesario recopilar las carpetas editor\dedicated\utils\plugins; no pertenecen al motor. xrGame.dll tardará más en ensamblarse. El resto son lo suficientemente rápidos.

    Por cierto, no es necesario recopilar todas las Dlls. Sólo los necesarios son posibles. Cuando estén listos, crea una carpeta bin limpia en la carpeta del juego. Coloque allí todos los archivos dll creados (puede hacerlo junto con .pdb). Si es necesario, puedes agregar archivos faltantes del contenedor ZP original (segundo parche) si el juego los requiere. (Como wrap_oal.dll)
    Lancé el juego desde el Stalker-COP.exe original.

    Si todo es correcto, las primeras líneas en el registro del juego/consola indicarán la fecha de construcción y construcción del juego.