Объявление
public static AssetBundleCreateRequest LoadFromStreamAsync(Stream stream, uint crc, uint managedReadBufferSize);Параметры
stream | Управляемый объект Stream. Unity вызывает Read(), Seek() и свойство Length этого объекта для загрузки данных AssetBundle. |
crc | Необязательная контрольная сумма CRC-32 несжатого содержимого. |
managedReadBufferSize | Вы можете использовать это, чтобы переопределить размер буфера чтения, который Unity использует при загрузке данных. Размер по умолчанию — 32 КБ. |
Возвращает
AssetBundleCreateRequest Асинхронный запрос на создание AssetBundle. Используйте свойство assetBundle, чтобы получить AssetBundle после его загрузки.
Описание
Асинхронно загружает AssetBundle из управляемого потока.
Функция поддерживает пакеты любого типа сжатия. Сжатые данные lzma распаковываются в память, а несжатые и фрагментированные пакеты считываются непосредственно из потока.
В отличие от LoadFromStream, эта функция является асинхронной.
В отличие от LoadFromFileAsync, данные для AssetBundle предоставляются управляемым объектом Stream.
Ниже приведены ограничения на объект Stream для оптимизации загрузки данных AssetBundle:
- Данные AssetBundle должны начинаться с нулевой позиции потока.
- Unity устанавливает позицию поиска на ноль перед загрузкой данных AssetBundle.
- Unity предполагает, что позиция чтения в потоке не изменяется никаким другим процессом. Это позволяет процессу Unity читать из потока без необходимости вызывать Seek() перед каждым чтением.
- stream.CanRead должен возвращать значение true.
- stream.CanSeek должен возвращать значение true.
- Он должен быть доступен из потоков, отличных от основного потока. Seek() и Read() можно вызывать из любого собственного потока Unity.
- В определенных обстоятельствах Unity попытается прочитать переданный размер данных AssetBundle. Реализация Stream должна изящно обрабатывать это, не вызывая исключений. Реализация Stream также должна возвращать фактическое количество прочитанных байтов (без учета байтов, переданных в конце данных AssetBundle).
- При запуске с конца данных AssetBundle и попытке чтения данных реализация Stream должна возвращать 0 прочитанных байтов, а не создавать исключения.
Чтобы уменьшить количество вызовов из собственного кода в управляемый, данные считываются из потока с помощью буферизованного считывателя с размером буфера managedReadBufferSize.
- Изменение managedReadBufferSize может повлиять на скорость загрузки, особенно на мобильных устройствах.
- Оптимальное значение для managedReadBufferSize варьируется от проекта к проекту и, возможно, от пакета активов к набору ресурсов.
- Хороший диапазон значений для эксперимента: 8 КБ, 16 КБ, 32 КБ, 64 КБ, 128 КБ.
- Большие значения могут быть лучше для сжатых наборов ресурсов или если набор ресурсов содержит ресурсы большого размера или если набор ресурсов не содержит много ресурсов и они загружаются последовательно из пакета ресурсов.
- Меньшие значения могут быть лучше для несжатых пакетов ресурсов и чтения большого количества небольших ресурсов или если в наборах ресурсов много ресурсов и ресурсы загружаются в случайном порядке.
Не удаляйте объект Stream при загрузке AssetBundle или любых ресурсов из пакета. Его время жизни должно быть больше, чем у AssetBundle. Это означает, что вы удаляете объект Stream после вызова AssetBundle.Unload.
using UnityEngine;
using System.Collections;
using System.IO;
using System;
public class LoadFromFileAsyncExample : MonoBehaviour
{
IEnumerator Start()
{
var fileStream = new FileStream(Application.streamingAssetsPath, FileMode.Open, FileAccess.Read);
var bundleLoadRequest = AssetBundle.LoadFromStreamAsync(fileStream);
yield return bundleLoadRequest;
var myLoadedAssetBundle = bundleLoadRequest.assetBundle;
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
yield break;
}
var assetLoadRequest = myLoadedAssetBundle.LoadAssetAsync<GameObject>("MyObject");
yield return assetLoadRequest;
GameObject prefab = assetLoadRequest.asset as GameObject;
Instantiate(prefab);
myLoadedAssetBundle.Unload(false);
fileStream.Close();
}
}
Смотрите так же: AssetBundle, LoadFromStreamLoadFromFileAsync.