Unity3d: Actividad de red de fondo y Unity Run Loop
Estamos buscando una manera de descargar "al mismo tiempo en segundo plano" diversos recursos que nuestro juego necesitará "pronto". Nuestras necesidades son: (1) máxima velocidad de descarga posible, (2) mínima interrupción posible de las actividades de "primer plano" Runloop que están impulsando el juego, (3) la solución funciona muy bien en todas las plataformas principales que nos interesan (Android / iOS / PC / Mac), y (4) la ausencia de errores que debilitan la solución.
Si no cumplimos con el requisito # 1, entonces el juego tiene que parar y hacer que el usuario espere hasta que la descarga de fondo se acerque y entregue los recursos necesarios. Si no cumplimos con el requisito # 2, entonces la descarga de fondo impacta negativamente cómo juega el juego, haciéndolo desigual o lento para responder, etc.
- Unity 2D: ¿Cómo soportar plataformas múltiples y diferentes dispositivos de relación de aspecto en Unity 2D?
- ¿Cómo puedo abrir un Fragmento de Android en un nuevo proceso?
- ¿Cómo puedo codificar mi juego para que funcione en cada resolución de dispositivos Android? (Con Unidad)
- Callback Listener en Unity - Cómo llamar al método de archivo de script desde UnityPlayerActivity en Android
- Unity Android en el fondo
Hemos intentado e investigado varios enfoques, incluidos Asset Bundles, WWW y nativos C # HttpWebRequest, y ninguno de ellos cumple con todos nuestros requisitos. Detalles abajo.
Nos encantaría conversar con usted si ya ha descubierto cómo solucionar este problema, porque preferimos no reinventar la rueda.
Aquí están los detalles de nuestra experiencia hasta ahora:
Tenemos una aplicación para Android integrada en Unity, que eventualmente también estará disponible a través de iOS. Junto con las actividades normales de primer plano, tenemos una actividad de fondo de baja prioridad de descarga de varios recursos para ser utilizados por la aplicación en primer plano.
(Antes de pedir, los paquetes de activos no funcionarán para nosotros, ya que, a menos que algo haya cambiado recientemente, no funcionen en diferentes versiones de Unity, es decir, un paquete de activos para Unity 3.4 no funciona en Unity 3.5. para volver a descargar todos sus activos de nuevo.)
Desafortunadamente, hemos descubierto una serie de errores molesto con el uso del componente 'WWW'. Estos incluyen no actualizar cuando hay una pérdida de red, y no devolver valores de las solicitudes web (es decir, 'post'). Como tal, estamos buscando reemplazar nuestro uso de WWW con el nativo C # HttpWebRequest. Desafortunadamente, hemos encontrado que usar este componente en el Unity Runloop principal a través de una co-rutina hace que el runloop se detenga y que la interfaz de usuario se congele.
Sin embargo, la colocación de este mismo código en un hilo de fondo C # (no una co-rutina) y luego de sondeo que el hilo de la actividad no parece funcionar.
No nos gusta este enfoque ya que esto nos permite programar esta actividad en ausencia que está en armonía con el programador Unity. Nos gustaría que la actividad de la red (y la CPU asociada) se ejecute en espacios apropiados en el Unity Run Loop. Pero por lo que podemos decir, sólo hay tres maneras en que podemos especificar la prioridad:
- WWW.threadPriority – no queremos utilizar WWW por lo que es mudo.
- Application.backgroundLoadingPriority – Como no estamos usando un componente Unity (como AssetBundles) para hacer la descarga, estoy asumiendo que esto no tiene efecto?
- YieldInstructions, por ejemplo, WaitForSeconds y WaitForFixedUpdate – Mi comprensión es que estos son bastante tonto. Se ejecutan cuando están programados para ejecutarse y no se aplazan a las necesidades de Unity Run Loop?
Lo que estamos tratando de entender: – ¿WWW está lleno de problemas o es sólo nuestro uso del componente? – ¿Alguien ha utilizado HttpWebRequest con una aplicación de Unity correctamente? ¿Lo han hecho de una manera roscada? – ¿Hay alguna arquitectura de 'interrupción' o 'prioridad' en Unity para que las tareas de fondo puedan jugar bien con el Unity Runloop y no causar problemas o competencia?
- Cómo integrar unity3d en eclipse IDE?
- AndroidJNIClass no puede excute mi función no estática
- Cómo pasar el parámetro al método java desde c # en JNI
- Implementación de los permisos de Android 6.0 en unity3d
- Comprobación de si un punto táctil está dentro de la caja colisionada en Unity
- ¿Cómo implementar multitouch en Unity3d en un dispositivo móvil?
- Cómo trabajar con diferentes resoluciones de pantalla
- Mostrar Unity Scene como Sub View en el estudio android
Una búsqueda rápida de google encontró que esta bruja puede funcionar si no quieres usar WWW. También hay el webclient en el system.net que he usado antes, pero no dentro de la unidad, pero sé que tiene una descarga asíncrona, la usé aquí
Ejemplo de webclient:
WebClient webClient = new WebClient(); webClient.DownloadProgressChanged += OnChange; webClient.DownloadFileCompleted += OnCompleted; webClient.DownloadFileAsync(new Uri(download), fileAndPath);
- ¿Cómo pasar el objeto de androide a servicio web de jabón?
- Android arrastrar y soltar / rotar mapa de bits en lienzo