Unity 6.3
0 онлайн 13 гостей 3 в системе
Вход

AssetBundle.LoadFromStream

Declaration

public static AssetBundle LoadFromStream(Stream stream);
public static AssetBundle LoadFromStream(Stream stream, uint crc);
public static AssetBundle LoadFromStream(Stream stream, uint crc, uint managedReadBufferSize);

Параметры

Параметр Описание
поток Управляемый объект Поток. Unity вызывает Read(), Seek() и свойство Length этого объекта для загрузки данных AssetBundle.
crc (сохранить) Необязательная контрольная сумма CRC-32 несжатого содержимого.
managedReadBufferSize Это позволяет переопределить размер буфера чтения, который Unity использует при загрузке данных. Размер по умолчанию — 32 КБ.

Возвращаемое значение

AssetBundle Загруженный объект AssetBundle или null, если объект не загружается.

Описание

Синхронно загружает AssetBundle из управляемого потока.

Функция поддерживает пакеты любого типа сжатия. lzma сжатые данные декомпрессируются в память, в то время как несжатые и сжатые по кускам пакеты считываются непосредственно из потока.

Содержимое сравнивается с контрольной суммой перед загрузкой, если контрольная сумма не равна нулю. В случае несоответствия возникает ошибка.

В отличие от LoadFromStreamAsync, эта функция синхронна и возвращается только после загрузки объекта AssetBundle.

В отличие от LoadFromFile, данные для AssetBundle предоставляются управляемым объектом потока.

Ниже приведены ограничения на объект потока для оптимизации загрузки данных AssetBundle:

  1. Данные AssetBundle должны начинаться с нулевого положения потока.
  2. Unity устанавливает позицию поиска на нуль перед загрузкой данных AssetBundle.
  3. Unity предполагает, что положение чтения в потоке не изменяется никаким другим процессом. Это позволяет процессу Unity читать из потока без необходимости вызывать Seek() перед каждым чтением.
  4. stream.CanRead должен возвращать true.
  5. stream.CanSeek должен возвращать true.
  6. Она должна быть доступна из потоков, отличных от главного потока. Seek() и Read() могут быть вызваны из любого потока Unity.
  7. При определенных обстоятельствах Unity пытается прочитать данные, превышающие размер AssetBundle. Реализация потока должна грациозно обрабатывать это без выброса исключений. Реализация потока должна также возвращать фактическое количество прочитанных байт (не включая любые байт, превышающие конец данных AssetBundle).
  8. При попытке чтения данных, начиная с конца данных AssetBundle, реализация потока должна возвращать 0 байт прочитанных данных и не вызывать исключений.

Чтобы уменьшить количество вызовов из нативного в управляемый код, данные считываются из потока с помощью буферизированного считывателя с размером буфера managedReadBufferSize.

  • Изменение managedReadBufferSize может изменить производительность загрузки, особенно на мобильных устройствах.
  • Оптимальное значение для managedReadBufferSize варьируется от проекта к проекту и, возможно, от пакета ассетов к пакету ассетов.
  • Хороший диапазон значений для экспериментов: 8КБ, 16КБ, 32КБ, 64КБ, 128КБ.
  • Большие значения могут быть лучше для сжатых пакетов ассетов или если пакет ассетов содержит ассеты большого размера, или если пакет ассетов не содержит много ассетов и они загружаются последовательно из пакета ассетов.
  • Меньшие значения могут быть лучше для несжатых пакетов ассетов и чтения большого количества небольших ассетов или если пакет ассетов содержит много ассетов и ассет загружается в случайном порядке.

Не удаляйте объект Stream во время загрузки AssetBundle или любых ассетов из пакета. Его жизнь должна быть длиннее, чем AssetBundle. Это означает, что вы удаляете объект Stream после вызова AssetBundle.Unload.

using UnityEngine;
using System.Collections;
using System;
using System.IO;

public class LoadFromStreamExample : MonoBehaviour { void Start() { var fileStream = new FileStream(Application.streamingAssetsPath, FileMode.Open, FileAccess.Read); var myLoadedAssetBundle = AssetBundle.LoadFromStream(fileStream); if (myLoadedAssetBundle == null) { Debug.Log("Failed to load AssetBundle!"); return; }

var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject"); Instantiate(prefab);

myLoadedAssetBundle.Unload(false); fileStream.Dispose(); } }

Дополнительные ресурсы: ,AssetBundle,, ,LoadFromStreamAsync,, ,LoadFromFile,.