【Cocos Creator 使用AssetBundle管理资源】

CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager 资源管理模块具备加载资源、查找资源、销毁资源、缓存资源、Asset Bundle 等功能,帮助开发者管理其资源的使用。预加载只会下载必要的资源,不会进行反序列化和初始化工作,性能消耗小,适合在游戏过程中使用。由于预加载没有解析资源,所以需要在预加载完成后,再配合加载接口进行资源的解析和初始化。在游戏的开发过程中,需要使用到大量的图片、音频等资源来,从而带来管理上的困难。:加载不需要等到预加载完成后再调用,开发者可以在任何时候进行加载。正常加载接口会直接复用预加载过程中已经下载好的内容,缩短加载时间。 阅读详情
AI摘要

本文介绍了Cocos Creator从v2.4开始支持的Asset Bundle功能。对比了AssetBundle资源管理与普通资源管理在方式、加载引用、构建发布上的差异,展示了AssetBundle的优势。还给出了AssetBundle基本使用示例、资源管理框架搭建方法,以及实现进度条加载功能的步骤。

AssetBundle介绍

  • 官方文档内容:
  • 从 v2.4 开始,Creator 正式支持 Asset Bundle 功能。Asset Bundle 作为资源模块化工具,允许开发者按照项目需求将贴图、脚本、场景等资源划分在多个 Asset Bundle 中,然后在游戏运行过程中,按照需求去加载不同的 Asset Bundle,以减少启动时需要加载的资源数量,从而减少首次下载和加载游戏时所需的时间。
  • Asset Bundle 可以按需求随意放置,比如可以放在远程服务器、本地、或者小游戏平台的分包中。也可以跨项目复用,用于加载子项目中的 Asset Bundle。

AssetBundle资源管理与普通资源管理对比(AI生成)

1、资源管理方式的差异

  • 普通的资源管理:

  • 在Cocos Creator的早期版本中,资源管理可能相对简单,没有像AssetBundle那样灵活和强大的资源模块化工具。

  • 资源通常被直接放置在项目的assets目录下,并通过资源管理器进行管理和组织。

  • 在游戏运行时,资源可能需要一次性加载到内存中,这可能导致游戏启动时间变长,内存占用增加,甚至可能出现游戏卡顿的情况。

  • 使用AssetBundle进行资源管理:

  • 从Cocos Creator v2.4版本开始,引入了AssetBundle功能,实现了资源的模块化管理。

  • 开发者可以将资源(如贴图、脚本、场景等)按照项目需求划分在多个AssetBundle中。

  • 这些AssetBundle可以在游戏运行过程中根据需要动态加载,从而减少了启动时需要加载的资源数量,提高了游戏的性能和稳定性。

2、资源加载和引用的差异

  • 普通的资源管理:
  • 资源加载可能缺乏灵活性,通常需要在游戏启动时一次性加载所有必要的资源。
  • 资源引用可能相对直接,但缺乏模块化的优势,难以进行高效的资源管理和复用。
  • 使用AssetBundle进行资源管理:
  • 提供了更灵活的加载方式,如同步加载和异步加载,可以根据不同场景和需求选择合适的加载方式。
  • 通过AssetBundle的优先级配置,可以更有效地管理资源的加载顺序和依赖关系。例如,当多个AssetBundle引用同一个资源时,资源会被优先放置在优先级高的AssetBundle中,低优先级的AssetBundle只会存储一条记录信息,从而避免了资源的重复加载和内存浪费。
  • 实现了资源的跨项目复用和远程加载,提高了资源的利用效率和游戏的可扩展性。

3、构建和发布的差异

  • 普通的资源管理:
  • 构建过程可能相对简单,但缺乏针对不同平台和设备的优化。
  • 发布时可能需要手动处理资源的打包和分发,增加了发布流程的复杂性和工作量。
  • 使用AssetBundle进行资源管理:
  • 提供了更丰富的构建选项和配置,可以根据不同平台和设备的性能特点进行优化。
  • 支持资源的自动打包和分发,简化了发布流程,提高了发布效率。
  • 允许开发者将AssetBundle放置在远程服务器或本地,灵活控制资源的加载和更新。

综上所述,Cocos Creator使用AssetBundle进行资源管理相比普通的资源管理具有显著的优势。它提供了更灵活、高效和模块化的资源管理方式,有助于开发者优化游戏性能、提高资源利用率和降低发布成本。

AssetBundle 基本使用(基础示例、有基础可跳过)

1、新建项目

新建项目
创建并打开项目

2、创建项目结构:

项目结构

3、清空场景,添加Canvas

清空场景
在这里插入图片描述
添加canvas
在这里插入图片描述

4、导入图片、自定义预制体

拖拽图片到GUI文件夹下,单击图片,如果右侧属性检查器中的类型为texture则改为sprite-frame
在这里插入图片描述
在Canvas下添加node,命名为my_img:
在这里插入图片描述
拖拽新加入的图片到my_img节点下。
在这里插入图片描述
将my_img节点拖拽到UIPrefabs文件夹下做成预制体。
在这里插入图片描述
删除场景中的my_img节点
在这里插入图片描述
按ctrl+s保存当前场景到Scenes文件夹下

5、配置Bundle

单击GUI文件夹,在属性检查器中勾选上配置为Bundle
在这里插入图片描述

6、编写脚本

在Scripts文件夹下新建脚本,命名为GameStart
在这里插入图片描述
点击Canvas节点,将创建的GameStart脚本挂载到节点下。
在这里插入图片描述
双击GameStart脚本进行编辑,编辑内容如下:

import { _decorator, assetManager, Component, instantiate, Node, Prefab } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('GameStart')
export class GameStart extends Component {

    //刚刚配置为Bundle的文件夹名字
    AssetBundleName: string = "GUI";

    //GUI内需要加载的资源的路径
    GUIUrls: string = "UIPrefabs/my_img";
    
    //GUI内需要加载的资源的类型
    GUIResType = Prefab;

    //用于存储加载的AssetsBundle
    private abBunds = {};
    
    protected onLoad() {
        //1、加载AssetsBundle(GUI)
        this.loadAssetsBundle(this.AssetBundleName,()=>{
            //2、加载AssetsBundle内的资源
            this.loadAssetsInAssetsBundle();
            
        });
    }

    enterGameScenes(){
        //释放游戏的AssetsBundle资源
        var bundle = assetManager.getBundle(this.AssetBundleName);
        if(bundle === null){
            console.log("没有找到",this.AssetBundleName);
            return ;
        }
        var my_img = instantiate(bundle.get(this.GUIUrls));
        this.node.addChild(my_img);
    }

    private loadAssetsBundle(abName:string,endfunc):void{
        //加载AssetsBundle
        assetManager.loadBundle(abName,(err,bundle)=>{
            if(err){
                console.log("加载AssetsBundle失败",err);
                return;
            }
            //将加载返回的bundle存储在abBunds中
            this.abBunds[abName] = bundle;
            console.log("加载AssetsBundle成功",bundle);
            endfunc();
        })
        
    }
    
    private loadAssetsInAssetsBundle(){
        //获取urls并加载里面的资源
        this.loadRes(this.abBunds[this.AssetBundleName],this.GUIUrls,this.GUIResType);
        
    }

    private loadRes(bundle,url,type):void{
        try{
            //加载资源
            bundle.load(url,type,(err,res)=>{
                if(err){
                    console.log("加载资源",url,"失败,error:",err);
                    return;
                }else{
                    console.log("加载资源",url,"成功");
                }
                //加载成功后,实例化资源
                this.enterGameScenes();
            })

        }catch(e){
            console.log("加载资源",url,"失败,error:",e);
        }
        
    }
}

ctrl+s保存后回到Cocos编辑器界面,点击运行,效果如下:

在这里插入图片描述
可以看到想要加载的预制体已经成功显示到场景中。
在使用assetManager的load方法和loadBundle方法时,一定要注意资源加载的时机和资源释放的时机,一定要确保资源包加载完成后再加载资源,可以向上面的代码一样,在函数的回调中添加后续要进行的操作。
如果没有在资源包加载完成后再加载资源,在加载资源时很可能会出现调用的load为undefined的错误,例如下面的错误:

加载资源 UIPrefabs/my_img 失败,error: TypeError: Cannot read properties of undefined (reading 'load')
    at GameStart.loadRes (GameStart.ts:73:20)
    at GameStart.loadAssetsInAssetsBundle (GameStart.ts:67:18)
    at GameStart.onLoad (GameStart.ts:25:14)
    at node-activator.ts:82:17
    at OneOffInvoker._invoke (component-scheduler.ts:247:13)
    at OneOffInvoker.invoke (component-scheduler.ts:162:14)
    at NodeActivator.activateNode (node-activator.ts:162:29)
    at Scene._activate (scene.ts:199:42)
    at Director.runSceneImmediate (director.ts:362:15)
    at main.js:1:4332

可以新增一个标志位来跟踪资源包是否加载完成,或者使用现在加载的资源数和总资源数相比较的方法来实现游戏加载进度条的功能,也可以判断资源包是否加载完毕。

针对上面的代码,可以梳理出大致的资源加载流程:
在这里插入图片描述

AssetBundle资源管理框架

为了更方便地进行资源管理,可以新建ResMgr单例来将AB包资源加载的操作封装起来。

import { _decorator, assetManager, Component, error, Node } from 'cc';

export default class ResMgr extends Component {
    //单例
    public static Instance: ResMgr = null;

    //资源总数  
    private total:number = 0;
    //当前加载资源数
    private now:number = 0;

    //ab包总数
    private totalAb:number = 0;
    //当前加载ab包数
    private nowAb:number = 0;

    //进程函数
    private progressFunc:Function = null;
    //完成回调函数
    private endFunc:Function = null;
    //ab包
    private abBunds= {};

    /**
     * 单例初始化
     * @returns 
     */
    protected onLoad(): void {
        if(ResMgr.Instance === null){
            ResMgr.Instance = this;
        }else{
            this.destroy();
            return;
        }
    }

    /**
     * 加载资源包中的资源
     * @param resPkg 资源包
     */
    private loadAssetsInAssetsBundle(resPkg):void{
        for(var key in resPkg){
            var urlSet = resPkg[key].urls;
            var typeClass = resPkg[key].assetType;

            for(var i = 0;i<urlSet.length;i++){
                this.loadRes(this.abBunds[key],urlSet[i],typeClass);
            }
        }
    }
    /**
     * 加载单个资源
     * @param abBundle 资源包
     * @param url 资源路径
     * @param typeClass 资源类型
     */
    private loadRes(abBundle,url,typeClass):void{
        abBundle.load(url,typeClass,(error,asset)=>{
            this.now++;
            if(error){
                console.log("load Res"+ url+" error:"+error);
            }
            else{
                console.log("load Res"+ url+" success");
            }
            if(this.progressFunc){
                this.progressFunc(this.now,this.total);
            }
            console.log(this.now,this.total);
            if(this.now >= this.total){
                if(this.endFunc!=null){
                    this.endFunc();
                }
            }
        })
    }

    /**
     * 加载AssetBundle资源包
     * @param abName 资源包名
     * @param endFunc 回调函数
     */
    private loadAssetsBundle(abName:string,endFunc:Function):void{
        assetManager.loadBundle(abName,(err,bundle)=>{
            if(err!=null){
                this.abBunds[abName] = null;
            }
            else{
                this.abBunds[abName] = bundle;
            }
            if(endFunc){
                endFunc();
            }
        });
        
    }

    /**
     * 预加载资源包
     * @param resPkg 资源包
     * @param progressFunc 进程函数
     * @param endFunc 回调函数
     */
    preloadResPkg(resPkg, progressFunc ,endFunc):void{
        this.total = 0;
        this.now = 0;

        this.totalAb = 0;
        this.nowAb = 0;

        this.progressFunc = progressFunc;
        this.endFunc = endFunc;

        for(var key in resPkg){
            this.totalAb++;//ab包总数
            this.total += resPkg[key].urls.length;//资源总数
        }

        for(var key in resPkg){
            this.loadAssetsBundle(key,()=>{
                this.nowAb++;
                if(this.nowAb === this.totalAb){
                    this.loadAssetsInAssetsBundle(resPkg);
                }
            })
        }

    }

    /**
     * 获取资源
     * @param abName 资源包名
     * @param url 资源路径
     * @returns
     */
    getAsset(abName,url):any{
        var bundle = assetManager.getBundle(abName);
        if(bundle === null){
            console.log("[error]:"+abName+"AssetBundle not load !");
            return null;
        }
        return bundle.get(url); 
    }
}

上面单例的使用方法是先调用preloadResPkg加载资源包和资源,然后通过getAsset获取资源:

//预加载资源包和资源
ResMgr.Instance.preloadResPkg(ResPkg,null,()=>{
    //此处进行资源获取操作
    var res = ResMgr.Instance.getAsset("AssetBundle包名","资源url路径");
    //实例化节点等操作
    // instantiate(res)
});

关于ResPkg的输入内容,可以创建一个包含资源包配置信息的对象,新建一个GameResPkg脚本,内容如下:

import { Prefab } from "cc";

var ResPkg = {
    "GUI":{
        assetType: Prefab,
        urls:[
            "UIPrefabs/my_img",
            //其他资源的urls。。。
        ]
    },
    //其他ab包信息。。。
};
export default ResPkg;

有了上面的资源包配置信息对象,我们就可以统一管理要加载的资源包了。
针对上面的小案例,我们可以把scrpits文件夹内结构改成下面的结构:
在这里插入图片描述
GameStart中的内容如下:

import { _decorator, assetManager, Component, instantiate, Node, Prefab } from 'cc';
import ResMgr from './Managers/ResMgr';
import ResPkg from './Game/GameResPkg';
const { ccclass, property } = _decorator;

@ccclass('GameStart')
export class GameStart extends Component {
    
    protected onLoad() {
        //注册资源管理器
        this.node.addComponent(ResMgr);        
    }

    protected start(): void {
        //预加载资源包和资源
        ResMgr.Instance.preloadResPkg(ResPkg,null,()=>{
            this.enterGameScenes();
        });
    }
    enterGameScenes(){
        //此处进行资源获取操作
        var myImgPrefabs = ResMgr.Instance.getAsset("GUI","UIPrefabs/my_img");
        //实例化节点等操作
        // instantiate(res)
        var myImg = instantiate(myImgPrefabs);
        this.node.addChild(myImg);
    }
}

在运行之前一定要注意Canvas节点上要挂载GameStart脚本。运行效果如下:
在这里插入图片描述
如果有更多的资源,也可以通过设置更多的AssetBundle文件夹来进行分类:
在这里插入图片描述
然后在ResPkg 中增加需要加载的资源包配置信息。

实现进度条加载功能:

我们可以通过now/total的值来实现进度条加载的百分比功能:

1、导入进度条图片、创建进度条节点

在GUI下导入进度条图片:
在这里插入图片描述
在Canvas节点下创建空节点ResourcesLoading,在ResourcesLoading节点下创建空节点bg,在空节点中添加组件Sprite.在Sprite属性中修改SpriteFrame的图片,然后将Color调整为黑色。
设置bg节点图片
在ResourcesLoading节点下创建Sprite,并重命名为ProgressValue
在这里插入图片描述
同样,在右侧修改ProgressValue的Sprite Frame为自己导入的图片,将Size Mode修改为CUSTOM,Type修改为FILLED,Fill Type修改为HORIZONTAL。
在这里插入图片描述
ctrl+s保存场景。

2、编写进度条脚本代码

进入到GameStart类中的start()方法,修改代码如下:

protected start(): void {

        var loading = this.node.getChildByName("ResourcesLoading");
        var progressValue = loading.getChildByName("ProgressValue").getComponent(Sprite);

        //预加载资源包和资源
        ResMgr.Instance.preloadResPkg(ResPkg,(now,total)=>{
            progressValue.fillRange = now/total;
        },()=>{
            //加载完成
            loading.destroy();
            this.enterGameScenes();
        });
    }

ctrl+s保存代码后,返回cocos creator点击运行,可以看到图片成功加载了进来,由于我们加载的资源过少,所以进度条加载很快,如果加载不明显,我们可以自己在AssetsBundle中多添加一些资源,最好是一些比较大的照片或者是音乐,这样效果比较明显。
如果是mp3的音乐,则资源的类型为AudioClip:
在这里插入图片描述
添加资源后,进度条效果如下所示:
在这里插入图片描述
以上就是AssetBundle资源管理框架的内容了,第一次写cocos creator的博客,如有错误,请多指正,我会虚心接纳的,谢谢大家。

CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle 在日常游戏开发过程中,为了减少游戏启动时,资源首次下载和加载的时间,我们可以只下载和加载需要的资源模块。而CocosCreator 中的 Asset Bundle 就是这样的模块化工具,允许我们按照项目需求,将图片、脚本、场景 等资源划分在多个不同的 Asset Bundle 中。例如:一个大厅中集成了很多小游戏,我们都可以把 大厅以及不同的小游戏分别划分成不同的 Asset Bundle来管理。Asset Bundle 可以放在不同的地方,比如远程服务器上,本地、或者小游戏平台的分包里。 阅读详情

相关推荐

【包教包会】CocosCreator3.x框架——资源管理(秒Loading、大厅子游戏、同步加载、极简对象池、多语言)

CocosCreator3.x商用框架——资源管理模块

CocosCreator水煮肉片饭的博客 4091

CocosCreator | Asset Bundle 全解析-使用方法

更好的阅读体验,请访问微信公众号: 本文中 Asset Bundle 简称AB包 外部资源 =不在本AB包目录内的资源(包括内置AB包和其他AB包) 01 AB包的定义 AB包作为资源模块化工具,允许开发者按照项目需求将贴图、脚本、场景等资源划分在多个AB包中,然后在游戏运行过程中,按照需求去加载不同的AB包,以减少启动时需要加载的资源数量,从而减少首次下载和加载游戏时所需的时间,同时可以减少内存占用 AB包可以按需求随意放置,比如可以放在远程服务器、本地、或者小游戏平台的分包,...

Valiancer 1万+

Cocos Creator AssetBundle 游戏分包方案评估

  Cocos Creator 2.0 之后推出了AssetBundle系统,类似于Unity3D的AssetBundle。先简单讲一下AssetBundle的原理作用,不涉及具体引擎的具体细节,各个游戏引擎之间也略有差异。   AssetBundle是将游戏中使用的资源分成若干个包,这样做的意义在于减少安装包的体积,让用户快速下载并进入游戏,剩下的资源包在游戏过程中后台下载,甚至可以在需要使用某一整块的资源时再下载,节约用户的流量。   另外,可以给AssetBundle增加版本管理,这可以针对不同的玩家

Vongolar的博客 2835

cocosCreator 之AssetManager资源管理和释放

关于Asset的引用计数,和AssetManager及Bundle的资源管理和释放

鹤九日的博客 3613

Cocos Creator资源管线搭建:Prefab组织与AI编程实践

在游戏开发中,资源管理是影响工程效率的核心环节。通过Prefab等可复用单元组织资源,结合Bundle加载与自动释放机制,可显著降低内存占用与加载耗时。合理的目录结构与命名规范,配合编辑器校验脚本,能有效避免引用丢失与包体膨胀。在Cocos Creator中,利用AI编程工具辅助生成资源加载器与校验脚本,可加速管线搭建,但需注意API版本匹配与运行时验证。本文围绕单人开发场景,分享从资源组织、加载策略到打包配置的完整实践,帮助开发者构建可扩展的资源管线。

weixin_31509753的博客 150

Cocos Creator棋牌游戏客户端初始化流程全解析:从架构设计到性能优化

在游戏开发中,客户端初始化是确保应用稳定运行和提供流畅用户体验的基石。其核心原理在于通过结构化的任务调度,有序地完成引擎启动、资源加载、网络连接和数据同步等关键步骤,从而为后续复杂的游戏逻辑提供一个稳定、数据就绪的运行环境。这一流程的技术价值在于,它能有效管理依赖、控制资源加载、集中处理错误,并提升项目的可维护性。尤其在Cocos Creator引擎开发的中大型项目,如棋牌游戏中,一个设计良好的初始化管理器(LaunchManager)和分阶段的任务执行策略,能够显著优化启动速度,避免因资源竞争或顺序错误导

weixin_30564785的博客 313

cocosCreator 之 Bundle使用

cocosCreator 之 自定义Bundle的使用和加载

鹤九日的博客 5903

Cocos Creator 游戏资源解密与加密实战:从 XXTEA 到 AssetBundle 防护

在游戏开发与安全测试领域,客户端资源的加密与解密始终是开发者关注的核心议题。Cocos Creator 作为主流跨平台引擎,其构建产物中的脚本与资源文件常采用 XXTEA、AES、自定义 XOR 或代码混淆等方式进行保护,而理解这些加密机制的原理,是进行逆向分析、安全加固和知识产权保护的基础。通过分析文件头特征、检索构建配置中的密钥信息、定位引擎源码中的算法实现,开发者可以使用 Node.js 编写脚本还原被加密的 JavaScript 逻辑与纹理资源。这一技术链路不仅适用于自研游戏的安全自查、授权项目的合

weixin_33095355的博客 270

告别cc.loader!Cocos Creator 2.4+ AssetManager实战避坑指南(附完整代码)

本文详细解析了Cocos Creator 2.4+中从cc.loader迁移到AssetManager的实战指南,涵盖核心差异、常见问题及解决方案。通过对比新旧API,提供渐进式迁移策略和性能优化技巧,帮助开发者高效管理资源,提升项目性能。

weixin_30698297的博客 588

Cocos Creator Zip文件处理全指南:从解压到资源加载与远程更新

在游戏客户端开发中,zip作为一种通用打包格式,天然适合承载远程资源分发、批量贴图替换和运营配置下发等场景。其核心价值在于将零散文件聚合为单一包体,降低传输成本;而如何高效解压并接入引擎资源管线,则决定了功能落地的质量。Cocos Creator中,开发者通常借助JSZip完成压缩包解析,通过区分文本、图片、音频及自定义二进制数据的不同读取路径,将其转换为引擎可识别的SpriteFrame、AudioClip等资源。面对远程包下载与缓存更新,合理设计并发控制、版本校验及内存管理,能有效规避低端机闪退、白图与

weixin_29009081的博客 285

Cocos Creator资源加密实战:AES-CBC、xxtea与构建插件避坑指南

在游戏开发中,Cocos Creator 项目打包后资源明文暴露是常见隐患,美术素材、配置表乃至核心脚本都可能被轻易解包。资源加密作为最直接的防线,需要在理解引擎加载机制的基础上设计。业界常用的对称加密方案如 AES-CBC 用于静态资源容器加密,xxtea 用于脚本保护,二者配合可覆盖大多数实际场景。通过构建插件在发布流程中自动完成加密与清理,能显著降低手动操作的遗漏风险。本文从资源加密的目标与边界谈起,讲解 Node 实现 AES-256-CBC 加密 AssetBundle、运行时解密方案、脚本 xx

weixin_32943857的博客 289

Cocos Creator | 资源管理:资源的动态加载/远程加载/缓存/预加载/同步加载/远程加载spine

更好的阅读体验请访问公众号: //resources目录 // 所有需要通过脚本动态加载的资源,都必须放置在resources文件夹或它的子文件夹下 resources文件夹需要在assets根目录下手动创建 resources文件夹中的资源,可以引用文件夹外部的其它资源,同样也可以被外部场景或资源所引用 项目构建时,除了在构建发布面板中勾选的场景外,resources文件夹中的所有资源,包括它们关联依赖的resources文...

Valiancer 1万+

RV1126上YOLOv8部署实战:从模型转换到板端推理的完整避坑指南

本文提供了在瑞芯微RV1126芯片上部署YOLOv8目标识别算法的完整实战指南。内容涵盖从模型转换、环境搭建到板端推理代码编写的全流程,重点解析了RKNN-Toolkit使用、量化配置、内存优化及后处理实现等关键环节的常见问题与解决方案,旨在帮助开发者高效避坑,实现边缘AI应用的稳定落地。

pz89012345的博客 568

Cocos Creator 3.x 实战:用脚本动态加载Spine动画,告别resources硬编码

本文详细介绍了在Cocos Creator 3.x中实现Spine动画动态加载的工程化实践,通过对比`resources`模块和`AssetManager`的差异,提出使用配置表和资源管理器的动态加载方案,并结合挂点技术实现特效展示和交互控制。文章还涵盖了性能优化、错误处理以及高级动画控制技巧,帮助开发者构建更健壮、可维护的资源管理系统。

weixin_30938149的博客 377

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1919

英伟达NVIDIA数字IC后端笔试真题(ASIC Physical Design Engineer)

英伟达NVIDIA数字IC后端笔试真题(ASIC Physical Design方向)

weixin_37584728的博客 3918

【Cocos Creator UI资源管理】

ui资源管理框架

Javaigood的博客 1609

WorkBuddy 实战:从聊天窗口到 AI 工作台,打造个人自动化助理

大模型时代,对话式 AI 常被当作高级搜索框,难以沉淀为生产力。其根源在于上下文断裂——每次对话都从零开始。AI Agent 的核心原理是通过状态保持、工具调用与流程复用,将临时交互固化为可重复的协作机制。WorkBuddy 作为个人 AI 工作台,以 Agent + Skill + 工作流架构解决该问题:Skill 封装操作手册,工作区沉淀知识上下文,自定义指令约束输出风格。这种设计让周报生成、会议纪要、文档初稿、专利检索辅助等重复劳动实现流程化自动产出。掌握 WorkBuddy 怎么用,关键在于从自己重

weixin_33834910的博客 335

CocosCreator 2.4.3热更新实现方案(AssetBundle),大厅+子游戏模式快速实现

_前言实现功能项目环境关于 Asset Bundle项目文件解释实现过程工程结构快速使用代码构建发布Creator 构建制作热更新资源制作随包发布模块测试功能模块完整下载模块随包发布注意事项缺陷 前言 最近新开了一个项目,选用引擎升级到2.4.3,把热更新方案切换到基于 Asset Bundle 的方式. 由于原项目中热更新模块修正了好几次,写得比较零散,整理了一下方便后续使用. 实现功能 实现 大厅+子游戏 模式, 低优先级模块可引用高优先级模块中资源及脚本 可配置模块依赖,被依赖的模块会自动更新 多模

zggxjxcgx的博客 8462

西门子Industrial Copilot实战:5个工业场景下的AI效率提升案例

本文通过五个工业场景实战案例,深入解析西门子Industrial Copilot如何将工业智能转化为实际生产力。从自动化配置、预测性维护到能源优化与人机交互,这位AI助手显著缩短工程周期、提升设备可用率并降低运营成本,展示了其在工业领域系统化、工程化的落地价值。

3c4x5z6v7b的博客 927

金智维KRPA实战:Excel自动化数据处理全流程解析

本文详细解析了金智维KRPA在Excel自动化数据处理中的全流程应用,涵盖COM接口和文件读写两种核心技术方案,以及销售报表生成、数据清洗和可视化仪表盘等实战案例。通过企业级应用的异常处理、性能优化和安全合规实践,显著提升数据处理效率和准确性,助力企业降本增效。

weixin_30329623的博客 598

Cocos Creator v2.4 更新说明,解锁更多新功能!

工欲善其事,必先利其器!在长达两个月的测试后,2.4 版本终于在端午前来了!在此感谢给予我们宝贵意见和建议的各位小伙伴们,也提前祝大家端午节安康喔!这个版本中包含了许多新的功能与更新,如...

奎特尔星球 3849

别再死记硬背了!用Amesim HCD库亲手搭建单向阀、锥阀、球阀模型(附详细参数设置)

本文详细介绍了如何使用Amesim HCD库从零构建单向阀、锥阀和球阀的仿真模型,帮助工程师摆脱死记硬背,掌握物理建模的核心技巧。通过实战案例和参数设置指南,读者将学会如何优化阀门动态响应、验证流量特性以及处理旋转运动等独特挑战,提升液压系统设计效率。

weixin_29248611的博客 501

Cocos Creator 发展趋势与感悟

张晓衡,软件研发经验值十年,后三年专注于手游开发。Cocos 的铁杆老粉、社区活跃份子、简书心得达人。平常喜欢将自己的工作用文字和视频的方式记录,最近更是创建了「奎特尔星球」公众号,通过另类的讲解方式为大众开启了 Cocos 开发的另一扇大门。愿他的经验值能对大家的开发生涯有所帮助。????????????转眼间就要到年底了。回首这一年,我使用 Cocos Creator 引擎开发游戏项目已经快一年。依仗着之前 C...

Cocos的博客 279

ADI DSP开发环境(CCES)下的程序烧录问题(以ADSP-SC589为例)

在CCES环境下将程序烧录到flash主要有两种方式。首先在对项目编译产生文件的属性设置为Release。 在编译完成后,找到每个CORE单独生成的DXE文件: 文件通常位于项目目录下每个core的Release文件中。安装SC589评估板的驱动(ADSP-SC5xx_EZ-KIT_Lite-Rel2.0.0.exe)后,在安装目录下可以找到SPI FLASH芯片的驱动程序(sc589_w25q128fv_dpia_Core1.dxe): 把文件copy到CCES 的目录下由于SC58x处理器的特殊性

daijingxin的博客 3730

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

cocosCreator热更和Asset Bundle使用学习。

快速理解和上手cocosCreator热更流程

星期一的博客 6062

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: gitee仓库上传速查
下一篇: 【Cocos Creator UI资源管理】
吊云
博客等级 码龄6年 73粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值