zoukankan      html  css  js  c++  java
  • unity eclipse打包时的资源加载

    有一些渠道包需要先导eclipse,eclipse会压缩资源,但如果打的资源包本来就是压缩过,只能将包体缩小一点点,没多大用处,

    使用AssetBundle.LoadFromFile加载资源时很慢,进入游戏加载资源比较多,一卡卡上一分钟之久,用unity直接打包就没这个问题,

    使用java来加载就会报out of memory,也不行,jni试了下,写得乱七八糟的不行,

    以下方法可行

    if (androidJavaObject == null) {
    AndroidJavaClass SDK = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    androidJavaObject = SDK.GetStatic<AndroidJavaObject>("currentActivity");
    }


    //byte[] bts = jo.Call<byte[]> ("LoadAB", string.Format ("{0}/{1}.assetbundle", GM.sysPlatform, lpath), androidJavaObject);

    //取得应用的Activity
    //androidJavaObject
    var assetManager = androidJavaObject.Call<AndroidJavaObject>("getAssets");

    //打开文件流
    var stream = assetManager.Call<AndroidJavaObject>("open", string.Format ("{0}/{1}.assetbundle", GM.sysPlatform, lpath));
    //获取文件长度
    var availableBytes = stream.Call<int>("available");

    //取得InputStream.read的MethodID
    var clsPtr = AndroidJNI.FindClass("java.io.InputStream");
    var METHOD_read = AndroidJNIHelper.GetMethodID(clsPtr, "read", "([B)I");

    //申请一个Java ByteArray对象句柄
    var byteArray = AndroidJNI.NewByteArray(availableBytes);
    //调用方法
    int readCount = AndroidJNI.CallIntMethod(stream.GetRawObject(), METHOD_read, new[] { new jvalue() { l = byteArray } });
    //从Java ByteArray中得到C# byte数组
    var bytes = AndroidJNI.FromByteArray(byteArray);
    //删除Java ByteArray对象句柄
    AndroidJNI.DeleteLocalRef(byteArray);
    //关闭文件流
    stream.Call("close");
    stream.Dispose();

    AssetBundle c = AssetBundle.LoadFromMemory(bytes);
    if (c) {
    obj = c.LoadAsset (name);
    }

  • 相关阅读:
    数据仓库
    HiveSQL 数据定义语言(DDL)
    HiveSQL 数据操控、查询语言(DML、DQL)
    【ASP.NET Core】Blazor+MiniAPI完成文件下载
    MySQL的WAL(WriteAhead Logging)机制
    MySQL系列 | 索引数据结构大全
    眼见为实,看看MySQL中的隐藏列
    mysql的默认隔离级别:可重复读(Repeatable Read)
    缓存淘汰算法LRU算法
    Android设计模式系列(12)SDK源码之生成器模式(建造者模式)
  • 原文地址:https://www.cnblogs.com/sevenmoons/p/8510356.html
Copyright © 2011-2022 走看看