Windows 8.1 ya está aquí y trae muchas novedades para el usuario. Sin embargo, aunque son mejoras substanciales que todos deberíamos conocer, ya hay otros blogs y sitios web dónde podéis encontrar información sobre ellas y por eso no voy a hablaros de ellas. Quiero aprovechar este post para daros una visión más hardcore de Windows 8.1, vamos a rascar las funcionalidades y ver qué APIs las hacen posible.

Si como yo, os habéis pasado alguna que otra noche leyendo documentación y perfeccionando vuestra App para Windows 8, os estaréis preguntando si tiene sentido recompilarla para 8.1. La respuesta corta es “sí”, la larga es “sí, ya deberíais estar haciéndolo” ;)

Mejoras de rendimiento

Es probable que hayas leído en alguna parte que compilar una App para Windows 8.1 mejora el rendimiento, pero… ¿qué clase de vudú es ese?

UIElement overhead

Casi todas las aplicaciones hacen uso algún GridView o ListView y muchas varios de ellos. En Windows 8 para representar cada elemento de un GridView/ListView, se buscaba el ControlTemplate asociado a cada GridViewItem/ListViewItem y se instanciaban todos los objetos requeridos. La complejidad de estos ControlTemplates es alta y el proceso requiere la invocación de decenas de UIElements por cada elemento. Multiplicando esto por cada elemento del GridView/ListView obtenemos un overhead de creación de objetos UIElement nada despreciable.

Windows 8.1 elimina esas instanciaciones, en vez de seguir el proceso habitual de abstracción de dibujado mediante UIElements, ahora se dibujan directamente con funciones de más bajo nivel que permiten obtener una mejora en el rendimiento extremadamente importante.

Recolector de basuras mejorado

No hay duda de que una de las características que más tiempo nos ahorra en nuestros desarrollos es la gestión automática de la memoria. Todo ocurre de manera transparente. Nosotros creamos objetos, los usamos, dejamos de usarlos, creamos otros nuevos… y no nos preocupamos de ciclos de vida, de referencias ni de reservas de memoria. Esto es posible gracias al trabajo incansable del Garbage Colector, que en Windows 8.1 ha visto mejorada su eficiencia.

Si todo ocurre entre bambalinas ¿por qué debería importarme que lo hayan mejorado? En dos palabras: weak references. Si las estás usando, es posible que el comportamiento sea distinto y que su valor cambie a null cuando haya un Runtime Callable Wrapper o un COM Callable Wrapper.

XAML en binario

Las Apps de Windows 8 distribuían los ficheros XAML en texto plano, permitiendo una lectura e inspección del código de forma sencilla. Windows 8.1 preparsea los ficheros XAML y embebe una versión pre-compilada. La carga de Apps con código XAML precompilado es más rápida, pero también más robusto, ya que realizar modificaciones no autorizadas se complica.

Cambios de comportamiento

5 segundos antes del reinicio

En Windows 8, si un usuario cierra una App para abrirla a continuación, es probable que la App se cierre nada más ser relanzada. Sin embargo, en Windows 8.1 se le concederán 5 segundos a la App para terminar su finalización antes de que sea relanzada.

Tamaño variable

En Windows 8 tan sólo podíamos tener una App en pantalla y otra en modo Snapped. Esto cambia radicalmente en Windows 8.1, donde tenemos un número no determinístico de Apps mostrándose simultáneamente en un número no determinado de pantallas con aspectos de forma y resoluciones que pueden variar mucho.

Todas las Apps de Windows 8.1 deben soportar un tamaño del eje X de 500px en adelante, pudiendo optar a soportar tamaños tan pequeños como 320px en eje X. Esto quiere decir que los estados gráficos soportados en Windows 8 (Snapped, Portrait, etc..) están discontinuados y no deben ser usados en Apps de Windows 8.1

Si tú App está haciendo uso de la plantilla LayoutAwarePage, deberías heredar de Page e implementar los eventos PageLoaded, PageUnloaded y SizeChanged:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    this.Loaded += PageLoaded;
    this.Unloaded += PageUnloaded;
 }

 private void PageUnloaded(object sender, RoutedEventArgs e)
 {
     Window.Current.SizeChanged -= Window_SizeChanged;
 }

 private void PageLoaded(object sender, RoutedEventArgs e)
 {
     Window.Current.SizeChanged += Window_SizeChanged;
 }

 private void Window_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
 {
     if (e.Size.Width <= 500)
     {
     //VisualStateManager.GoToState(this, state.State, transitions);
     }
     else if (e.Size.Height > e.Size.Width)
     {
     //VisualStateManager.GoToState(this, state.State, transitions);
     }
     else 
     {
     //VisualStateManager.GoToState(this, state.State, transitions);
     }
 }

Nuevos tamaños de Live Tiles

En Windows 8.1 disponemos de cuatro tipos de tamaños para nuestros Live Tiles. Además de los dos que ya conocíamos, Square Tile y Wide Title, se añaden Small tile y Large tile.

De este modo el large tile está formado por dos wide tiles, que está formado por dos square title, que a su vez está formado por 4 small tiles. Para implementar el large tile, es necesario implementar también el tile large. Puedes encontrar más información en la documentación.

Pablo Carballude (@Carballude_es)