Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
Nota
Para obtener más información, consulte la sesión //build/ Aumentar considerablemente el rendimiento cuando los usuarios interactúan con grandes cantidades de datos en GridView y ListView.
Mejore el rendimiento y el tiempo de inicio de ListView y GridView a través de la virtualización de datos. Para la virtualización de la interfaz de usuario, la reducción de elementos y la actualización progresiva de elementos, consulte Optimización del rendimiento de ListView y GridView para WinUI.
Se necesita un método de virtualización de datos para un conjunto de datos que sea tan grande que no se pueda almacenar o no todos en la memoria al mismo tiempo. Carga una parte inicial en la memoria (desde el disco local, la red o la nube) y aplica la virtualización de la interfaz de usuario a este conjunto de datos parcial. Más adelante puede cargar datos de forma incremental o desde puntos arbitrarios en el conjunto de datos maestros (acceso aleatorio), a petición. Si la virtualización de datos es adecuada para usted depende de muchos factores.
- Tamaño del conjunto de datos
- Tamaño de cada elemento
- Origen del conjunto de datos (disco local, red o nube)
- Consumo general de memoria de la aplicación WinUI
Nota Tenga en cuenta que una característica está habilitada de forma predeterminada para ListView y GridView que muestra visuales temporales de marcador de posición mientras el usuario panea o desplaza rápidamente. A medida que se cargan los datos, estos marcadores de posición visuales se reemplazan con su plantilla de elemento. Puede desactivar la característica estableciendo ListViewBase.ShowsScrollingPlaceholders en false, pero si lo hace, se recomienda usar el atributo x:Phase para representar progresivamente los elementos de la plantilla de elemento. Consulte Actualizar elementos ListView y GridView progresivamente.
Estos son más detalles sobre las técnicas de virtualización de datos incrementales y de acceso aleatorio.
Virtualización incremental de datos
La virtualización de datos incremental carga los datos secuencialmente. Un control ListView que usa la virtualización de datos incremental puede utilizarse para ver una colección de un millón de elementos, pero inicialmente solo se cargan 50 elementos. A medida que el usuario navega o desplaza, se cargan 50 más. A medida que se cargan los elementos, el pulgar de la barra de desplazamiento disminuye en tamaño. Para este tipo de virtualización de datos, escriba una clase de origen de datos que implemente estas interfaces.
Un origen de datos como este es una lista en memoria que se puede ampliar continuamente. El control de elementos solicitará elementos mediante las propiedades estándar de índice y conteo de IList. El recuento debe representar el número de elementos localmente, no el tamaño verdadero del conjunto de datos.
Cuando el control de elementos se acerca al final de los datos existentes, llama a ISupportIncrementalLoading.HasMoreItems. Si devuelve true, entonces llama a ISupportIncrementalLoading.LoadMoreItemsAsync, pasando una cantidad recomendada de elementos para cargar. Dependiendo de dónde cargue datos (disco local, red o nube), puede optar por cargar un número diferente de elementos de los que se recomienda. Por ejemplo, si el servicio admite lotes de 50 elementos, pero el control items solicita solo 10, puede cargar 50. Cargue los datos del back-end, agréguelos a la lista y genere una notificación de cambio a través de INotifyCollectionChanged o IObservableVector<T> para que el control de elementos conozca los nuevos elementos. También devuelve un recuento de los elementos que ha cargado realmente. Si carga menos elementos de los que se recomienda o el control de los elementos se ha desplazado o desplazado aún más lejos, se volverá a llamar al origen de datos para más elementos y el ciclo continúa. ISupportIncrementalLoading permanece disponible en windows App SDK, por lo que puede usar el mismo patrón de carga incremental en una aplicación WinUI.
Virtualización de datos de acceso aleatorio
La virtualización de datos de acceso aleatorio permite cargar desde un punto arbitrario del conjunto de datos. ListView que utiliza la virtualización de datos de acceso aleatorio para ver una colección de un millón de elementos puede cargar los elementos del 100.000 al 100.050. Si el usuario pasa al principio de la lista, el control carga los elementos 1-50. En todo momento, el pulgar de la barra de desplazamiento indica que ListView contiene un millón de elementos. La posición del pulgar de la barra de desplazamiento es relativa a dónde se encuentran los elementos visibles en todo el conjunto de datos de la colección. Este tipo de virtualización de datos puede reducir significativamente los requisitos de memoria y los tiempos de carga de la colección. Para habilitarla, debe escribir una clase de origen de datos que capture datos a petición, administre una caché local e implemente estas interfaces.
- IList
- INotifyCollectionChanged o IObservableVector<T>
- (Opcionalmente) IItemsRangeInfo
- (Opcionalmente) ISelectionInfo
IItemsRangeInfo proporciona información sobre qué elementos usa activamente el control. El control de elementos llama a este método cada vez que cambia su vista e incluirá estos dos conjuntos de intervalos.
- Conjunto de elementos que se encuentran en la ventana de visualización.
- Conjunto de elementos no virtualizados que el control está utilizando y que puede no encontrarse en la ventana de visualización.
- Búfer de elementos alrededor de la ventana de visualización que mantienen el control de elementos para hacer que el desplazamiento táctil sea suave.
- Elemento centrado.
- Primer elemento.
Al implementar IItemsRangeInfo, el origen de datos sabe qué elementos deben capturarse y almacenarse en caché y cuándo eliminar los datos de la memoria caché que ya no se necesitan. IItemsRangeInfo usa objetos ItemIndexRange para describir un conjunto de elementos en función de su índice en la colección. Esto evita punteros de elemento, que pueden no ser correctos o estables. IItemsRangeInfo está diseñado para ser utilizado por una sola instancia de un control de elementos porque se basa en la información de estado para ese control de elementos. Si varios controles de elementos necesitan acceso a los mismos datos, necesita una instancia independiente del origen de datos para cada uno. Pueden compartir una caché común, pero la lógica para purgar de la memoria caché será más complicada. IItemsRangeInfo permanece disponible en windows App SDK, por lo que las mismas técnicas de almacenamiento en caché de acceso aleatorio se aplican a los controles WinUI.
Esta es la estrategia básica para la fuente de datos de virtualización de acceso aleatorio.
- Cuando se le solicita un elemento
- Si está disponible en la memoria, devuélvalo.
- Si no lo tiene, devuelva
nullo un elemento de marcador de posición. - Use la solicitud de un elemento (o la información de rango de IItemsRangeInfo) para saber qué elementos son necesarios y para obtener de forma asincrónica datos de los elementos de su back-end. Después de recuperar los datos, genere una notificación de cambio a través de INotifyCollectionChanged o IObservableVector<T> para que el control de elementos conozca el nuevo elemento.
- (Opcionalmente) a medida que cambia el área visible del control de elementos, identifique los elementos necesarios del origen de datos a través de su implementación de IItemsRangeInfo.
Además, la estrategia de cuándo cargar elementos de datos, cuántos cargar y qué elementos mantener en memoria queda a criterio de la aplicación. Algunas consideraciones generales que se deben tener en cuenta:
- Realiza solicitudes asincrónicas de datos; no bloquees el subproceso de la interfaz de usuario.
- Busque el punto dulce en el tamaño de los lotes en los que se capturan los elementos. Prefiere lo conciso a lo hablador. No tan pequeñas que hagan demasiadas solicitudes pequeñas; no tan grandes que tarden demasiado en recuperarlas.
- Tenga en cuenta cuántas solicitudes desea tener pendientes al mismo tiempo. Realizar una a la vez es más fácil, pero puede ser demasiado lento si el tiempo de respuesta es alto.
- ¿Puede cancelar solicitudes de datos?
- Si usa un servicio hospedado, ¿hay un costo por transacción?
- ¿Qué tipo de notificaciones proporciona el servicio cuando cambian los resultados de una consulta? ¿Sabrá si se inserta un elemento en el índice 33? Si tu servicio admite consultas basadas en clave más desplazamiento, puede ser mejor que usar solo un índice.
- ¿Qué tan inteligente quieres estar en los elementos de captura previa? ¿Va a intentar realizar un seguimiento de la dirección y la velocidad del desplazamiento para predecir qué elementos son necesarios?
- ¿Qué tan agresivo desea ser en purgar la memoria caché? Se trata de una desventaja de la memoria frente a la experiencia.
Windows developer