Guía práctica para conducir en Inglaterra (o en el Reino Unido)

Después de bastantes meses conduciendo a diario por este bendito país, me he dado cuenta de que puede haber gente a la que le venga bien leer sobre las particularidades de la conducción en U.K, que no son pocas precisamente. Así que durante las últimas semanas he ido escribiendo este mega-post con algunos consejos sobre el tema.

Los que provenimos del continente, o de países por los que se circula por el lado correcto de la calzada (la coña en español no tiene sentido, pero en ingles si: we drive on the “right” side of the road), solemos tener un miedo irrefrenable a ponernos al volante aquí.

Realmente, no es para tanto, pero si hay muchas, muchas consideraciones a tener en cuenta:

Conducir por la izquierda

Esto suele ser lo que más miedo da, pero en realidad no es tan problemático como parece. Uno se hace rápido, aunque la primera vez que conducís, os recomendaría:

  1. Que sea de día (de noche todo es más difícil)
  2. A poder ser por una autovía, dejando las carreteras secundarias para cuando ya llevéis un rato “en el ajo”.
  3. Si podéis usar un coche “continental” (con el volante a la izquierda, como en España), la adaptación se os hará mucho más fácil
  4. Utilizad GPS, ya que al principio os ayudará mucho mucho mucho.

Por supuesto, las incorporaciones y salidas de las autopistas son al revés (por la izquierda), el carril lento es el izquierdo, los adelantamientos son por la derecha, las rotondas se toman al revés, etc etc.

Tened también en cuenta que en Inglaterra puede haber cruces un poco complicados, en los que las primeras veces no tendréis muy claro por donde debéis ir. No obstante, que esto no os preocupe demasiado, ya que como veremos más adelante siempre hay muuucho tráfico, así que solo tenéis que seguir a los que van delante.

Conducir un coche inglés

Una de las sorpresas que me llevé al venir aquí, es que pensaba que conducir un coche con el volante al otro lado sería la parte fácil, y que lo complicado sería ir por el otro carril. Pues no, es más bien al contrario: ir por el otro carril, con tu propio coche español, no tiene mayor dificultad. Pero conducir un coche inglés se hace muuuuuy raro. Hasta ahora he conducido los siguientes coches con el volante al otro lado: un Audi A4 2.0 TFSI, Volkswagen Golf 1.9 TDI, Citroen Xsara Grand Picasso. Mis comentarios son aplicables a todos ellos.

Primero: la postura se nos hace muy incómoda. Justo a la izquierda del pedal del embrague (los pedales son igual que en España –el izquierdo es el embrague-), nos encontramos con la consola central (donde va la palanca de cambios), por lo que no tenemos hueco ni reposapiés donde apoyar el pié izquierdo cuando no usamos el embrague. En el lado derecho, sin embargo, queda un enorme hueco al lado del acelerador que no sirve para nada, ya que ese pie siempre está en el pedal.

Vauxhall-VXR8-1

La palanca de cambios, también funciona igual que las continentales (la marcha primera se engrana empujando a la izquierda y hacia delante). Al principio se hace bastante raro cambiar con la izquierda, y os pasará que no encontráis la palanca de cambios sin mirar, aunque en seguida cogeréis práctica. Un buen consejo si vais a alquilar un coche es cogerlo automático para tener menos cosas de las que preocuparse, aunque si nunca habéis conducido un coche automático quizá sea peor el remedio que la enfermedad… Up to you! :)

Otro aspecto que cuesta es el retrovisor central. Tenemos metido hasta en el tuétano donde está, e instintivamente levantamos la mirada arriba y a la derecha para mirarlo. Evidentemente, en el coche inglés allí no hay nada (hay que mirar arriba a la izquierda) y aunque parece una chorrada, esto tiene su peligro: el 90% de las veces, nos daremos cuenta de que hemos mirado mal, y volveremos la vista al sitio correcto. Pero en otras ocasiones, podemos llegar a deducir que “hemos mirado, y no venía nadie”, cuando en realidad ni siquiera hemos visto el retrovisor, y esto es peligrosillo. Supongo que esto dependerá de personas, pero tenemos esa maniobra tan automatizada que casi la hacemos sin prestar atención, y creedme, cuando estamos un poco distraídos, puede llegar a pasar. Cuidadín con esto.

Otro aspecto que sorprende, y se hace muuuuy raro, es el puesto donde vas sentado. Las referencias del coche cambian completamente, y lo que es peor, vamos sentados en el otro lado del carril. Esa es otra de esas cosas que nunca hubieras imaginado lo raras que se hacen, y que también tiene su peligro. Me explico: durante toda tu vida, has conducido sentado en la mitad izquierda del carril por el que vas. Da igual si es el carril izquierdo, el derecho, o el de medio. Tu siempre has ido sentado cerca de la raya izquierda de tu carril. Cuando conduces un coche inglés, vas sentado al otro lado, y a parte de que se hace muy raro, tenemos una peligrosa tendencia a irnos involuntariamente hacia la izquierda (instintivamente, tiendes a pegarte al lado izquierdo). En una carretera convencional no sucede tanto (ya que a la izquierda tienes el abismo), pero en autovías sí pasa, y si no tienes cuidado terminas invadiendo el carril de tu izquierda. Cuidadín con esto también…

Como os comentaba, después de muchos meses aquí, prefiero mil veces conducir mi propio coche (aunque no vea un carajo para adelantar, y en las rotondas tenga que estirar el cuello como una jirafa para poder ver si vienen), que conducir un coche de éstos. Cuando vine, incluso pensé en comprar un coche y llevármelo a España aunque tuviera el volante al otro lado (el mercado de segunda mano tiene cosas muy interesantes aquí), ya que siempre creí que no sería para tanto. Después de probar lo que es, NI LOCO compro un coche con volante inglés. Tenedlo en cuenta… :)

El tráfico

Inglaterra (al menos la mitad sur, que es donde yo vivo, y al igual que otros países como Alemania) tiene una densidad de población bastante mayor que España. Eso, de por sí, ya incrementa el volumen de tráfico que hay, pero además hace que haya muchas ciudades que están muy cerca las unas de las otras. Eso tiene un doble efecto en el tráfico, ya que muchísima gente trabaja en alguna de las ciudades cercanas (en lugar de aquella en la que vive), por lo que coge el coche para ir a trabajar. La consecuencia, es clara:

Hay muchísimo tráfico. En todas partes y a todas horas. Mientras que en España, las autovías normalmente tienen poco o nada de tráfico, aquí (al igual que en Alemania) tienen un nivel de ocupación exagerado (y más cuando, como veremos más adelante, la inmensa mayoría son gratis). No me extraña que el trío calavera se mofe de España por construir autovías por las que no circula nadie, como dice Hammond, “esto es un sueño hecho realidad… mi propia autovía !!”. Podéis ver el episodio aquí:


Top Gear Season 20 Episode 3 (20x03)

Así que ya sabéis, si conducís por Inglaterra, esperaos muuucho tráfico. Todas las radios tienen secciones acerca del estado del tráfico cada pocos minutos, porque con tanto coche hay muchos incidentes todos los días que generan atascos.

Otro aspecto bastante negativo es que, aunque circuléis por autovías de dos carriles en cada sentido, el carril lento está casi siempre inutilizado, anulando así toda utilidad de la autovía. El motivo es que hay muchos camiones, y los coches normales pocas veces se molestan en pasarse al carril lento para que puedas adelantarles. Les da exactamente igual, y nadie parece molestarse por ello, así que no queda otra que aguantar y echarle paciencia…

No obstante, debo decir en su favor que, por mucho tráfico que haya, cuando no hay accidentes es bastante raro ver atascos de esos de estar parado completamente. Trafico denso, muy denso, siempre. Pero atascos de esos “a la española”, pocas veces. En parte, esto se debe al fantástico sistema de señalización variable que tienen por todas partes. En cuanto la densidad del tráfico crece, van limitando la velocidad progresivamente, y así evitan accidentes y los consiguientes atascos.

Los camiones y los camioneros

Merecen mención a parte.

Primero, porque hay muchos, muchísimos. Por lo visto el transporte por carretera es el protagonista en la isla… El porcentaje de camiones en autovías y autopistas es asombroso. Puedo aseguraros que puede alcanzar el 30 o el 40% de los vehículos que circulan, en algunos momentos.

Y segundo, porque tienen las bolas de acero. A los camioneros que circulan por aquí se la suda todo. Esta misma mañana, en una carretera convencional, había un camionero parado en un cruce que quería incorporarse al carril por el que yo iba. Cuando estaba a unos 300 metros de distancia, ha salido sin ningún tipo de problema, a pesar de saber perfectamente que me obligaba a dar un frenazo bastante brusco para no comérmelo. Y el tío mirándome mientras salía, con dos cojones!. Son así, y no tienen solución. Lo curioso es que el resto de conductores no les dice nada, hagan lo que hagan.

Otra cosa que os podéis esperar siempre es que van a bloquear las autovías sin ningún miramiento. Se adelantan constantemente los unos a otros, aunque la maniobra les lleve 15 minutos (por ir 1 Km/h más rápido que el adelantado). Bloquean las autovías de 2 carriles todo el rato y, nuevamente, nadie les dice nada. Es exasperante, pero no queda otra más que asumirlo.

Presencia Policial

Zero. Ninguna. Nada. Nothing…

En todo el tiempo que llevo aquí, creo que han sido DOS las veces que he visto un coche de policía parado en una cuneta (supuestamente vigilando, probablemente descansando). No digamos ya el típico control, de esos tan frecuentes en España, con los conos, los pinchos, los perros, los policías en la carretera pidiendo los papeles, y esas cosas. Eso aquí no existe. No se si es algo bueno o malo, la verdad…

Nunca me ha parado un policía, ni he visto que parara a nadie más. Nunca me han pedido los papeles, nunca he visto un control de alcoholemia, ni de velocidad con radar móvil. Nunca he visto un coche de policía camuflado… Nada.

Eso si, no quiere decir que no controlen la velocidad con otros medios… (ver punto siguiente)

Límites de velocidad

El límite genérico en autovías o carreteras de dos carriles (dual carriageway, muy frecuentes aquí) es de 70 millas por hora (unos 112 kmh). En carreteras convencionales suele ser de 60 mph (unos 95 kmh) y en puebles suele ser de 30 mph (unos 50 kmh). No obstante, es frecuente ver otros límites como 50 mph, 40 mph, etc.

Aunque nunca he visto un radar ni un control de velocidad “a la española”, eso no quiere decir que no lo controlen. De hecho, esto está más vigilado que en España. El tema es que no lo controlan con radares, sino con un sistema bastante más efectivo (y sobre todo barato): cámaras de velocidad (Speed cameras).

Están por todas partes (sobre todo en los alrededores de las ciudades). Básicamente, pintan unas rayas en la carretera, como si fuera una regla de medir, que sirve como escala de referencia. Luego, colocan una cámara que se activa cuando pasa un coche, y saca dos fotos a un intervalo fijo. Utilizando la diferencia entre ambas fotos, y las rayas pintadas a modo de referencia, pueden hacer un cálculo muy exacto de la velocidad. Y eso sin gastarse la millonada que cuesta un radar, y ahorrándose la polémica de los inhibidores… Fácil y efectivo.

Como regla general, seguir el “allí donde fueres, haz lo que vieres” es buena idea, y en esto también. Si más o menos vais a la velocidad del resto, es poco probable que os llevéis una multa. No obstante, sí puedo decir que aquí sucede un poco como en España: están siempre anunciadas, aunque también aquí hay muchos sitios en los que hay señal que las anuncia y luego no hay nada. La mejor referencia que podéis usar para ver si hay cámara o no, es fijaros en las rayas de la calzada. Son como éstas:

Si las veis, ojo con la velocidad…

En pueblos, carreteras convencionales, o zonas en las que no hay señalización variable, suelen ser así:

Éstas están activas SIEMPRE, así que respetad el límite si no queréis llevaros un “ticket” a casa. En zonas con señalización variable (muy típica en las autovías alrededor de las ciudades), suelen estar en la parte posterior de los postes:

En cuanto a éstas últimas, y viendo cómo se comportan los conductores, parece que solo están en activo cuando la señalización viable indica algún límite de velocidad más restrictivo que el genérico. Cuando están apagadas, mucha gente va por encima del límite, de lo que deduzco que las cámaras no funcionan (aunque no puedo estar seguro de esto). En cuanto hay algún incidente, o el volumen de tráfico crece, se activan e indican un límite más bajo de lo normal, como en la siguiente fotografía:

Ahí, todo el mundo a frenar. Cuando la incidencia se acaba y se restaura el límite genérico (y supuestamente las cámaras dejan de funcionar), veréis una señal como ésta:

Las carreteras

Todas las carreteras, en general, están peor construidas y peor conservadas que en España. Mucho peor…

También es cierto que tienen que soportar muchísimo más tráfico, pero por ejemplo aquí ni saben qué es eso del asfalto drenante. También se ven cosas que harían a los españoles llevarse las manos a la cabeza (y por supuesto denunciar al gobierno al primer accidente que suceda allí).

La verdad, no se deducir qué es mejor o peor. Evidentemente, es mejor tener carreteras bien conservadas, pero aquí son mucho más realistas que en España y asumen que quizá no haya dinero para mantener siempre las carreteras como si fueran nuevas.

Aún así, creo que se pasan, ya que se ven cosas realmente peligrosas. Lo ideal sería un punto intermedio entre esto y aquello…

Autovías y autopistas

Son frecuentes, aunque el volumen de tráfico es enorme como ya hemos dicho. Suelen ser de dos o tres carriles, y siguen una normativa mucho más flexible que en España (donde todo está regulado al milímetro, y de forma demasiado estricta, en mi opinión). Por ejemplo, no están valladas para que no entren animales (y por tanto hay muchos animales muertos por la carretera), las incorporaciones y cruces no siempre son iguales, etc etc.

En el 99% de los casos son gratuitas (nunca me he topado con un peaje, aunque sí debe de haber alguno por ahí), y tienen algunas curiosidades:

Por ejemplo, así como en España las incorporaciones son siempre de un solo carril (para evitar problemas), aquí suelen mantener incorporaciones de carril doble, con una señalización con pintura bastante curiosa que obliga al carril rápido a incorporarse primero, y unos cientos metros después al carril lento.

Cuando te topas la primera vez con esto, se hace muy raro y no sabes muy bien qué hacer. Tranquilos, ambos carriles se incorporarán tarde o temprano a la autovía. Eso sí, si escogéis el carril rápido (el de la derecha), tened en cuenta que la entrada suele ser más brusca (y un poco peligrosa). La siguiente foto muestra cómo son estas incorporaciones:

E7A63E26D8DCF65EB19E28A31C17FE_h498_w598_m2

También es útil saber que las estaciones de servicio suelen ser menos frecuentes que en España. No es raro verlas cada 60 o 80 km en lugar de los 30-40 habituales en España. Eso sí, siempre tienes cientos de puebles alrededor de cualquier salida que tendrán gasolineras.

Otro dato de utilidad: todas las salidas, como en España, tienen un número. Aquí se les llama “junctions”, y ese número se usa bastante para dar indicaciones o identificar tramos (por ejemplo, cuando en la radio dicen que hay un atasco, dicen “atasco en la carretera XXX entre los junctions 12 y 15”). Podéis ver el número de salida, en negro, a la izquierda de las señales (en el caso de la foto, Junction 13):

M25_Motorway_Clockwise__Approaching_Junction_13_For_A30_-_geograph_org_uk_-_1280479

Arcenes

Una de las cosas más curiosas de las autovías, es el uso que hacen del arcén izquierdo (aquí al arcén lo llaman “hard shoulder”). Veréis que casi siempre es tan ancho como un carril normal, y ahora entenderéis por qué: cuando hay congestión, suelen activar una señal que habilita el arcén como un carril más, para que la gente circule por el. La señal en cuestión es como esta:

_70894096_70889005

A veces, también lo habilitan para tomar una salida concreta, como en el siguiente ejemplo:

article-0-007E276500000578-144_468x316

Debido a éste uso tan particular que hacen de él, cada vez que se acaba el arcén, por el motivo que sea, debe estar indicado con una señal que suele ser como ésta:

2422015_2da619da

En ese caso indica que no va a haber arcén durante 570 yardas. Es una señal muy frecuente, y que durante un tiempo me pregunté por qué lo indicaban tan explícitamente, hasta que me di cuenta de lo importante que es aquí el arcén…

Carreteras convencionales

Aunque son muchas las autovías, autopistas, y carreteras de dos carriles que hay en Inglaterra, las carreteras convencionales son al final inevitables (y muchas veces muy útiles, para evitar atascos). Eso si, puedo adelantaros que son PELIGROSÍSIMAS. Mucho peores que las Españolas.

Aquí no existe el concepto de Carretera Nacional, Regional, Comarcal, cada una con sus normativas más o menos exigentes. Aquí, todo lo que no son autovías y demás, son carreteras comarcales, sin ningún tipo de regulación ni estandarización. Así que te encuentras de todo: cambios de rasante imposibles, zonas en mal estado, carencia de señalización, curvas ciegas, barro en la calzada, zonas semi-inundadas o con charcos gigantes, contra-peraltes o peraltes exagerados, ausencia total de quitamiedos, carriles super-estrechos, etc etc. Un ejemplo fotografiado esta misma mañana: atención a la señal que reza “Despacio - barro en la calzada”, pintada con spray en una tabla y clavada a una estaca (perdón por la calidad, pero daba el sol de frente):

WP_20131115_003

Además, muy pocas zonas tienen señalización horizontal (rayas pintadas en la carretera) que no sea meramente orientativa. Aquí no se estila eso de las rayas continuas, discontinuas, etc. Y aunque las haya, la gente se las pasa por el forro, así que ya sabéis… mucho mucho cuidado.

Mención aparte merecen los arcenes. Primero, porque no existen (no hay espacio asfaltado más allá de la raya que delimita el carril, para una parada de emergencia o lo que sea). Y segundo, porque suelen estar plagados de maleza, como en la siguiente foto (carretera típica aquí):

cornwall-countryside-uk-08j-4

Podéis imaginaros lo que es toparse con un peatón o un ciclista en esta carretera. Muchos diríamos que hay que estar loco para ir a andar por ahí (especialmente porque circulan bastantes camiones de los grandes), pero en este país es MUY frecuente. Yo me topo a diario incluso con gente paseando al perro por una carretera muy similar a esa. Y es que, curiosamente, en Inglaterra hay muy muy pocos caminos. Las parcelas o tierras para cultivo no están comunicadas con caminos o parcelarias, como en España, por lo que hay muy pocas zonas por las que pasear o andar en bici, al margen de los coches.

A veces, todavía es peor, y directamente te construyen un ESCALÓN en el arcén, a escasos cm de tu carril… Es como una especie de escalón inclinado de asfalto. Da la sensación de que es para retener la maleza o la tierra, y es muy muy típico. El escalón del que hablo es como éste, y suele estar en el interior de las curvas:

WP_20131114_002

Y se supone que debes circular a casi 100 kmh por ahí. Con dos bemoles, si señor!!!. No quiero ni pensar qué pasa si, en una curva, metes la rueda interior en ese escalón…

No me ha tocado todavía una gran nevada, pero según tengo entendido, cuando sucede tampoco mantienen las carreteras tan limpias como deberían.

En definitiva, mucho cuidado con las carreteras convencionales. El siguiente link te llevará a un vídeo que subí a mi página de Facebook en la que puedes ver el trayecto por carretera convencional que hago a diario.

https://www.facebook.com/photo.php?v=10201329879501805&l=1226718751152844295

Ciudades

Las ciudades difieren poco de lo que podemos encontrar en España, y aunque pudiera parecer al contrario, muchas veces la adaptación a la conducción británica es más fácil en ciudad que en carretera abierta. A fin de cuentas, en multitud de ocasiones las calles de ciudades son de dirección única, y los tipos de cruce suelen ser parecidos.

Sí merecen mención especial un par de cosas: Los semáforos, se ponen en ámbar también cuando van a pasar de rojo a verde, y todo el mundo suele estar bastante atento a esto para salir pitando en cuanto pueden. Si te despistas, sin duda se quejarán. También notarás que los ciclos de los semáforos son mucho más cortos (están menos tiempo en rojo, y por consiguiente menos tiempo en verde). Es muy frecuente tener que parar en semáforos, pero estarás muy poco tiempo parado (a diferencia de algunos semáforos eternos españoles). La verdad, me gusta la gestión que hacen de los semáforos.

Los cruces, suelen tener pivotes indicando el punto por donde debes entrar, algo que a los conductores continentales nos ayuda muchísimo… Tienen esta pinta:

image

He conducido bastante por Londres y Birmingham, y la verdad, poco más que decir sobre las ciudades grandes. Son como cualquier otra ciudad, estresantes y con muchos coches. Aún así, aunque en principio pueda dar pánico enfrentarse al tráfico de éstas ciudades, no es para tanto… de verdad…

Los conductores

En general, los ingleses son tranquilos y educados al volante. Y digo en general…

Luego hay absurdas excepciones, como por ejemplo lo impertinentes que son con el tema del carril de las rotondas. Es incomprensible… Si sales al exterior de una rotonda, porque crees que ha llegado tu salida y te das cuenta de que te has confundido y que es la siguiente (algo que puede pasar muuuy facil dado lo complejo de algunas de ellas), cuando pretendes seguir girando en lugar de salir, prepárate para la que te va a caer… Y seguramente te tocará parar y ceder el paso al energúmeno que venga detrás, y que va a tratar por todos los medios de adelantarte mientras te toca la bocina…

También son bastante maleducados cuando hay un paso estrecho y no caben dos coches (algo muy frecuente por la forma que tienen de aparcar, como explicaremos en el siguiente punto). Algunas veces te topas con gente educada, que pasa con cuidado o se detiene para cederte el paso. Otras personas, sin embargo, pasan a toda pastilla, como diciendo “gilipollas el último”. Muchas muchas veces, he estado muy cerca de tener un golpe por culpa de esta gente…

Lo de circular por el carril lento de las autovías tampoco es lo suyo. La mayoría no pasa al carril izquierdo jamás, por lo que muchísimas veces te topas largos tramos de autovías de 2 carriles, en las que todo el mundo va por el carril rápido y NADIE va por el lento. Es bastante absurdo, la verdad…

Por lo general respetan los límites de velocidad, más o menos (en los pueblos y ciudades van demasiado rápido, para mi gusto), y no se ven muchas animaladas. Eso sí, cuando se ven, son de las gordas. En Inglaterra he visto las mayores burradas que he visto en mi vida, de verdad…

Aún así, tienen mejores estadísticas de accidentalidad que España, así que no podemos decir mucho al respecto…

Aparcar

Así como en las grandes ciudades todo está mucho más regulado (hay que aparcar en Parkings si o si), en los pueblos o en las zonas residenciales la gente hace LO QUE LE DA LA GANA. Literalmente…

Eso sí, luego tienen cosas tan absurdas como no poder aparcar en el parking de un supermercado más de dos o tres horas. Si pretendes usar uno de esos parkings para irte a pasar el día por el pueblo, al volver probablemente te encontrarás un ticket, o aún peor: un cepo en la rueda. Aunque nadie te diga el tiempo máximo que puedes estar, ni bajo qué criterio te multan o te dejan de multar…

También es muy típico encontrarte zonas de aparcamiento en las que hay que pagar. Si ves un cartel que pone “Pay and Display”, es que tienes que ir a una máquina a sacar un ticket, y ponerlo en el salpicadero, igual que hacemos en España con la “zona azul”. Muchas son parcelas privadas, que ponen a modo de negocio, y aunque suelen ser baratas, no te esperes ningún tipo de vigilancia del coche, por supuesto…

Una cosa que no soporto, es la manía que tienen de aparcar en plena carretera. Es realmente alucinante: obligan a todo el mundo a parar hasta que no venga nadie por el otro carril. Eso sí, nadie parece quejarse. Es como si lo tuvieran asumido.

De hecho, te encuentras cosas alucinantes, como carreteras en las que se comen medio carril para pintar… ¡PLAZAS DE APARCAMIENTO!… Si si, en medio de la carretera. Un ejemplo, de mi mismo pueblo:

image

Así que si los ayuntamientos oficializan ese comportamiento con eso, ¿cómo no lo van a hacer luego siempre que quieran? Es realmente molesto…

Otro ejemplo de una calle por la que también tengo que pasar a diario: todo el mundo aparca en la puerta de su casa, aunque anulen medio carril de la carretera, y literalmente no quepan dos coches (todos esos coches de la izquierda están aparcados, por lo que hay que andar parando para que pase el otro la mayoría de las veces):

image

Rotondas

Yo soy gran fan de las rotondas, pero es que a ellos les encantan. Hay miles. Por todas partes. De todo tipo y condición.

Al principio hay que tener mucho cuidado con las rotondas. No tanto porque hay que circular en el sentido contrario al que estás habituado, sino porque cuando llegas a una, has de mirar a la derecha para ver si vienen, en lugar de para la izquierda. Y créeme, tenemos muy muy automatizado ese acto reflejo de mirar a la izquierda.

En los pueblos y ciudades, suelen ser como las españolas (solo que todo al revés, por supuesto). También hay muchas chiquitillas, pintadas en el suelo, como esta:

mini

Son bastante fastidiosas, porque tienden a provocar “deadlocks” (todo el mundo parado, esperando a que pase el del otro lado). Para los que venimos del continente son también más delicadas que las normales, porque es más fácil olvidarte de mirar a la derecha para ver si vienen. Cuidado con ellas!

En las autovías, prácticamente todas las salidas (o Junctions) desembocan en una especie de rotonda. Están catalogadas así, aunque no lo parezcan. En la práctica, son uno o dos puentes que cruzan la autovía, y que en los extremos están regulados como si fuera una rotonda gigante. Casi siempre tienen esta forma:

Así, permiten salir de la autovía en todas direcciones, así como realizar cambios de dirección. Aunque su regulación interna es como la de cualquier otra rotonda (circulación giratoria, el carril exterior tiene preferencia, etc), éstas suelen incorporar además semáforos dentro, debido a su habitual gran tamaño (a veces tienen dos o tres carriles).

Una particularidad MUY IMPORTANTE de las rotondas en el Reino Unido son los carriles de entrada. En España, esto no está regulado, por lo que cada uno puede entrar por el carril que quiera. Y es un grave fallo (como ya vimos aquí), ya que hay mucha gente que no se preocupa de escoger el carril correcto, entorpeciendo la circulación de todos los demás.

Esto lo hacen mucho mejor en Inglaterra, ya que TODAS las rotondas con más de un carril de entrada incorporan señales pintadas en el suelo indicando qué carril escoger en función de hacia donde te dirijas. Puedes ver un ejemplo en la siguiente foto (salida de una autovía que desemboca en una rotonda, con 4 carriles de entrada):

image

Dentro de las rotondas grandes (las cuales suelen tener semáforos), esta señalización pintada continúa, indicándote en qué momento concreto (y no antes) debes salir al carril exterior. Un ejemplo:

image

Y son totalmente inflexibles con esto. No se te ocurra confundirte, porque la pitada que te llevas es de escándalo. Son un poco gilipollas con este tema, la verdad. Incluso conduciendo mi coche español, que deja bien claro que no eres de aquí, no tienen ni la menor piedad contigo si te equivocas de carril, así que ya sabéis. Escoged bien… (en esto ayuda mucho el GPS, ya que te dice qué dirección debes seguir, por lo que solo debes buscar esa dirección en los nombres pintados en el suelo).

El colmo de los colmos, en cuanto a rotondas, es el Magic RoundAbout, que es algo así como una “rotonda de rotondas”. Hay varias: en Swindon, en Colchester, en Hemel Hempstead y en High Wycombe.

Realmente no comprendo el sentido de esta aberración (quizá haya sido patrocinada por los talleres de chapistería locales). ¿Qué se logra con eso que no se pueda lograr con una rotonda tradicional más grande?. En fin, cosas de ingleses… :)

Alquilar un coche en Inglaterra

Las empresas de alquiler funcionan muy parecido a como lo hacen en España. De hecho, suelen ser las mismas: Hertz, EuropCar, Avis, etc. Es una forma bastante recomendable de viajar, ya que los trenes no siempre tienen buenas combinaciones, según donde quieras ir.

Por ejemplo, el trayecto desde el Aeropuerto de Stansted (Londres) hasta mi casa, requiere de 2 trenes y un taxi, con un coste total aproximado de 130 euros, y unas 3.5 horas de viaje (contando trasbordos, etc). Cuando tengo que hacerlo, suelo preferir alquilar un coche en Stansted y conducir hasta casa. Me viene a costar más o menos la mitad de dinero, y solo 1.5 horas de viaje. Como veis, merece la pena.

Como siempre, os aconsejo que cojáis el coche con los máximos seguros posibles, y que exijáis recibo al entregarlo, indicando que habéis devuelto el coche en buenas condiciones.

Conducir con tu coche Español en Inglaterra

Este es un tema delicado.

En teoría, solo puedes traer tu coche aquí de forma temporal. Hay quien dice que para un mes, hay quien dice que para 2, o para 6 meses. No puedo asegurar cual es la respuesta correcta, aunque está claro que solo están permitidas estancias temporales. Lo cierto es que debes tener en cuenta diversos factores:

  • Legalidad de tu estancia: es complicado que te multen por esto, ya que aunque aquí es más fácil saber cuándo entraste al país por aquello de que es una isla, no es la práctica habitual.
  • Cobertura de tu seguro: todos los seguros españoles deben cubrirte aquí, en virtud del tratado Europeo que rige este tema, pero solo lo hacen de forma temporal, para periodos vacacionales y no para estancias más o menos permanentes.
  • Seguridad y aspectos técnicos: no es muy cómodo conducir con el volante en el lado equivocado del coche, os lo aseguro (en las rotondas, por ejemplo, no ves nada). Si vuestro coche no tiene indicador de velocidad en millas, tendréis que andar calculando a qué velocidad vais, y además, los focos del coche deslumbrarán a los del otro carril por la noche. Así que cuidadín…

Se de gente que lleva con coches extranjeros aquí 8 años. Aunque ya os digo, os puede caer una gorda si de algún modo te pillan. No lo recomiendo.

Legalizar tu coche español en Inglaterra

Una opción, aunque no muy sencilla, es registrar el coche aquí y legalizarlo. Para ello, debéis disponer de una residencia permanente, y seguir los siguiente pasos:

  • Pasar el M.O.T (el equivalente a la ITV española): el MOT británico es bastante menos estricto que el español para muchas cosas, pero paradójicamente exige a los coches extranjeros dos modificaciones: que el indicador analógico de velocidad esté en millas (te lo exigen, aunque como en mi caso tengas un display digital configurable en millas), y que los focos estén adaptados a la conducción por la izquierda. En mi caso, pedí presupuesto en la Audi, y estas dos modificaciones implican un coste de 1500 libras.
  • Obtener un Tax Disk: Una vez tengas el MOT, debes registrar el coche a tu nombre, y pagar los impuestos correspondientes. Te dan un disco de pago de impuestos que todos los coches británicos llevan en el parabrisas (parecido a como hacemos en España con la pegatina de la ITV). Es como el de la foto:

  • Sacar un seguro británico al coche: Una vez registrado y legalizado, ya puedes asegurar tu coche aquí (como en casi todos los países, las aseguradoras no aseguran coches no registrados legalmente en inglaterra). Ver siguiente apartado para más info.

Con esas dos cosas, ya puedes circular legalmente.

Comprar un coche & contratar un seguro

Como ya he explicado en el apartado anterior, legalizar tu coche aquí no es sencillo, ni barato. Por eso, la opción más recomendable es comprar un vehículo aquí. El mercado de segunda mano está muy bien. Hay muchas opciones, y bastante económicas. Mejor que en España, en ese sentido.

Lo que no está tan bien es el tema del seguro. Por ser extranjero, ninguna (o muy muy pocas) compañías te van a convalidar tu historial de baja siniestralidad, por lo que el seguro te va a costar un ojo de la cara. Además, muchas compañías no te aseguran coches de cierta gama (solo coches pequeños). Yo he buscado muchos seguros, y algunas compañías ni siquiera me aseguran un coche tipo BMW Serie 3. Lamentable.

Para que os hagáis una idea, un seguro a terceros básico, para un coche barato que no pase de 3000 o 4000 libras, puede costaros tranquilamente unas 1300-1500 libras al año. Y eso con casi 20 años de experiencia de carnet. Es prohibitivo…

Otras consideraciones

Cuenta bancaria y dirección de residencia permanente

En Inglaterra no tienen DNI, y una de las muchísimas consecuencias negativas de esto es que necesitas justificar una dirección permanente para casi todo.

Si pensáis comprar un coche o sacar un seguro, vais a necesitar casi seguro:

  • Una cuenta bancaria (aunque hay seguros que permiten pagar periódicamente con cheque, para registrar el coche y pagar los impuestos es muy probable que os lo pidan).
  • Una dirección de residencia permanente, justificada con el contrato de alquiler o recibos de luz, etc.

El problema es que, por muy absurdo que parezca, no es fácil abrir una cuenta bancaria en Inglaterra. Así como los bancos en España te ponen la alfombra roja sin ningún problema, aquí no. Y da igual cuanto dinero lleves, por lo general no te abrirán una cuenta si no tienes dirección de residencia permanente, y no podrás alquilar una casa (y así tener residencia permanente) si no tienes cuenta bancaria. Así que, como ves, es la pescadilla que se muerde la cola.

Combustible

La gasolina es más cara que en España y al igual que allí, también hay diferencias de unos sitios a otros. Actualmente su precio ronda los 148 peniques el litro de diesel, y algo menos la gasolina sin plomo. Sorprendentemente, aunque los coches miden el consumo en millas/galón (millas recorridas con cada galón de combustible), cuando vas a repostar, la unidad de medida que usan son los litros, como en España (bendito sistema métrico).

Animales

No se si en el Reino Unido hay más animales sueltos por ahí que en España, pero la verdad, lo parece. Supongo que la enorme cantidad de vegetación que hay (fruto de tanta lluvia) ayuda a ello. Lo cierto es que se ven MUCHOS animales muertos en las carreteras (como ya hemos dicho, las autovías no están valladas). Por ahora he tenido la suerte de no atropellar ninguno, pero muchas veces he estado a punto (que yo recuerde, un par de ardillas, uno conejo, dos ratones y un par de aves cuyo nombre desconozco y que no tienen pinta de volar).

Inundaciones

Como consecuencia del terrible estado de las carreteras convencionales, y de la ingente cantidad de agua que cae aquí todo el año, hay muchas balsas de agua en la calzada, e incluso zonas que se inundan. Si veis esta señal (peligro, carretera que puede inundarse), cuidadín…

El tiempo

Como es de esperar, llueve. Llueve mucho. Por eso es esencial tener los neumáticos en buen estado, y los limpias también. También suele haber bastante niebla, así que las precauciones deben ser máximas casi todos los días. A estas alturas del año ya hay heladas importantes, y nieva bastante en invierno, así que unos neumáticos de invierno son recomendable.

Otras cosas

Si vais a conducir por Inglaterra, y conocéis por qué zona os vais a mover, Google Street View es una herramienta muy buena para hacerse una idea de cómo es la zona, el tipo de cruces que os vais a encontrar, etc. Y por supuesto, el GPS es más que recomendable.

Y lo más importante… NO OLVIDÉIS IR POR EL LADO IZQUIERDO DE LA CARRETERA !!! jajaja… Smile

DirectX Control Panel and D3D Debug Output in D3D 9.x/10.x/11.x for Windows 7, 8 and 8.1

Debugging D3D applications can be a pain, but it´s completely necessary sometimes if you want to know what´s going on in your D3D application (error codes don´t give much information without the debug output).
However, things have changed quite a bit recently in the latest versions of Windows (8.1), Visual Studio (2013) and DirectX (11.2). The following video explains some of the changes related to D3D Debugging, the DirectX Control Panel, and how all the new infrastructure works:

You can also access the content in the form of slides.
Keep in mind that some of the DirectX features are no longer distributed with the DirectX SDK, but with the Windows SDK. So, we will try to cover all the possible cases you could face when trying to activate the Debug Output in D3D, no matter if you work in Windows 7 with the old version of DirectX SDK (June 2010), if you are in Windows 7 or Windows 8 and use the new Windows SDK, or if you are in the latest Windows 8.1 with its own Windows SDK.

The New DirectX Control Panel

We will need to deal with it to enable D3D debug and to manage other stuff, so first thing is to learn to differentiate between the old one (June 2010 DirectX SDK) and the new ones (Windows SDK). It´s easy: the new ones only include one tab (Direct3D 10.x/11.x):
Old Control Panel (DirectX SDK June 2010)
New DX Control Panel (Windows SDK)
image image
Location:
C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x64 (or x86)
Location:
C:\Windows\System32

So, if you are developing for D3D 10.x or 11.x, use the new one as the old one won´t have any effect. If you are still using D3D9 and the old DX SDK 2010, grab the one on your left.
Note: See the above video to learn about new features in the panel like the “Feature level limit”.

Windows 7

D3D 9.x

If you are still developing with D3D9, honestly you should seriously consider moving forward. But if you can´t, and you need to enable debug in your app, you just need to use the OLD Control Panel described above, and navigate to the Direct3D 9 tab to make sure you select “Use Debug Version of Direct3D 9”, and turn the Debug Output Level to “More”, just like depicted in the following image:
image
That should force your DirectX applications to use the Debug version of the DirectX libraries, so you should immediately start to see debug output in Visual Studio.

Managed D3D9 applications (SlimDX, SharpDX and similar wrappers)

If you are developing in C#, keep in mind that you will also need to activate the flag “Enable native code debugging” under the Debug tab of your main project properties in Visual Studio. If not, the native debug output cannot get through to the output window.
image

D3D 10.x / 11.x

Important None: The necessary components for debugging D3D 10.x and 11.x are no longer installed with the old DirectX SDK (June 2010). In order to have them you need to install the Windows 8 SDK (even if you are in Win7). If you don´t have the necessary components, the creation of the device with the "debug" flag will fail (see below for more info). One easy way to check if you have the components is to check the existance of the NEW DX Control Panel, in C:\Windows\System32.

Activating the debug output in D3D 10.x / 11.x is a bit different, as settings are handled per application (you need to add your exe to a list in the control panel, and set an specific configuration for it in there). To do so, please follow these steps:
  1. 1.- Open the NEW DirectX Control Panel and navigate to the Direct3D 10.x / 11 tab
  2. 2.- Click on “Edit List” to add your exe to the list of applications controlled by the DX panel
  3. 3.- In the window that will pop up (below), click on the dots “…” and navigate to your exe file. Then click “Ok”.
image
  1. 4.- Back in the main tab, choose the configuration you want (probably want to set “Force On” to force debug output), and mute all the message types you don´t want to see (if any)
Once your exe is on the list of apps the Control Panel manages, next step is to make sure your D3D device connects to the Debug Layer of DirectX.
You can find more info here, but basically what you need to do is create your Device with Creation Flags including the D3D11_CREATE_DEVICE_DEBUG flag.

Managed D3D 10.x /11.x applications (SlimDX, SharpDX and similar wrappers)

Just like with D3D 9, when developing in C# you should remember to activate the flag “Enable native code debugging” under the Debug tab of your main project properties in Visual Studio. If not, the native debug output cannot get through to the output window (see above in this post for more info).

Windows 8.x + Windows SDK

This part covers the case when working in Windows 8.x with the newer versions of the Windows SDK.

D3D 9.x

Debugging D3D 9 applications in Windows 8 should work exactly the same as we did in Windows 7. Of course, the new Windows SDK doesn’t include tools to configure D3D9, so you should install the June 2010 DX SDK to get access to the OLD control panel. I couldn’t make sure this works as all my machines are updated to Windows 8.1, so any feedback here will be really welcome.
What I can tell you is that, unfortunately, D3D9 debugging seems to be disabled in Windows 8.1. If you open the OLD DX Control Panel, you will see that all the debug parts of the D3D 9 tab are grayed out. I tried by all means to bring it back with no luck, so if you manage to enable it, please let me know.

D3D 10.x / 11.x

Enabling debug output for D3D 10.x and 11.x is pretty much the same as in the case of Windows 7, unless this time you will need to use the NEW version of the DX Control Panel, located in C:\Windows\System32 instead of the usual DXSDK folders.
Also, remember to create your devices specifying the D3D11_CREATE_DEVICE_DEBUG creation flag (as described above), and in the case of developing in C#, remember to activate the “Enable native code debugging” option in your main project.

Troubleshooting

  • The application works but I get no debug output: If you are in D3D9, make sure you activated the Debug libraries in the old DX Control Panel. Also, if you work in C#, ensure to activate the “Enable native code debugging” option. If you work in D3D 10/11, make sure you created the device with the D3D11_CREATE_DEVICE_DEBUG flag, and don´t forget to add your app to the list of programs managed by the DX Control Panel. In all cases, always use the appropriate DX Control Panel (see above to learn about this).
  • In D3D 10.x / 11.x, the application fails while trying to create the device with the DEBUG creation flag: This usually happens if you don´t have the correct SDK installed. If you are in Windows 7 or in Windows 8, make sure you install the Windows 8 SDK. If you are in the latest Windows 8.1 you should install its own Windows 8.1 SDK, as it´s not compatible with the 8.0 SDK version. One easy way to check if you have the components is to check the existance of the NEW DX Control Panel, in C:\Windows\System32.

Por qué el Nokia Lumia 9XX es el mejor móvil del mercado

Soy un usuario de telefonía bastante básico, lo reconozco. A estas alturas, le pido más bien pocas cosas a un móvil… Básicamente: hacer llamadas y SMS, Whatsapp, Line, Facebook, Twitter, Skype, poder navegar con fluidez, accesibilidad básica (Wifi, compartir conexión de internet, etc), una cámara de fotos decente, un buen navegador GPS, seguridad, tener mapas y guías offline, ser resistente, una experiencia de usuario rápida y sin retardos, un interfaz de usuario fácil e intuitivo, una buena integración con mi PC y una buena duración de batería. Bueno, visto así, quizá no sean tan pocas cosas… Sonrisa

Pues resulta que hoy me he dado cuenta de que en muchos de esos apartados, los Nokia Lumia 9XX son los mejores. Con mucha diferencia.

Ya se ha hablado largo y tendido de Windows Phone 8, de su interfaz, etc, por lo que no me centraré aquí en los aspectos propios del Sistema Operativo, sino en aquellos que hacen que los Lumia 9XX destaquen, incluso por encima de otros terminales WP8.

En mi caso, tengo un Lumia 920, así que vamos allá… Aspectos realmente increíbles de este teléfono:

Cámara de Fotos / Video

La cámara del Lumia es, simplemente, alucinante. Ya se ha hablado largo y tendido de ella, pero casi siempre la gente se limita a hablar de su capacidad para hacer fotos con poca luz (que la verdad, es increíble). Pero tiene otras muchas virtudes:

Modo macro

Es simplemente alucinante que una cámara de móvil pueda hacer una foto así, y encima sin tener que pegarte con ajustes de ningún tipo: solo tienes que dejarla en modo auto y acercarla mucho a algo. Donde cualquier otro móvil sacaría un borrón, el Lumia 920 saca esto (fotos tomada esta misma mañana):

183

172

Otros ejemplos de fotos:

Todas estas fotos han sido sacadas con mi propio Lumia 920, esta semana:

186176

170137

Video:

El estabilizador de imagen del Nokia Lumia 920 es alucinante. Realmente permite hacer grabaciones increíbles, incluso cuando vas caminando. Aquí tenéis un ejemplo (no grabado por mi), aunque por mi experiencia personal debo decir que el resultado todavía es más impresionante que lo que se aprecia en el:

Mapas / Navegación

Ahora, la versión WP8 de Here Maps y Here City Lens, de Nokia, permiten “tirar” de os mapas offline descargados para el navegador. Esto es algo que siempre he echado mucho de menos en todos los móviles que he tenido, ya que… ¿Cuando utilizas con más frecuencia los mapas del movil y las herramientas de guía? Cuando viajas. Y si estás en el extranjero, y no tienes roaming, no te sirven de nada.

Pues bien, Nokia ha solucionado este problema de forma brillante, y con los 32 GB de almacenamiento del Lumia 920 tenemos espacio más que de sobra para descargar mapas.

Navegador GPS:

Es, a falta de otra palabra mejor… brillante. Solo diré que, desde que adquirí mi primer Nokia Lumia, nunca más he tocado mi navegador TomTom:

  • Las indicaciones por voz son las mejores que he visto nunca en un navegador, casi no hace falta ni mirar a la pantalla (simplemente haz lo que te va diciendo). El volumen es más que de sobra para escuchar las indicaciones, incluso cuando llevas música en el coche, o las ventanillas abiertas (de hecho, siempre llevo el volumen a menos de la mitad, ya que si no resulta excesivo).
  • Dado que utiliza el sensor GPS en combinación con la triangulación de los repetidores de telefonía para localizarte, no le cuesta ni 3 segundos encontrarte en el mapa. La precisión es siempre muy buena, y gracias a los repetidores de telefonía, no se queda completamente sin señal en los túneles. La precisión baja mucho, pero al menos tu coche sigue moviéndose en el mapa, algo importante en ciudades con mucha circulación subterránea.
  • Los mapas (disponibles para todo el mundo), son gratis… ¿Algo más que decir?
  • En cuanto a la fiabilidad, solo puedo decir que he utilizado intensamente el sistema de Nokia en España, Francia, Inglaterra y Estados Unidos, sin ningún tipo de problema.

Skype

Utilizo bastante Skype, y la implementación para WP8, en combinación con la calidad de la cámara del Lumia 920 es alucinante. Además, tengo la suerte de contar con una red 4G, así que va como un auténtico tiro. La calidad de imagen es notablemente mejor que la de la cámara webcam de mi portátil. Flipante !

Resistencia

Todos hemos visto multitud de vídeos haciendo todo tipo de perrerías con las pantallas Gorilla Glass de los Lumia. Tengo Lumias desde hace un par de años, y la verdad es que todas las pantallas están como el primer día. Ni la más mínima raya, sin haber tenido ningún tipo de cuidado con ellas, ni llevar protector. Mis móviles han convivido en mis bolsillos con las llaves de casa, prácticamente siempre, y ni una muesca. Solo hay que ver este video…:

Cosas a mejorar

Sinceramente, la duración de la batería sigue siendo muy justita cuando le das un uso intenso (al igual que en todos los móviles de alta gama). En días muy intensivos, deberás pelear para llegar al final del día sin ver el simbolito de “batería a punto de fallecer”. El día que consigan mejorar ese aspecto, realmente habrá mucha gente que no necesitará ni tablets, ni portátiles…

Otro aspecto en el que todavía está por detrás es el cliente de Whatsapp. Evidentemente, esto es culpa de la propia whatsapp, y no de Nokia ni de Microsoft, pero es una pena. El cliente sigue siendo realmente cutre. Vamos Whatsapp !!!!

Al final, quizá tenga que lanzar Microsoft su propio cliente, como ha hecho con el lector de PDF, para remediar el desastroso trabajo que hizo Adobe con su cliente PDF para Windows Phone… Era realmente lamentable, se colgaba, y no era capaz de abrir prácticamente ningún PDF de tamaño medio. El lector de PDF de Microsoft funciona francamente bien.

Resumen

Nokia Lumia 920: Su cámara es la mejor del mercado (con mucha diferencia). Para el usuario medio, permite sustituir a una cámara de fotos compacta en el 90% de los casos. Como cámara de video, es realmente brillante también (incluso mejor que muchas cámaras de video específicas, que no incluyen ni grabación 1080p ni estabilización de imagen).

Como navegador GPS, no tiene rival. Sus mapas son muy muy buenos también, su funcionalidad Skype es increíble y el resto de funcionalidades del móvil, están cuando menos a la altura de los mejores.

¿Se puede pedir algo más?

Bueno, sí… Que ciertos redactores de páginas como Gizmodo.es dejen de lado su aparente aversión a todo lo que huela a Microsoft, y valoren los productos objetivamente. Quizá algún día salga a la luz que, en realidad, están a nómina de otras empresas, porque si no no se entiende…

Saludos !!!

¿Demasiados efectos especiales?

Ayer estuve viendo Iron Man 3. Psé… salvo los chistes de Robert Downey Jr. (con los que me reí mucho), la película en sí es flojilla… Y es que quizá sea que me hago mayor, pero la verdad, hace ya tiempo que me cansa la tendencia que llevamos soportando desde hace años: más efectos especiales, más espectacularidad, más acción, más de todo...

Los efectos especiales han experimentado varias evoluciones, o varias generaciones: al principio, apenas añadían cuatro cositas al metraje grabado con cámara real, pero a medida que la tecnología avanza, el protagonismo en pantalla de los FX ha ido creciendo notablemente (todos recordamos la re-edición que George Lucas hizo de las tres primeras películas de Star Wars, para añadirles MAS efectos especiales).

Un ejemplo: los efectos especiales de Highlander (Los Inmortales), de 1986:

 

Con el tiempo, hemos visto como los contenidos generados por ordenador (CG, o CGI) han ido reemplazando cada vez más cosas en pantalla, llegando incluso a rodar con los actores frente a paneles verdes o azules (con todo el entorno reemplazado por ordenador), o incluso algunas intentonas (no muy exitosas) de introducir actores CG en primeros planos de películas (recuerdo ahora el T-800 con aspecto de Arnold Schwarzenegger de Terminator Salvation, introducido con CG porque Arnie había dado el salto a la política):

 

Con cada una de estas "evoluciones", se vive una inevitable obsesión por utilizar la nueva tecnología hasta la saciedad. Es una especie de competición de "y yo más", que normalmente hace que la historia y el guión pierdan protagonismo, y por lo tanto, las películas rodadas en esos momentos dejen bastante que desear. Las nuevas películas de Batman, la propia Terminator Salvation, y algunos otros ejemplos más, abrían un hueco a la esperanza… Son ejemplos a seguir, en los que los efectos especiales están al servicio de la historia, y no al revés.

Pero ahora nos toca vivir una nueva generación o evolución de Fx: minutos enteros de metraje de película que son enteramente CG (generados por computador), en los que no hay ni un solo elemento real. Escenarios, entornos, actores, todo es CG.

Y es que éste es un cambio notable… Prescindir de actores, escenarios y cámaras reales otorga una libertad sin precedentes (sin mencionar la reducción de costes), permitiendo planos de cámara imposibles y escenas totalmente inviables con técnicas tradicionales. Spiderman fue una de las primeras películas que empezó a utilizar estas técnicas con cierto éxito, y sin que el espectador medio lo notara (increíbles travelings de cámara alrededor de Nueva York, con el protagonista colgándose por los edificios). Los Vengadores ya incluyó bastantes planos en los que los actores con CG (siempre que estén lejos, o se muevan muy rápido para que el motion blur disimule lo suficiente).

Así que, como siempre, antes de que esta nueva obsesión se enfríe y estas técnicas queden al servicio de la película, el guión y la historia (como debe ser), me temo que tendremos que vivir otra nueva escalada de "a ver quién la tiene más grande".

Solo hace falta ver el trailer de Pacific Rim...

Realtime, screen-space local reflections, using C# and SharpDX

The following video shows my own implementation of the technique "Real Time Local Reflections (RLR)" used by Crytek in CryEngine3, and described here.

This particular implementation works with a non-deferred rendering system, and it’s adapted to work particularly well with planar surfaces like roads (which is what we most use it for, here at Simax).

The process is basically doing a texture lookup for the reflections as usual, but instead of using a cubemap, we use a simple texture (a copy of the previous back-buffer). It also needs a copy of the previous frame's depth buffer, to do a raymarch looking for the appropriate sample. The steps are the following:

  1. 1.- Start from the screen position of the pixel you are shading
  2. 2.- Move along the direction of the reflected (and projected to screen space) normal
  3. 3.- At each step, take a sample of the depth buffer, and look for a hit. If found, use the sample of the backbuffer at the same offset. If not, move one step forward until you are out of the texture bounds

Cons

It has a lot of downsides, as the amount of information present on a single texture is very limited. One key aspect is to fade out when you are reaching the limits of the backbuffer and when the reflection vector is facing the viewer (and therefore doesn´t hit the backbuffer). That way, you avoid hard edges in the reflection.

Another limitation is its compatibility with multisampling. The problem is that you need a copy of depth buffer, and if it's multisampled, you need to resolve it to a single sampled resource. Resolving the depth buffer from a multisample resource is not a trivial task, and in DX10 only graphics cards, it seems to be not possible (beside from doing it manually).

The method: ResolveSubResource does a good job with back-buffers, but it doesn´t work with depth-buffers (I haven´t tried in DX11 yet). Another option is to move to DX 10.1 and pass the depth buffer to the shader as a multi-sampled resource, using the Texture2DMS type introduced in DX 10.1. It allows to pass multi-sampled resources to shaders, so the resolving can be done in the shader.

Pros

The major advantage of this method is speed. By grabbing only the previous backbuffer, you can add reflections to almost any object in your scene. Of course, the shader used to draw is slower than a simple one, but nothing compared with the cost of rendering multiple cube-maps or other methods...

Also, despite its cons, it does a pretty convincing job in certain cases. Wet roads, water shaders and such stuff is a perfect case for it, as when you are driving in a simulator, the angle of incidence on the road, and therefore the reflection vector fit well with the back-buffer projection.

Another implementation of the technique can be found here. I haven´t tried it, but it seems to work too…

Cheers !

Projecting a 3D Vector to 2D screen space, with automatic viewport clipping (DirectX, SlimDX or XNA)

Many times, you will need to know the 2D screen coordinates of a 3D world position. DirectX already includes methods to perform vector projections, taking into account the needed World, View and Projection matrices, as well as the viewport scaling. It does not include however viewport clipping, as an additional feature in those methods.

Viewport clipping can be a tricky matter, and sometimes, you will need to rely on algorithms like the Sutherland-Hodgman algorithm, or the refined version specifically developed for 2D viewports: the Cohen-Sutherland algorithm. Those methods are especially appropriate when you are already dealing with 2D coordinates, or if you need to know the extra points or polygons generated when clipping is performed.

In our case however, we will only focus on finding the closest in-screen coordinates that correspond to an off-screen point, without dealing with any extra geometry or polygon sub-division. It’s important to note also that we will be working with 3D coordinates that go through a projection process (and finally getting 2D coords). This is relevant, as provides us with additional information we can use, and allows us to jump inside the algorithm and perform the clipping in the middle of the projection pipeline, instead of doing so at the end, when the coordinates are already 2D.

Resources like this, and this explain very well the processing of vertices in the Direct3D pipeline:

untitled

As you can see, each 3D position travels through different stages and spaces of coordinates: model space –> world space -> camera space –> projection space –> clipping space –> homogeneous space –> and finally: Screen Space.

Evidently, D3D also performs certain types of clipping to vectors, and you can tell by the above picture that clipping is done, (surprisingly), in clip space. We will try to mimic that behavior…

Note: Transforming coordinates with the MClip matrix, to go from projection space to clip space should be done only if you want to scale or shift your clipping volume. If you are ok with a clipping volume that matches your screen render target viewport (you will, most of the cases), you should leave this matrix as the Identity, or simply don´t perform this step. The below written algorithm has all this step commented.

Once our coordinates are in Clip Space (Xp, Yp, Zp, Wp), we easily perform the clipping by limiting their values to the range: –Wp .. Wp for the X and Y, and to the range: 0 .. Wp for Z.

After that, we just need to proceed with the normal Vector projection algorithm, as the resulting 2D coordinates will be stuck inside the screen viewport. An extra feature that should be nice to have, is a simple output variable that tells us if the coordinates were inside or outside the viewport.

A C# implementation of such an algorithm could be:

public static Vector2 ProjectAndClipToViewport(Vector3 pVector, float pX, float pY,
                                float pWidth, float pHeight, float pMinZ, float pMaxZ,
                                Matrix pWorldViewProjection, out bool pWasInsideScreen)
        {
            // First, multiply by worldViewProj, to get the coordinates in projection space
            Vector4 vProjected = Vector4.Zero;
            Vector4.Transform(ref pVector, ref pWorldViewProjection, out vProjected);

            // Secondly (OPTIONAL STEP), multiply by the clipMatrix, if you want to scale
            // or shift the clip volume. If not (most of the times you won´t), just leave 
            // this part commented,

            // or set an Identity Matrix as the clip matrix. The default clip volume parameters
            // (see below), will produce an identity clip matrix.

            //float clipWidth = 2;
            //float clipHeight = 2;
            //float clipX = -1;
            //float clipY = 1;
            //float clipMinZ = 0;
            //float clipMaxZ = 1;
            //Matrix mclip = new Matrix();
            //mclip.M11 = 2f / clipWidth;
            //mclip.M12 = 0f;
            //mclip.M13 = 0f;
            //mclip.M14 = 0f;
            //mclip.M21 = 0f;
            //mclip.M22 = 2f / clipHeight;
            //mclip.M23 = 0f;
            //mclip.M24 = 0f;
            //mclip.M31 = 0f;
            //mclip.M32 = 0;
            //mclip.M33 = 1f / (clipMaxZ - clipMinZ);
            //mclip.M34 = 0f;
            //mclip.M41 = -1 -2 * (clipX / clipWidth);
            //mclip.M42 = 1 - 2 * (clipY / clipHeight);
            //mclip.M43 = -clipMinZ / (clipMaxZ - clipMinZ);
            //mclip.M44 = 1f;
            //vProjected = Vector4.Transform(vProjected, mclip);
            
            // Third: Once we have coordinates in clip space, perform the clipping,
            // to leave the coordinates inside the screen. The clip volume is defined by:

            //
            //  -Wp < Xp <= Wp
            //  -Wp < Yp <= Wp
            //  0 < Zp <= Wp
            //
            // If any clipping is needed, then the point was out of the screen.
            pWasInsideScreen = true;
            if (vProjected.X < -vProjected.W)
            {
                vProjected.X = -vProjected.W;
                pWasInsideScreen = false;
            }
            if (vProjected.X > vProjected.W)
            {
                vProjected.X = vProjected.W;
                pWasInsideScreen = false;
            }
            if (vProjected.Y < -vProjected.W)
            {
                vProjected.Y = -vProjected.W;
                pWasInsideScreen = false;
            }
            if (vProjected.Y > vProjected.W)
            {
                vProjected.Y = vProjected.W;
                pWasInsideScreen = false;
            }
            if (vProjected.Z < 0)
            {
                vProjected.Z = 0;
                pWasInsideScreen = false;
            }
            if (vProjected.Z > vProjected.W)
            {
                vProjected.Z = vProjected.W;
                pWasInsideScreen = false;
            }

            // Fourth step: Divide by w, to move from homogeneous coordinates to 3D
            // coordinates again

            vProjected.X = vProjected.X / vProjected.W;
            vProjected.Y = vProjected.Y / vProjected.W;
            vProjected.Z = vProjected.Z / vProjected.W;

            // Last step: Perform the viewport scaling, to get the appropiate coordinates
            // inside the viewport

            vProjected.X = ((float)(((vProjected.X + 1.0) * 0.5) * pWidth)) + pX;
            vProjected.Y = ((float)(((1.0 - vProjected.Y) * 0.5) * pHeight)) + pY;
            vProjected.Z = (vProjected.Z * (pMaxZ - pMinZ)) + pMinZ;

            // Return pixel coordinates as 2D (change this to 3D if you need Z)
            return new Vector2(vProjected.X, vProjected.Y);
        }

Hope it helps !

Sonrisa

New XNA 4 book by Kurt Jaegers [Packt Publishing]

Kurt Jaegers has a new book on XNA 4 Game Development. I´ll review it in a few days, by now, I paste here some word from the author itself:

“This book follows the same style as my previous books on 2D game development with XNA, bringing three different 3D games to life. I cover items such as:
- The basic concepts behind 3D graphics and game design
- Generating geometry with triangles
- Converting height map images into terrain
- An introduction to HLSL, including writing shaders that handle lighting and multi-texturing
- Building a 2D button-based interface to overlay on your 3D action
- Implementing skyboxes for full 3D backgrounds”

More info here and here.

Memory limits in a .Net process

This article tries to be an introduction on .Net memory management and about the memory limits both the Runtime and the platform establish for each process. We will also give some tips about dealing with the problems you will face when reaching those limits.

Available memory for a process

As you already know, no matter how much physical memory you install in a computer. Your application will face several issues that will limit the actual memory available for it.
For instance, a 32 bit system cannot have more than 4 GB of physical memory. Needless to say that 2^32 will give you a virtual address space with 4.294.967.296 different entries, and that’s precisely where the 4GB limit comes from. But even having those 4GB available on the system, your application will actually be able to see 2GB only. Why?
Because on 32 bits systems, Windows splits the virtual address space into two equal parts: one for User Mode applications, and another one for the Kernel (system applications). This behavior can be overridden by using the “/3gb” flag in the Windows boot.ini config file. If we do so, the system will then reserve 3GB for user applications, and 1 GB for the kernel.
However, that won’t change the fact that we will be able to see only 2GB from our application, unless we explicitly activate another flag in the application image header: IMAGE_FILE_LARGE_ADDRESS_AWARE. The combination of both flags on a 32bit Operating System is commonly known as: 4GT (4 GigaByte Tuning).
Surprisingly on 64 bit environments, the issue is pretty similar. Even though these systems don’t suffer from the same limitations about physical memory or reserved address space for the kernel (in fact, in those systems the /3gb flag doesn’t apply), processes hit with the same wall when trying to address more than 2 GB. Unless the same flag is set for the executable (IMAGE_FILE_LARGE_ADDRESS_AWARE), the limit will be always the same by default.

Activating the flag: IMAGE_FILE_LARGE_ADDRESS_AWARE

  • In native, Visual C++ application, it’s pretty straightforward to set that flag, as Visual Studio have an option for that. You just need to set the /LARGEADDRESSAWARE Linker parameter, and you are ready to go.
  • In C#, .Net applications:
  1. Applications compiled as 64bit will have that flag set by default, so you will already have access to a 8TB address space (depending on O.S. versions)
  2. Applications compiled as 32bits will need to be modified with the tool called EditBin.exe (distributed with Visual Studio). This tool will set the appropriate flag to your EXE, allowing your application to access a 4GB address space if running in a 64bit Windows, or to a 3GB address space if running in a 32bit Windows with the 4GT tuning enabled.
Next table (taken from here), summarizes the limits in virtual address space, depending on the platform and on the kind of process we are running:
image
This page has much more info on the issue.

System memory limits. Closer than you expect

Nowadays, memory is cheap. However, as explained in the previous chapter, there are many situations where you will end up having only 2 GB available, despite the total amount of physical memory installed in your PC.
In addition to that, if your application is being developed in .Net, you will find that the Runtime itself introduces a remarkable memory overhead (around 600-800 MB). So, it’s not strange to start receiving OutOfMemory exceptions when reaching 1.2 or 1.3 GB of memory used. This blog talks further about this.
So, if you are not in one of those cases, where the address space is expanded beyond 2 GB, and your are developing in .Net, your actual memory limit will be around 1.3 GB.
That’s more than enough for 99% of applications, but others, like intensive computing apps or those related to databases, may need more. Way more…

And things get even worse…

To make things even more complicated, you will soon learn that one thing is having some amount of memory available, and another, completely different story is to find a contiguous block of memory available.
As you all know, as a result of O.S. memory management, techniques like Paging and the creation and destruction of objects, memory gets more and more fragmented. That means that even though there is a certain amount of free memory, it is scattered through a bunch of small holes, instead of having a single, big chunk of memory available.
Modern Operating Systems and the .Net platform itself apply methodologies to prevent fragmentation, like the so called Compaction (moving objects in memory to fuse several free chunks of memory into a single, bigger one). Although these techniques reduce the impact of fragmentation, they do not eliminate it completely. This article describes in detail the .Net Garbage Collector (GC) memory management, and the compaction task it performs.
In the context of this article, fragmentation is a big issue, because if you need to allocate an 10 MB contiguous array, even if there’s 1 GB of free memory available for your process, you will receive an OutOfMemory exception if the system cannot find a contiguous chunk of memory for the array. And this happens more frequently than you may expect when you deal with big arrays.
In .Net, fragmentation and compaction of objects is tightly related to object’s size, so let’s talk a bit about that too:

Allocation of big objects

Maybe you don’t know it, but all versions of .Net until the last one (1.0, 2.0, 3.0, 3.5 and 4.0) have a limit on the maximum size a single object can have: 2 GB. No matter if you are running in a 64bit or 32bit process, you cannot create anything bigger than that, in a single object. It’s only since version 4.5 when that limit has been removed (for 64 bit processes only). However, besides very few exceptions, you are very likely applying a wrong design pattern to your application if you need to create such a big objects.
In the .Net world, the GC classifies objects into two categories: small, and large objects. Where you expecting something more technical? Yeah, me too… But that’s it. Any object smaller than 85000 bytes is considered small, and any object larger than that is considered large. When the CLR is loaded, the Heap assigned for the application is divided into two parts: the SOH (Small Objects Heap) and the LOH (Large Objects Heap). Each kind of object is stored on it’s correspondent Heap.
It’s also remarkable to say that Large object’s compaction is very expensive, so it’s directly not done in current versions of .Net (developers said that this situation might change in the future). The only operation similar to compaction done with Large objects is that two adjacent dead objects are fused together into a single chunk of free memory, but no Large object is currently moved to reduce fragmentation.
This fantastic article has much more information about the LOH.

C# Arrays when reaching memory limits

Simple Arrays (or 1D arrays) are one of the most common ways of consuming memory in C#. As you probably know, the CLR always allocates them as single, contiguous blocks of memory. In other words, when we instantiate an object of type byte[1024], we are requesting 1024 bytes of contiguous memory, and you will get an OutOfMemory exception if the system cannot find any chunk of contiguous, free memory with that size.
When dealing with multi-dimensional arrays, C# offers different approaches:

Jagged arrays, or arrays of arrays: [][]

Declared as byte[][], this is the classical solution to implement multi-dimensional arrays. In fact, it’s the only approach natively supported in languages like C++.
With regards to memory allocation, they behave as a simple array of elements (one block of memory), where each one of them is another array (another, different block of memory). Therefore, an array like byte[1024][1024] will involve the allocation of 1024 blocks of 1024 bytes memory each.

Multi-Dimensional Arrays: [,]

C# introduces a new kind of arrays: multi-dimensional arrays, declared like byte[,].
Although they are very comfortable to use and easy to instantiate, they behave completely different with regards to memory allocation, as they are allocated in the Heap as a single block of memory, for the total size of the array. In the previous example, an array like byte[1024, 1024] will involve the allocation of one single, contiguous block of 1 MB.
In the next chapter we will make a quick comparison of both types of arrays:

Comparison: [,] vs [][]

2D array [,] (allocated as a single block of memory):
Pros:
  • Consumes less memory (no need to store references to all N blocks of memory)
  • Faster allocation (allocating a bigger, single block of memory is faster than allocating N, smaller blocks)
  • Easier instancing (enough with one single line: new byte[128, 128])
  • Useful tool methods, like GetLength(). Cleaner and easier usage.
Cons:
  • Finding a single block of contiguous memory for them might be a problem, specially if dealing with big arrays, or when reaching memory limits for your process
  • Accessing elements in the array is slower than in jagged arrays (see below)
Jagged arrays [][] (allocated as N blocks of memory):
Pros:
  • It’s easier to find available memory for this kind of arrays, because due to fragmentation, it’s more likely that there will be N blocks of smaller size available than a single, contiguous block of the full size of the array.
  • Accessing elements in the array is faster than in 2D arrays, mostly because the optimizations in the compiler for handling simple, 1D arrays (after all, a jagged array is composed of several 1D arrays).
Cons:
  • Consumes a bit more memory than 2D arrays (need to store references to the N simple arrays).
  • Allocation is slower, as it needs to allocate N elements instead of a single block
  • Instancing is uncomfortable, as you need to loop through array elements to instantiate them too (see below for tip)
  • Doesn’t provide with tool methods, and might be a bit more complex to read and understand
This blog have a great comparison about them too.

Conclusion

Each user should decide which kind of array fits best the specific case he is dealing with. However, a developer that usually needs big amounts of memory, and who cares more about performance than comfort, ease of use or readability, will probably decide to use Jagged arrays ([][]).

Tip: code to automatically instantiate a 2D, jagged array

Instancing a multi-dimensional jagged array can be disturbing, and repetitive. This generic method will do the work for you:
        public static T[][] AllocateArray2D<T>(int pWidth, int pHeight)            
        {
            T[][] ret = new T[pWidth][];
            for (int i = 0; i < pHeight; i++)
                ret[i] = new T[pHeight];

            return ret;
        }
Hope it helps !!

Los límites de la memoria

Este artículo trata de servir como introducción a la gestión de memoria en .Net, los límites que el Runtime y la plataforma establecen para cada proceso, así como algunos Tips para lidiar con los problemas a los que nos enfrentamos al acercarnos a esos límites.

Memoria disponible por proceso

Como muchos de vosotros sabéis, por mucha memoria RAM que tenga instalada un ordenador, existen varias barreras impuestas a la cantidad de memoria usable en nuestras aplicaciones.

Por ejemplo, en un sistema de 32 bits no se pueden instalar más de 4GB de memoria física, evidentemente, porque 2^32 (dos elevado a 32) nos proporciona un espacio de direcciones con 4.294.967.296 entradas distintas (4GB). Pero incluso cuando el sistema cuente con 4GB de memoria física, nuestras aplicaciones se encontrarán con una barrera de 2GB impuesta por el sistema.

En estos entornos de 32 bits, cada proceso puede acceder a un espacio de direcciones de 2GB como máximo, porque el sistema se reserva los otros 2 para las aplicaciones que corren en modo Kernel (aplicaciones del sistema). Este comportamiento por defecto puede cambiarse mediante el uso del flag “/3gb” en el boot.ini del sistema, haciendo que Windows reserve 3GB para las aplicaciones que corren en Modo Usuario y 1GB de memoria para el Kernel.

Aún así, el límite por proceso permanecerá en 2GB, a no ser que explícitamente activemos un flag determinado (IMAGE_FILE_LARGE_ADDRESS_AWARE) en la cabecera de la aplicación. A esta combinación de flags en sistemas x86 se le denomina comúnmente: 4GT (4 GigaByte Tuning).

En sistemas de 64 bits sucede algo parecido. Aunque no tienen la misma limitación en cuanto a memoria física disponible, ni la impuesta por la reserva de direcciones para el kernel (y por lo tanto el flag /3gb no aplica en estos casos), el sistema también establece un límite por defecto de 2 GB para cada proceso, a no ser que se active el mismo flag en la cabecera de la aplicación (IMAGE_FILE_LARGE_ADDRESS_AWARE).

Activando el flag: IMAGE_FILE_LARGE_ADDRESS_AWARE
  • En el caso de aplicaciones nativas (C++), establecer dicho flag es fácil, ya que basta con añadir el parámetro /LARGEADDRESSAWARE a los parámetros del Linker dentro de Visual Studio.
  • En el caso de aplicaciones .Net:
    1. Si están compiladas para 64bits, este flag estará activado por defecto, por lo que podrán acceder a un espacio de direcciones de 8 TB (dependiendo del S.O.)
    2. Si están compiladas para 32bits, el entorno de Visual Studio no nos ofrece ninguna opción para activar dicho flag, por lo que tendremos que hacerlo con la utilidad EditBin.exe, distribuida con Visual Studio, la cual modificará el ejecutable de nuestra aplicación (activándole dicho flag).

La siguiente tabla, obtenida de esta página, muestra de forma resumida los límites en el espacio de direcciones de la memoria virtual, en función de la plataforma y del tipo de aplicación que estemos desarrollando:

image

Esta página tiene mucha más información sobre los límites de memoria según las versiones del S.O.

Los límites del sistema, más cerca de lo que crees

Hoy día, la memoria es barata, pero como ya se ha explicado en el apartado anterior, hay un buen número de casos en los que, por mucha memoria que instalemos en el PC, nuestro proceso solo podrá acceder a 2GB de la misma.

Además de esto, si vuestra aplicación está desarrollada en .Net, os encontraréis con que el propio Runtime introduce un overhead importante en cuestiones de memoria (suele decirse que está en torno a los 600-800 MB), por lo que en una aplicación corriente, es usual empezar a encontrar OutOfMemoryExceptions alrededor de los 1.3 GB de memoria usados. En este blog se discute el tema.

Por lo tanto, si no estamos en uno de esos casos en los que podemos direccionar más de 2GB, y además desarrollamos en .Net, independientemente de la memoria física instalada en el sistema nuestro límite real estará en torno a 1.3 GB de memoria RAM.

Para el 99% de las aplicaciones diarias, es más que suficiente, pero otras que requieren cálculos masivos, o que se relacionan con bases de datos, muy frecuentemente superarán ese límite.

Y lo que es peor…

Para complicar todavía más el asunto, una cosa es tener memoria disponible, y otra muy distinta es tener bloques de memoria contiguos disponibles.

Como todos sabéis, fruto de la gestión que el Sistema Operativo hace de la memoria, de técnicas como la Paginación, y de la creación y destrucción de objetos, la memoria poco a poco va quedando fragmentada. Esto quiere decir que, aunque tengamos suficiente memoria disponible, esta puede estar dividida en muchos bloques pequeños, en lugar de un único hueco con todo el tamaño disponible.

Los Sistemas Operativos modernos, y la propia plataforma .Net, tratan de evitar esto con técnicas de Compactación, y aunque reducen notablemente el problema, no lo eliminan por completo. Este completo artículo describe en detalle la gestión de memoria del Garbage Collector de .Net, y la labor de compactación que realiza.

¿En qué afecta la fragmentación? En mucho, ya que si vuestra aplicación necesita reservar un Array contiguo de 10 MB, y aunque todavía haya 1GB de memoria disponible, si la memoria está muy fragmentada y el sistema no es capaz de encontrar un bloque contiguo de ese tamaño, obtendremos un OutOfMemoryException.

En .Net, la fragmentación y compactación de objetos en memoria guarda una estrecha relación con el tamaño de éstos. Por eso, el siguiente apartado hablará un poco sobre este tema.

Grandes objetos en memoria

A la hora de reservar memoria para un único objeto, la plataforma .Net establece ciertos límites. Por ejemplo, en las versiones de .Net 1.0, 2.0, 3.0, 3.5 y 4.0, ese límite es de 2GB. Tanto para plataformas x86 como x64, ningún objeto único puede ser mayor de ese tamaño. Es así de simple. Únicamente a partir de .Net 4.5 este límite puede ser excedido (en procesos x64 exclusivamente). Aunque sinceramente, salvo rarísimas excepciones, si necesitas reservar más de 2GB de memoria para un único objeto, quizá deberías replantearte el diseño de tu aplicación.

En el mundo .Net, el Garbage Collector clasifica a los objetos en dos tipos: objetos grandes y objetos pequeños. Es una división bastante gruesa, la verdad, pero es así. ¿Qué considera .Net como un objeto pequeño? Todo aquel que ocupe menos de 85000 bytes.

Cuando el CLR de .Net es cargado, se reservan dos porciones de memoria diferentes: un Heap para los objetos pequeños (también llamado SOH, o Small Objects Heap), y otra para los objetos grandes (también llamado LOH, o Large Object Heap), y cada tipo de objeto se almacena en su Heap correspondiente.

¿En qué afecta todo esto al tema que estamos tratando? Sencillo, compactar objetos grandes es costoso, y a día de hoy, simplemente no se hace. Los objetos considerados “Grandes”, y que se introducen en el LOH, no se compactan (aunque el equipo de desarrollo advierte que pueden hacerlo algún día). Como mucho, cuando dos objetos grandes adyacentes son liberados, se fusionan en un único espacio de memoria disponible, pero ningún objeto es “movido” para realizar tareas de compactación.

Este fantástico artículo contiene muchísima más información acerca del LOH y su funcionamiento.

Arrays C# en los límites de la memoria

En C#, los Arrays Simples (de una dimensión) son una de las formas más comunes de consumir memoria, y debes saber que el CLR los reserva siempre como bloques continuos de memoria. Es decir, cuando instanciamos un objeto de tipo byte[1024], estamos solicitando al sistema un único bloque continuo de 1KB, y se generará un OutOfMemoryException si no encuentra ningún hueco contiguo de ese tamaño.

Cuando es necesario utilizar un Array de más de una dimensión, C# nos ofrece distintas opciones:

Arrays anidados, o arrays de arrays

Declarados como byte[][], suponen el método clásico de implementar arrays multi-dimensionales. De hecho, en lenguages como C++, es el único tipo de array multi-dimensional soportado de forma nativa.

En lo relativo a memoria, se comportan como un array simple (un único bloque de memoria), en el que cada elemento es otro array simple (esta vez del tipo declarado, y que también es un bloque único en memoria, pero distinto a los demás). Por lo tanto, en lo que a bloques de memoria se refiere, un array de tipo byte[1024][1024], utilizará 1024 bloques de memoria distintos (cada uno de 1024 bytes).

Arrays Multi-Dimensionales

C# introduce un nuevo tipo de Arrays, soportado de forma nativa: los arrays multi-dimensionales. En el caso de 2 dimensiones, se declaran como byte[,].

Aunque son muy cómodos de utilizar (disponen entre otras cosas de métodos como GetLength, para saber el tamaño de una dimensión), y su instanciación es más sencilla, su representación en memoria es diferente a la de los arrays anidados. Éstos se almacenan como un único bloque de memoria, del tamaño total del array.

En el siguiente apartado estableceremos una comparativa entre ambos tipos:

Comparativa: [,] vs [][]

El array 2D [,] (se almacena en un solo bloque):

Ventajas:

  • Utiliza menos memoria total (no tiene que almacenar las referencias a los n arrays simples)
  • Su creación es más rápida: reservar un bloque grande de memoria para para un solo objeto es más rápido que reservar bloques más pequeños para muchos objetos.
  • Su instanciación es más sencilla: una sola línea basta (new byte[128,128]).
  • Proporciona métodos útiles, como GetLength, y su uso es más claro y limpio.

Inconvenientes:

  • Encontrar un solo bloque de memoria continuo para el array puede ser un problema, si éste es muy grande o nos encontramos cerca del limite de RAM.
  • El acceso a los elementos del array es más lento que en arrays anidados (ver abajo)

El array anidado [][] (que se almacena en N bloques):

Ventajas:

  • Es más fácil encontrar memoria disponible para el array, ya que requiere de n bloques de tamaño más pequeño, lo cual debido a la fragmentación, suele ser más probable que encontrar un único bloque más grande.
  • El acceso a los elementos del array es más rápido que en los arrays 2D, gracias a las optimizaciones del compilador para manejar arrays simples (en definitiva, un array de arrays se compone de muchos arrays 1D).

Inconvenientes:

  • Utiliza más memoria total (tiene que almacenar las referencias a los n arrays simples)
  • Su creación es más lenta, ya que hay que reservar N bloques de memoria, en lugar de uno solo.
  • Su instanciación es un poco más molesta, ya que hay que recorrer el array instanciando cada uno de sus elementos (ver Tip más abajo).
  • No proporciona los métodos disponibles en los arrays 2D, y su uso puede ser un poco más confuso.

Este blog explica muy bien esta comparativa.

Conclusión

Cada usuario debe escoger el tipo de array que más le convenga en función de su experiencia y el contexto concreto en el que esté. No obstante, un desarrollador que habitualmente utilice gran cantidad de memoria, y preocupado por el rendimiento, tenderá a escoger siempre arrays anidados (o arrays de arrays [][]).

Tip: código generico para instanciar arrays anidados

Dado que instanciar un array de arrays es un poco molesto y repetitivo (y ya dijimos aqui que no conviene duplicar código), el siguiente método genérico se encargará de esa tarea por vosotros:

        public static T[][] Allocate2DArray<T>(int pWidth, int pHeight)            
        {
            T[][] ret = new T[pWidth][];
            for (int i = 0; i < pHeight; i++)
                ret[i] = new T[pHeight];

            return ret;
        }

Espero que os Sirva !!!

Boot time comparison: All generations of iPhone vs Nokia Lumia 800

This video completes the boot time comparison made by iClarified with an additional contender: the Nokia Lumia 800 with Windows Phone 7.5, which beats even the very last iPhone 5 in terms of boot time.

 

Please note: This video is a second version of another one published 3 days ago. It has been remade to fix a small fps conversion error present in the previous version (the iPhone part was treated as if it was 30 fps, when it was 24 fps). That involved it being displayed faster than it should, and therefore showing a wrong boot time measurement for the Lumia (which was displayed correctly, at 30 fps). Nokia Lumia 800 boots in 18 seconds, not 22.

Results

The boot time results are awesome:

          • Nokia Lumia 800: 18.17 secs
          • iPhone 5: 24.88 secs (6.5 seconds slower !!)

I ♥ Nokia        -        I ♥ Windows Phone