Cocos Creator—最佳构建部署实践

Cocos Creater cc._RFpush cc._RFpop ** Cocos Creater cc._RFpush();cc._RFpop(); Cocos Creater 用来标记当前脚本的 uuid的方法,这样当你在脚本里定义一个组件时,引擎才有办法把组件跟 uuid 关联起来。属于引擎本身代码。 // An highlighted block "use strict"; cc._RFpush(module, 'e823ag6D0BDOo3EWk9jIy1o', 'Star'); cc._RFpop(); },{}]},{},["Game","Star","P 阅读详情

这篇文章主要是我们团队在使用Cocos Creator过程中的一些关于部署方面的实践总结,标题党了一回,严格来说,应该是《快看漫画游戏研发团队使用Cocos Creator构建部署最佳实践》,对于其他团队可能并不是。

之所以写这篇文章,一是我刚开始接触Cocos Creator的时候,发现构建部署方面的一些问题,针对性写了3篇优化的方案,随着对Cocos Creator了解的深入,我发现了一些更好的替代方法,二是因为我们团队随着业务发展,又到了缺人的时候,出来刷刷脸,发点招聘广告:Cocos Creator工程师快到碗里来。

不过你不用担心,本文不会只是炒炒冷饭,这次涉及的内容覆盖了构建部署的整个环节,如果你刚好把代码写好了,你应该看看本文,它会告诉你怎么把你的代码漂亮的部署到线上,并且这里涉及的代码你都可以通过github查看。涉及知识点如下:

  1. 如何自定义loading页面
  2. 图片部署自动化压缩优化
  3. 减少loading页面出现之前的白屏时间
  4. 代码混淆与保护
  5. 文件资源增加md5版本号
  6. cdn缓存

由于我们游戏采用的是1.6版本,所以还保留了md5版本号的优化,新的1.7版本已经比较完美支持md5的功能,但由于没有在实践中使用,所以还是基于1.6版本做一次总结,本质是一样的。

本篇我们会基于Cocos Creator的官方示例做分析,我在原demo的基础上增加了部署的脚本,部署到又拍云和腾讯云。为了展示自定义loading页面的功能,我把这个游戏的loading页面改了,如果有问题,麻烦官方联系我下架。

1. 如何自定义loading页面

这个需求官方其实是有提供解决方案的,官方文档-“定制项目构建模板”的功能就可以实现这个需求,可能是文档描述得不太清楚,我当时并没有把这个功能跟“自定义加载首页”联系起来。

由于这个构建模板功能,我们就可以不用gulp插件轻松实现自定义首页HTML,CSS,JS的功能了。怎么实现可以访问本文的项目地址查看。

自定义loading页面效果:

WX20171213-221317@2x.png

2. 图片部署自动化压缩优化

通过gulp工具,在部署之前自动化处理一遍图片压缩流程,在无损压缩的情况下,既能保证图片的输出质量还能减少体积。有团队会手动采用tinypng或者其他压缩工具提前压缩,这样做也是可以的,但流程不好把控,原则上能自动化处理的尽量让机器来做,人是会累的但机器不会,也不会出错。

var imagemin = require("gulp-imagemin");
gulp.task("imagemin", function (cb) {
    gulp.src(["./build/web-mobile/**/*.png"])
        .pipe(imagemin([
            imagemin.gifsicle({interlaced: true}),
            imagemin.jpegtran({progressive: true}),
            imagemin.optipng({optimizationLevel: 5})
        ]))
        .pipe(gulp.dest("./build/web-mobile/"))
        .on("end", cb);
});`

3. 减少loading页面出现之前的白屏时间

通过gulp-htmlmin插件,把首屏的js,css文件合并到首页html文件,能有效减少网络不稳定情况下进入游戏白屏的时间。

var htmlmin = require("gulp-htmlmin");
gulp.task("htmlmin", ["imagemin"], function (cb) {
    gulp.src("./build/web-mobile/*.html")
        .pipe(fileInline())
        .pipe(htmlmin({
            collapseWhitespace: true,
            removeComments: true,
            minifyCSS: true
        }))
        .pipe(gulp.dest("./build/web-mobile/")
            .on("end", cb));
});

通过合并操作,首屏loading页面只需要加载index.html文件,在304情况下白屏时间只有142ms!

WX20171214-101911@2x.png

4. 代码混淆,代码保护

Cocos Creator引擎build后会对代码进行压缩优化,但通过强大的chrome工具格式化代码后,还是能轻松阅读代码的整体逻辑,在竞争激烈的游戏行业,代码保护力度是不足够的。由于代码暴露在前端,H5游戏不存在加密可言,但我们可以做一些工作,增加游戏被破解盗窃的难度。

gulp-javascript-obfuscator插件可以对代码进行可读性混淆,禁止开启chrome调试,域名绑定等功能,能很大程度保护自己的代码,这个插件还有其他很强大的功能,有兴趣可以访问github了解。但我不建议开启太多功能,毕竟对性能还是有一定影响。

var javascriptObfuscator = require("gulp-javascript-obfuscator");
gulp.task("obfuscator", ["htmlmin"], function (cb) {
    gulp.src(["./build/web-mobile/project.js"])
        .pipe(javascriptObfuscator({
            compact: true,
            domainLock: [".zz-game.com"],
            mangle: true,
            rotateStringArray: true,
            selfDefending: true,
            stringArray: true,
            target: "browser"
        }))
        .pipe(gulp.dest("./build/web-mobile")
            .on("end", cb));
});

我采用了最轻量的混淆方案,混淆前后对比:

混淆前:

TabCtrl: [function(t, e, i) {
        "use strict";
        cc._RF.push(e, "62208XJq9ZC2oNDeQGcbCab", "TabCtrl"),
        cc.Class({
            extends: cc.Component,
            properties: {
                idx: 0,
                icon: cc.Sprite,
                arrow: cc.Node,
                anim: cc.Animation
            },
            init: function(t) {
                this.sidebar = t.sidebar,
                this.idx = t.idx,
                this.icon.spriteFrame = t.iconSF,
                this.node.on("touchstart", this.onPressed.bind(this), this.node),
                this.arrow.scale = cc.p(0, 0)
            }
        }),
        cc._RF.pop()
    }
    , {}]
}, {}, ["ItemList", "ItemTemplate", "BackPackUI", "ButtonScaler", "ChargeUI", "EnergyCounter", "HeroSlot", "HomeUI", "PanelTransition", "ShopUI", "SubBtnsUI", "MainMenu", "MenuSidebar", "TabCtrl"]);

混淆后:

'l': [function(b, a, c) {
        'use strict';
        cc[_0xc008('0x12')][_0xc008('0x13')](a, _0xc008('0x98'), 'l'),
        cc['T']({
            'S': cc['U'],
            'O': {
                'idx': 0x0,
                'icon': cc[_0xc008('0x3e')],
                'arrow': cc['Node'],
                'anim': cc['Animation']
            },
            '_': function(a) {
                this[_0xc008('0x68')] = a[_0xc008('0x68')],
                this['idx'] = a[_0xc008('0x7b')],
                this[_0xc008('0x66')][_0xc008('0x47')] = a[_0xc008('0x65')],
                this[_0xc008('0x1b')]['on'](_0xc008('0x99'), this[_0xc008('0x9a')][_0xc008('0x5e')](this), this[_0xc008('0x1b')]),
                this[_0xc008('0x9b')][_0xc008('0x9c')] = cc['p'](0x0, 0x0);
            }
        }),
        cc[_0xc008('0x12')][_0xc008('0x20')]();
    }
    , {}]
}, {}, ['i', 'd', 'f', 'c', 'j', 'b', 'h', 'n', 'a', 'm', 'g', 'k', 'e', 'l']);

在不影响性能的前提下,稍微做一些代码保护,还是不错的。如果你想让代码更恶心一点也是可以的:

a.DFsJp;
        cc[a[_0xc91c('0x43a')](_0x490d30, a[_0xc91c('0x43b')])][a[_0xc91c('0x43c')](_0x490d30, _0xc91c('0xe5'))](b, a[_0xc91c('0x43c')](_0x490d30, a['\x68\x6d\x41\x4c\x54']), '\x6c'),
        cc['\x54']({
            'S': cc['\x55'],
            'O': {
                'idx': 0x0,
                'icon': cc[_0x490d30(_0xc91c('0x249'))],
                'arrow': cc['\x4e\x6f\x64\x65'],
                'anim': cc[a[_0xc91c('0x43d')]]
            },
            '_': function(b) {
                this[a[_0xc91c('0x43e')](_0x490d30, _0xc91c('0x31c'))] = b[a[_0xc91c('0x43e')](_0x490d30, '\x30\x78\x36\x38')],
                this[a[_0xc91c('0x43f')]] = b[_0x490d30(a[_0xc91c('0x440')])],
                this[_0x490d30(a[_0xc91c('0x441')])][_0x490d30(a['\x6b\x77\x71\x63\x72'])] = b[_0x490d30(a[_0xc91c('0x442')])],
                this[_0x490d30(_0xc91c('0x1c0'))]['\x6f\x6e'](a[_0xc91c('0x43e')](_0x490d30, a[_0xc91c('0x443')]), this[a['\x45\x79\x7a\x47\x44'](_0x490d30, a['\x6a\x64\x44\x61\x6e'])][_0x490d30(_0xc91c('0x2e0'))](this), this[a[_0xc91c('0x444')](_0x490d30, _0xc91c('0x1c0'))]),
                this[a[_0xc91c('0x445')](_0x490d30, _0xc91c('0x446'))][a[_0xc91c('0x445')](_0x490d30, a[_0xc91c('0x447')])] = cc['\x70'](0x0, 0x0);

开启debugProtection功能:

image.png

打开chrome调试工具就会触发无限循环的dubugger,让chrome调试工具无法使用,增大破解难度。为了方便大家查看学习demo,线上版本我关闭了这个选项。

开启disableConsoleOutput功能:

image.png

禁止console.log功能,很多混淆代码,通过断点+console.log,可以方便把翻译后的代码输出,开启disableConsoleOutput,同样增加调试难度。为了把我们的广告无处不在,我同样把它关了。JavaScript obfuscator还有其他不错的功能,这里不再展开。

5. 文件资源增加md5版本号

版本号的方案跟之前的文章基本一致,这个流程在1.7版本应该可以忽略了。

gulp.task("resRev", ["obfuscator"], function (cb) {
    gulp.src(["./build/web-mobile/**/*.js", "./build/web-mobile/*.png"])
        .pipe(rev())
        .pipe(gulp.dest("./build/web-mobile/"))
        .pipe(rev.manifest())
        .pipe(gulp.dest("./build/web-mobile/")
            .on("end", cb));
});
gulp.task("default", ["resRev"], function (cb) {
    del(["./build/web-mobile/src"]);
    gulp.src(["./build/web-mobile/*.json", "./build/web-mobile/index.html"])
        .pipe(revCollector())
        .pipe(gulp.dest("./build/web-mobile/"));
    gulp.src(["./build/web-mobile/*.json", "./build/web-mobile/main*.js"])
        .pipe(revCollector({
            replaceReved: true
        }))
        .pipe(gulp.dest("./build/web-mobile/")
            .on("end", cb));
});

通过md5+强缓存,第二次加载基本是毫秒级,瞬开。

116个请求的页面,只需要109ms就能渲染出loading页面,完全加载所有资源只需要1.25s:

image.png

6. cdn缓存

最后是把代码部署到cdn,现在的云服务都提供cdn分发的功能,通过简单配置,我相信你能折腾出来的,所以不再赘述。

这里主要做不同方案的演示,我部署了两个方案:直接回源和cdn分发。

首次访问

在Wifi网络下,回源方案耗时6-10s,cdn分发方案耗时3-6s。

第二次访问

由于增加了强缓存,无论是cdn还是回源,第二次访问时间都在1-2s之间。

这个项目本身存在先天不足,例如图片没有合并,导致首次请求有116个,加载速度肯定会受影响。但通过cdn缓存方案,也能基本保证快速加载。

又拍cdn方案:

image.png

腾讯回源方案:

image.png

代码我已经部署到了又拍云和腾讯云,大家可以点击访问感受加载速度。

直接回源的部署方案,点击访问

采用cdn等优化方案,点击访问

cdn是比较好的优化首次访问网络速度的方案,但cdn也不是必然比源站快,大家测试时发现回源更快也不必惊讶,本质上cdn节点就是距离你更近的代理服务器,但也有很多情况导致cdn缓慢,所以部署后还要通过工具多测试各个cdn节点的状况。

最后

游戏优化肯定不仅仅这几条,有很多优化要根据实际情况实际分析。但这6点实践,应该可以解决论坛经常提到的缓存刷新,加载速度等部署相关的问题。

资源md5+cdn+强缓存能解决80%H5游戏加载速度的问题,特别是第二次访问,2秒打开轻轻松松,基本已经成为web前端优化的工业标准方案。但现在很多线上的H5游戏还有很多走url参数+时间戳/md5的老方案,这种方案有很多弊端。希望通过本文,大家都能在自己的游戏内把资源md5+cdn+强缓存的方案贯彻执行起来。其实很简单,特别是Cocos Creator1.7版本后就更方便了。H5游戏的优势就是即点即玩,如果这点都做不到,就没什么优势了。

说了这么多,你可能觉得实践起来很麻烦,业务太多没时间搞这些。

没关系,本文买一送一,既然你看到这里,说明你也是有缘之人,我把代码仓库也赠送给你,例子源码我放在了github cocos-fly上,有需要大家可以上去下载。

把gulpfile.js和releash.sh扒下来,只需要执行命令:sh releash,就可以一键构建出可发布的代码。

 



作者:橡树小屋
链接:https://www.jianshu.com/p/44d36f109c62
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

游戏后台搭建(基于cocoscreator+nodejs+linux-阿里云) 后台搭建 环境 阿里云linux云服务器(需要为新端口 添加安全组 许可访问) node.js cocoscreator 需求 全服排行榜存储 用户账号 运营数据(评估游戏品质) 七日留存统计 日活统计 激励广告展示统计,预计广告收入 一 使用nodejs构建http服务 安装nodejs https://www.runoob.com/nodejs/nodejs-install-... 阅读详情

相关推荐

Cocos Creator游戏部署全攻略:从Web到原生App的构建与发布实战

游戏部署是将开发成果转化为可分发产品的关键环节,其核心在于将项目源码、资源与配置按目标平台规则进行转换、打包与优化。理解构建配置原理,如MD5缓存机制能实现增量更新与缓存管理,内联SpriteFrame可优化资源加载性能,这些技术能显著提升应用加载速度与用户体验。在工程实践中,针对Web平台需关注服务器配置与缓存策略,移动端则涉及签名、分包及ABI适配,而小游戏平台需应对严格的包体限制。通过命令行与自动化构建,开发者可将其集成到CI/CD流程,实现高效团队协作。本文以Cocos Creator为例,详解了从

weixin_28717411的博客 270

cocos creator游戏发布和部署-HTML5篇

游戏开发完成之后,我们想要把游戏分享给好友怎么办呢?要么你打包成android包发给朋友,要么上架应用商店,总之非常麻烦!有没有更好的办法呢? 别问,问就是有!直接部署在自己的云主机上!把android包放在服务器上供好友下载!但是。。。。你好基友说劳资是iphone,咋办? 你思考了0.1秒钟,怼他:浏览器有不(当然有了),等我3分钟! 下面你就开始你的html5游戏发布和部署了???? 1、发布web-mobile co...

master-计算机科学专栏 1万+

H5与Cocos Creator iframe通信实战:基于postMessage的完整指南

在Web开发中,跨文档通信是实现复杂应用集成的关键技术,尤其在微前端和混合应用架构中。其核心原理基于浏览器的同源策略与postMessage API,该API允许不同源的窗口间进行安全、异步的数据传递,是实现iframe内外通信的标准方案。这项技术的工程价值在于,它能在保障安全隔离的前提下,实现模块间的解耦与灵活交互,极大地提升了开发效率和系统可维护性。典型的应用场景包括H5活动页嵌入互动游戏、教育平台加载交互式课件等需要动态参数传递与事件同步的混合应用。本文聚焦于H5与Cocos Creator游戏引擎的

weixin_33981932的博客 432

CocosCreator代码混淆加密

前言 做了一段cocosCreator。在fbinstant和微信上线了几款游戏。曾经有一款fb精品被破解反编译,短时间上线到微信平台。后来我们上线微信平台的时候,竟然被告知是抄袭【程序苦,程序类,程序哥哥很晚睡,感觉一下回到解放前的赶脚!】,因此而带来的起诉,调节等一系列时间成本消耗。所以代码、资源保护成了开发环节不可缺少的一方面。经过几个月内部测试使用,发现可行。最终决定封装成插件形式来提供使用。 一、插件功能: 通过对代码进行混淆加密,增加了代码的保护机制,增加了反编译的难度。 二、安装使用说明: 1

Allen_ww的博客 6568

Cocos Creator开发者必读:从零到一发布npm包的完整工程化指南

模块化开发是现代前端和游戏开发的核心实践,它通过将代码封装成独立、可复用的包来提升开发效率和维护性。其原理基于依赖管理和版本控制,允许开发者在不同项目间共享功能模块。在技术价值上,模块化不仅促进了代码复用和团队协作,更是实现工程化、自动化构建和持续集成的基石。对于Cocos Creator开发者而言,掌握npm包的发布流程,能够将游戏组件、工具函数或编辑器插件产品化,从而在团队内部建立共享资源库,或向社区贡献开源项目。本文聚焦于Cocos Creator生态,深入解析如何规划包结构、配置关键的`packag

weixin_30652897的博客 317

Cocos Creator微信小游戏UI自动化测试:引擎驱动与图像识别混合方案实践

UI自动化测试是游戏开发中提升测试效率、保障版本质量的关键技术。其核心原理是通过脚本模拟用户操作,自动执行界面交互与验证流程,从而将测试人员从重复性工作中解放出来。在技术实现上,主要分为基于引擎接口的“白盒”驱动和基于图像识别的“黑盒”驱动两种路径。前者通过调用引擎API直接操作UI节点,精准高效且能验证内部状态;后者则通过图像匹配模拟真实点击,通用性强但稳定性受环境影响。对于Cocos Creator 3.x开发的微信小游戏,因其特殊的“套娃”运行环境(Cocos引擎运行于微信小游戏Runtime),传统

weixin_30800807的博客 406

Cocos Creator跨平台游戏引擎:从新手到专家的完整开发指南

Cocos Creator作为一款优秀的**跨平台游戏引擎**,为开发者提供了从创意到发布的完整解决方案。无论你是想要制作2D休闲游戏还是3D沉浸式体验,这个开源引擎都能帮你实现一次开发、多平台部署的梦想。在这个竞争激烈的游戏市场中,选择一个合适的引擎可以让你专注于创意实现,而不是被技术细节困扰。 ## 为什么你的游戏开发需要Cocos Creator? 你是否曾经遇到过这样的困境:学习新引擎

gitblog_00663的博客 1066

Cocos Creator第三方SDK集成实战:从JSB原理到Android/iOS避坑指南

在移动应用和游戏开发中,第三方SDK集成是连接核心功能与外部服务的关键技术环节。其核心原理在于通过JavaScript Binding(JSB)机制,在JavaScript运行环境与原生平台(Android/iOS)之间建立通信桥梁,实现跨语言调用。这项技术的工程价值在于,它允许开发者在不重写核心逻辑的前提下,灵活接入广告、支付、数据分析等标准化服务,极大提升了开发效率和功能丰富性。典型的应用场景包括游戏内嵌广告变现、用户行为统计、社交平台分享以及实时语音通信等模块的快速植入。本文聚焦于Cocos Crea

congbao6525的博客 531

Cocos Creator 3D游戏引擎开发终极指南:从零掌握跨平台游戏制作

在当今竞争激烈的游戏开发领域,开发者们面临着多重挑战:如何快速上手复杂的技术栈?如何实现一次开发、多平台部署?如何确保游戏性能在移动设备和桌面平台上都能达到最佳状态?这些痛点正是 Cocos Creator 游戏引擎要解决的核心问题。作为一个免费、开源、跨平台的游戏引擎,Cocos Creator 为开发者提供了完整的 2D 和 3D 功能,以及直观、低成本且协作友好的工作流程。 ## Coco

gitblog_01056的博客 729

Cocos Creator 3.x小游戏手动分包实战:从45MB到合规包体的完整解决方案

在移动游戏开发中,资源管理与包体优化是提升用户体验的关键技术。其核心原理在于通过合理的资源调度策略,将应用启动所必需的代码和资源压缩到最小,而非必需的资源则进行异步加载,从而显著缩短首屏加载时间,降低用户流失率。这项技术对于微信小游戏、抖音小游戏等有严格包体限制的平台尤为重要,是实现“秒开”体验的工程基础。具体到Cocos Creator引擎,手动分包便是实现这一目标的核心实践。它要求开发者深入理解资源依赖图,通过配置化手段将大型场景、关卡资源等剥离为独立子包,并结合纹理压缩、引擎模块裁剪等优化技巧,系统性

搜索 455

BIM模型轻量化避坑指南:Revit导出GLTF常见问题及解决方案

本文深入探讨了BIM模型轻量化过程中,从Revit导出GLTF格式时遇到的常见问题与解决方案。针对文件体积膨胀、材质丢失、属性信息缺失等核心痛点,提供了从数据预处理、Draco几何压缩、纹理优化到Web端性能调优的全流程实战指南,帮助工程师高效实现BIM模型在WebGL环境中的流畅展示与交互。

wdx012345的博客 171

Cocos Creator可玩广告转换终极指南:快速构建单HTML文件广告

**Cocos Creator可玩广告转换**项目是一个专门针对游戏开发者的强大工具,它能够将Cocos Creator构建的web-mobile项目打包成单个HTML文件的可玩广告。这种技术在现代移动广告中越来越受欢迎,因为它提供了无缝的用户体验和更高的转化率。本教程将带你从零开始,完整掌握这个项目的使用方法和核心技巧。 ## 🚀 环境准备与快速开始 ### 系统要求 - **操作系统**

gitblog_00018的博客 762

Hierarchical Flow Partition(Top-down&&Bottom-up)

hierarchy flow是将设计切分成多个block,分别处理单个block,然后完成后,将它们进行拼接以完成最终的chip。一般划分为三个阶段:chip planning;physical budget就是pin assignmenthierarchy flow实现的方法有两种,一种是top-down,另一种是bottom-up,无论是哪种,都是都要通过flatten的方法分别全局范围进行优化实现。

qq_39493558的博客 3070

Cocos Creator游戏引擎终极指南:掌握跨平台2D/3D游戏开发

Cocos Creator是Cocos家族的新一代游戏开发工具,为开发者提供完整的2D和3D功能,同时提供直观、低成本且协作友好的工作流程。Cocos Engine是Cocos Creator编辑器的运行时框架,支持原生平台、Web平台和快速扩展的即时游戏平台,包括Windows、Mac、iOS、Android、HarmonyOS、Web、Facebook Instant Games、微信小游戏和

gitblog_00898的博客 284

量化风控核心:信用评分卡模型的设计与迭代全流程

◦ 动态策略适配:根据评分卡结果动态调整风控流程——高分用户(>750分)秒级放款,中低分用户(600-700分)触发补充资料提交,低分用户(<600分)直接拒绝。◦ 特征有效性监控:每月计算特征IV值,对IV<0.1的低效特征(如“用户星座”)进行淘汰,同时引入新特征(如电商消费数据)。某城商行通过增量学习,评分卡PSI值长期稳定在0.1以下。◦ 数据筛选:整合征信数据(逾期记录、查询次数)、行为数据(消费频次、还款习惯),某银行评分卡纳入150+维度特征,覆盖用户偿债能力、意愿、稳定性等维度;

2501_91651383的博客 1483

Jetson Orin Nano@Ubuntu22.04:IMX219 CSI摄像头配置全流程与避坑指南

本文详细介绍了在Jetson Orin Nano@Ubuntu22.04系统上配置IMX219 CSI摄像头的全流程,包括硬件安装、驱动配置、常见问题排查及性能优化。特别强调了排线方向、驱动模式选择等关键细节,并提供了实用的命令和解决方案,帮助开发者高效完成摄像头部署与调试。

prometheus9mon的博客 320

Cocos Creator微信小游戏接入文档:跨平台游戏开发的最佳选择

Cocos Creator微信小游戏接入文档:跨平台游戏开发的最佳选择 【下载地址】CocosCreator微信小游戏接入文档 Cocos Creator微信小游戏接入文档为您提供了从开发到发布的全流程指南。通过本指南,您可以轻松掌握如何将Cocos Creator与微信小游戏无缝对接,确保游戏在微信平台上流畅运行。文档...

gitblog_06737的博客 608

手把手教你用二茂铁催化剂搞定醇的动力学拆分(保姆级实验避坑指南)

本文详细介绍了使用平面手性二茂铁催化剂进行醇的动力学拆分的全流程,包括催化剂选择与制备、反应体系搭建与条件优化、实时监测与反应淬灭、产物分离与纯化等关键步骤。通过实战案例和避坑指南,帮助实验人员实现>98% ee的拆分效果,特别适合需要高光学纯度二级芳基醇或烯丙醇的研究者。

weixin_30500105的博客 435

Cocos Creator 3D游戏引擎开发终极指南:从零开始掌握跨平台游戏制作

Cocos Creator作为开源跨平台游戏引擎,为开发者提供了完整的2D和3D功能、直观的编辑器体验和强大的跨平台支持。无论你是游戏开发新手还是有经验的开发者,掌握Cocos Creator都能让你轻松创建高性能、引人入胜的2D/3D游戏和即时Web娱乐内容。本指南将带你深入了解这个强大的游戏开发工具,解决传统游戏开发流程复杂耗时的问题,并提供从入门到精通的完整解决方案。 ## 为什么你需要选

gitblog_00201的博客 308

从零构建虚幻引擎体积云:参数调优与性能平衡的艺术

本文深入探讨了在虚幻引擎中构建逼真体积云系统的关键技术,包括Sky Atmosphere、Volumetric Cloud和Exponential Height Fog三大核心组件的协同工作。重点解析了体积云材质的高级控制、光照阴影的物理模拟以及性能优化策略,帮助开发者在视觉效果与性能之间找到最佳平衡点。

weixin_29012677的博客 938

FlashBootloader01-基于UDS的Flash Bootloader【架构篇】

文章目录1 Flash Bootloader的依赖项2 Flash Bootloader中使用的UDS的主要功能3 Flash Bootloader更新固件3.1 初始化MCU3.2 刷写流程 1 Flash Bootloader的依赖项 通常Flash Bootloader由以下四方面组成: UDS协议 上位机「编写Bootloader Sequence」 通信驱动(如CAN ) Flash Driver 2 Flash Bootloader中使用的UDS的主要功能 1. 10 02服务 客户端

3591
上一篇: cocos creator踩坑日记
下一篇: cocos creator加载和预加载(进度条)远程服务器资源教程
wang2021wang
博客等级 码龄15年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值