声明:编辑器原生场景将对原生桌面引擎有极大的稳定性和功能完整性需求,所以大家放心, 本帖不代表引擎官方会放弃原生桌面。
这篇帖子是希望能够听取开发者们的一手经验,让我们对 Electron(或者同类方案)的落地可行性有更全面认知。也让广大想要发布 PC/Mac 的开发者少走一些弯路。
欢迎大家积极分享心得、链接、案例,例如:
- 游戏链接、引擎版本、是否上架 Steam
- 集成了哪些 SDK、集成方式
- 集成了哪些 Electron 配套工具(如 builder、updater)
- ……
声明:编辑器原生场景将对原生桌面引擎有极大的稳定性和功能完整性需求,所以大家放心, 本帖不代表引擎官方会放弃原生桌面。
这篇帖子是希望能够听取开发者们的一手经验,让我们对 Electron(或者同类方案)的落地可行性有更全面认知。也让广大想要发布 PC/Mac 的开发者少走一些弯路。
欢迎大家积极分享心得、链接、案例,例如:
如果现阶段,3.7.3或者将来的3.8要发布pc版本,官方是推荐使用cocos windows还是使用electron呢,正在选型中
这几年米哈游带起来的端手互通的模式已经是小有趋势了,cocos原生桌面的动作一直慢下去的话,类似的项目就越来越不会考虑使用cocos了
坐等官方支持发布PC原生功能的实现。其实,多的不敢说,超一半ccc的开发者都期待了很久发布steam的功能了。现在手游戏,小游戏市场很卷,当然steam更卷,但多一个赛道选择绝壁是件好事。感谢cocos提供谋生工具,官方大大们加油~!
最近有个项目要发布成PC,结果搞了半天,锯齿,卡顿,效果非常差,最后无奈用了electron,但是总要原生的PC,才能发挥全部性能
借贴反映个问题:使用 构建windows + vs2019 编译出来的PC端exe,使用的字体包不生效~~~~
我来冒个泡
本人曾经深入研究过用electron发布pc,开发过一款基于electron发布Windows的免费插件
具体原理2W字长文
想用electron打包建议去用我的插件,可以省不少事
不得不说CocosCreator关于发布Windows的资料非常少,发win的坑太多了
即使发布原生后,怎么控制窗口大小,电脑分辨率,这些都是问题,对小白很不友好
我用electron发布Windows的思路是
Electron + HTML + nircmd + node-win-screen-resolution(插件)
用这一套方案,不需要去打包Windows,只需要发布web-mobile,使用electron框架做成桌面应用,再配合第三方库和插件,非常完美
而且还可以调用一些原生接口,比如静音、休眠、截图等
不过用electron发布有两个缺点
1.性能问题,不多说了
2.发布后大小会多出几百MB,但这个大小作为一个PC游戏完全能接受
我来抛个砖吧,期待大佬来分享
我使用的electron-builder打的包
1.有时我们需要调用electron这边提供的一些能力,比如重启、判断本地是否存在某文件
electron端的代码:
initCocosEventListener(win) {
//渲染层发事件到主进程
win.webContents.executeJavaScript(`window['sendToMain'] = (eventname, data) => { require('electron').ipcRenderer.send("cocosEvent", eventname, data); }`); //cocos -> main
win.webContents.executeJavaScript(`require('electron').ipcRenderer.on('MainReply', (event, eventname, arg) => { window['MainReply'] && window['MainReply'](eventname, arg); });`); //main -> cocos
ipcMain.on("cocosEvent", (event, eventname, data) => {
let callback = (data) => {
try {
event.sender.send("MainReply", eventname, data);
} catch (error) {
//关闭时还在下载的话会弹出错误弹窗
}
};
let func = MethodMap[eventname];
if (func) {
console.log(`callMethod: ${eventname}(${data})`);
func(data, callback);
} else {
console.log(`No Method: ${eventname}(${data})`);
callback({});
}
});
}
这里的win就是new出来的BrowserWindow
cocos 端的代码:
import BaseModel from “…/…/app/models/BaseModel”;
class ElectronModel extends BaseModel {
callbackMap = {};
constructor() {
super();
window['MainReply'] = (replayEventName, arg) => {
if (this.callbackMap[replayEventName]) {
this.callbackMap[replayEventName](arg);
}
}
}
callMethod(eventName: string, params?: any, callback?: Function) {
//没有参数,只有回调函数
if (callback == undefined) {
callback = params;
}
if (window['sendToMain']) {
this.registerCallback(eventName, callback);
window['sendToMain'](eventName, params);
return true;
}
return false;
}
registerCallback(eventName: string, callback?: Function) {
if (callback) {
this.callbackMap[eventName] = callback;
}
}
}
export default new ElectronModel();
说明:
initCocosEventListener中的MethodMap表示你希望提供给cocos端的方法map
cocos端调用的时候类似这样:ElectronModel.callMethod(‘relaunch’);
2.在极个别机子上使用localStorage存储数据,明明写入文件了,但是重启后却读取不到,所以后来使用electron-store来做存储,配合上面的来调用
3.关于更新,我没有使用全量更新的方式,而是参考的是这篇文章https://segmentfault.com/a/1190000039872331,需要说明的是他最后这个bat转成exe后在某些机子上会被360检测成病毒,所以我自己用c++写了个同样功能的
#pragma comment( linker, “/subsystem:“windows” /entry:“mainCRTStartup”” )
#include <stdio.h>
#include <Windows.h>
#include
int main(int argc, char *argv[])
{
Sleep(1000);
std::string rootPath = argv[1];
std::string appAsarPath = rootPath + "/app.asar";
remove(appAsarPath.c_str());
std::string updateAsarPath = rootPath + "/update.asar1";
rename(updateAsarPath.c_str(), appAsarPath.c_str());
std::string cmd = "cmd /C call ";
cmd += std::string("\"") + argv[2] + "\"";
WinExec(cmd.c_str(), SW_HIDE);
}
没有上架过PC,不过未来想做PC上架Steam,有解决方案肯定是很好的啊!
期待PC场景的发布,多一个选择。但是能不考虑electron吗,这个东西性能不好,,,,
牛逼呀,感谢大佬
2.x有机会支持吗
发布web-mobile? web-desktop吧?,不然pc浏览器非常卡
2.x是支持的,理论上只要能出HTML这个插件都支持
得发web mobile
期待cocos官方支持发布steam,这个需求还是挺大的,个人觉得web套壳的方式挺好的,原生坑太多了
creator 版本2.4.8 ,electron打包PC
好处:方便,web-mobile工程直接放入elelctron环境配置下,直接可以运行。
坏处:web端需要手动对一些组件进行控制,不如原生端用起来舒服。然后就是性能在低端机器上很差。