WindRunnerMax

廖娜峡城功能优势

无需网络:近场快传技术无需依赖网络,在无网络或网络不稳定的环境下,玩家也能轻松分享游戏资源或组队。玩家只需将两台支持近场快传的设备靠近,即可自动建立连接并开始传输,操作简单快捷。

高速传输:游戏近场快传技术传输速度最高可达100MB/S,能够显著提升游戏资源的传输效率。

跨设备兼容:游戏近场快传支持多种设备平台,如Phone、PC/2in1、Tablet,实现无缝传输。

使用步骤

设备靠近:玩家需要将支持游戏近场快传的设备靠近,以确保能够建立稳定的通信链路。

选择传输内容:在游戏内或专门的传输应用中,玩家需要选择要传输的游戏资源或数据。

开始传输:一旦设备间建立连接,玩家即可启动传输过程,等待资源传输完成。

接入步骤

以下示例中使用的API说明详见接口文档。

开发流程

图片1

导入模块

导入Game Service Kit及公共模块。

import { abilityAccessCtrl, AbilityConstant, UIAbility, common } from "@kit.AbilityKit";

import { hilog } from '@kit.PerformanceAnalysisKit';

import { gameNearbyTransfer } from '@kit.GameServiceKit';

import { BusinessError } from '@kit.BasicServicesKit';

申请权限

申请ohos.permission.DISTRIBUTED_DATASYNC权限用于设备发现。

let atManager = abilityAccessCtrl.createAtManager();

let uiAbilityContext = this.getUIContext()?.getHostContext() as common.UIAbilityContext;

try {

atManager.requestPermissionsFromUser(uiAbilityContext, ['ohos.permission.DISTRIBUTED_DATASYNC']).then((data) => {

hilog.info(0x0000, 'nearby', '%{public}s', 'data: ' + JSON.stringify(data));

}).catch((err: object) => {

hilog.error(0x0000, 'nearby', '%{public}s', 'err: ' + JSON.stringify(err));

})

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

创建游戏近场快传服务并注册相关回调

导入相关模块后,需先调用create接口创建游戏近场快传服务,然后注册各回调事件。

public create() {

let uiAbilityContext = this.getUIContext()?.getHostContext() as common.UIAbilityContext;

let initParam: gameNearbyTransfer.CreateParameters = {

abilityName: uiAbilityContext.abilityInfo.name,

context: uiAbilityContext,

moduleName: uiAbilityContext.abilityInfo.moduleName,

needShowSystemUI: false // 是否展示系统UI,true为展示,false为不展示,默认为false

};

try {

gameNearbyTransfer.create(initParam).then((createResult) => {

hilog.info(0x0000, '[nearby]', '%{public}s', 'create success' + createResult.localDeviceName);

this.registerCallback();

}).catch((err: BusinessError) => {

hilog.error(0x0000, '[nearby]', '%{public}s', 'create error' + (err as Error).message);

})

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

}

// 注册监听

public registerCallback() {

try {

gameNearbyTransfer.on('connectNotify', connectNotifyCallBack);

gameNearbyTransfer.on('receivePackageInfo', receivePackageInfoCallBack);

gameNearbyTransfer.on('transferNotify', transferNotifyCallBack);

gameNearbyTransfer.on('error', errorCallBack);

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

}

function connectNotifyCallBack(callback: gameNearbyTransfer.ConnectNotification) {

}

function receivePackageInfoCallBack(callback: gameNearbyTransfer.PackageInfo) {

}

function transferNotifyCallBack(callback: gameNearbyTransfer.TransferNotification) {

}

function errorCallBack(callback: gameNearbyTransfer.ReturnResult) {

}

接收端接受协同

接收端实现onCollaborate回调,回调中调用acceptCollaboration接口接受协同。

export default class EntryAbility extends UIAbility {

// 协同回调

onCollaborate(wantParam: Record): AbilityConstant.CollaborateResult {

try {

gameNearbyTransfer.acceptCollaboration(wantParam);

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

hilog.info(0x0000, '[nearby]', '%{public}s', 'onCollaborate: accept collaborate');

return AbilityConstant.CollaborateResult.ACCEPT;

}

}

接收端发布自身游戏近场快传服务

接收端调用publishNearbyGame接口发布自身游戏近场快传服务。

try {

gameNearbyTransfer.publishNearbyGame().then(() => {

hilog.info(0x0000, '[nearby]', '%{public}s', 'publishNearbyGame success');

}).catch((err: BusinessError) => {

hilog.error(0x0000, '[nearby]', '%{public}s', 'publishNearbyGame error');

})

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

发送端绑定接收端游戏近场快传服务

发送端绑定接收端游戏近场快传服务支持如下两种方式:自动绑定和选择绑定。

这里以自动绑定为例,发送端调用autoBindNearbyGame接口自动绑定接收端近场快传服务。

try {

gameNearbyTransfer.autoBindNearbyGame().then(() => {

hilog.info(0x0000, '[nearby]', '%{public}s', 'autoBindNearbyGame success');

}).catch((err: BusinessError) => {

hilog.error(0x0000, '[nearby]', '%{public}s', 'autoBindNearbyGame error');

})

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

接收端发送自身文件信息

收到建链成功回调后,接收端调用sendPackageInfo接口发送自身文件,如版本信息、包信息(包名和扩展数据的字符长度范围:[0, 2048]、版本号字符长度范围:[0, 256]、文件列表最多10000条)。

function connectNotifyCallBack(callback: gameNearbyTransfer.ConnectNotification) {

if (callback.connectState == gameNearbyTransfer.ConnectState.CONNECTED) {

// 连接成功回调,判断当前是否为接收端。若当前设备为接收端,请设置为true,否则请设置为false。

let isReceive = true;

if (!isReceive) {

return;

}

// 接收端收到连接回调后需要处理,发送资源包信息给发送端

let packageInfo: gameNearbyTransfer.PackageInfo = {

name: 'com.huawei.xxxx',

files: [],

version: '1.1.0',

extraData: 'extraData'

};

let fileInfo: gameNearbyTransfer.FileInfo = {

path: "/xxx/xxxx/files/data.zip", // 使用沙箱路径

hash: 'fileHash' // 可选

};

packageInfo.files?.push(fileInfo);

try {

gameNearbyTransfer.sendPackageInfo(packageInfo).then(() => {

hilog.info(0x0000, '[nearby]', '%{public}s', 'sendPackageInfo success');

}).catch((err: BusinessError) => {

hilog.error(0x0000, '[nearby]', '%{public}s', 'sendPackageInfo error');

});

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

}

}

发送端对比后传输资源包

发送端收到接收端发送的版本信息后进行对比,调用replyPackageInfoResult上报对比结果,根据对比结果决定是否需要调用transferPackageData接口发送资源包数据。

function receivePackageInfoCallBack(callback: gameNearbyTransfer.PackageInfo) {

// 比较版本,决定是否需要发送资源包,也可以比较文件hash

let packageInfoResult: gameNearbyTransfer.PackageInfoResult = {

packageInfoResultCode: gameNearbyTransfer.PackageInfoResultCode.PACKAGE_AVAILABLE_COMPARED

};

try {

// 上报对比结果

gameNearbyTransfer.replyPackageInfoResult(packageInfoResult).then(() => {

let packageData: gameNearbyTransfer.PackageData = {

name: 'com.huawei.gamenearbydemo',

version: '1.0.0',

files: [{

srcPath: '/data/xxxx/a.zip', // srcPath是需要发送文件的沙箱路径,详情请参见应用沙箱目录。

destPath: 'xxxx/a.zip' // destPath是接收文件的自定义路径,完整的沙箱路径是fileStoragePath+destPath,详情请参见应用沙箱目录。

}]

}

try {

// 发送资源包

gameNearbyTransfer.transferPackageData(packageData).then(() => {

// 发送成功

}).catch((err: BusinessError) => {

// 发送异常

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

});

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

}).catch((err: BusinessError) => {

// 上报异常

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

});

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

}

处理资源包传输进度信息

发送端和接收端在传输回调中处理传输进度信息。

function transferNotifyCallBack(callback: gameNearbyTransfer.TransferNotification) {

if (callback.transferState == gameNearbyTransfer.TransferState.SEND_PROCESS) {

// 处理发送进度,如显示进度条和速率

}

if (callback.transferState == gameNearbyTransfer.TransferState.SEND_FINISH) {

// 发送完成

}

if (callback.transferState == gameNearbyTransfer.TransferState.RECEIVE_PROCESS) {

// 处理接收进度,如显示进度条和速率

}

if (callback.transferState == gameNearbyTransfer.TransferState.RECEIVE_FINISH) {

// 接收完成,获取到资源包存储的沙箱路径

let fileStoragePath = callback.fileStoragePath;

// 对fileStoragePath下的文件做处理

}

}

处理已接收资源包后销毁服务

对已接收数据做好处理或转移后,调用destroy接口销毁服务。若服务销毁后再次使用近场快传服务,需重新创建游戏近场快传服务并注册相关回调。

public destroy() {

// 取消回调注册

this.unregisterCallback();

// 销毁服务

try {

gameNearbyTransfer.destroy().then(() => {

hilog.info(0x0000, '[nearby]', '%{public}s', 'destroy success');

}).catch((err: Error) => {

hilog.error(0x0000, '[nearby]', '%{public}s', 'destroy error' + (err as Error).message);

});

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

}

public unregisterCallback() {

try {

gameNearbyTransfer.off('connectNotify', connectNotifyCallBack);

gameNearbyTransfer.off('receivePackageInfo', receivePackageInfoCallBack);

gameNearbyTransfer.off('transferNotify', transferNotifyCallBack);

gameNearbyTransfer.off('error', errorCallBack);

// 发送端选择手动绑定接收端且已订阅discovery事件

gameNearbyTransfer.off('discovery', discoveryCallBack);

} catch (err) {

hilog.error(0x0000, '[nearby]', '%{public}s', 'error' + (err as Error).message);

}

}

function connectNotifyCallBack(callback: gameNearbyTransfer.ConnectNotification) {

}

function receivePackageInfoCallBack(callback: gameNearbyTransfer.PackageInfo) {

}

function transferNotifyCallBack(callback: gameNearbyTransfer.TransferNotification) {

}

function errorCallBack(callback: gameNearbyTransfer.ReturnResult) {

}

function discoveryCallBack(callback: gameNearbyTransfer.DiscoveryResult) {

### UniApp 中使用 Web Worker 的实现方式及兼容性 #### 什么是 Web Worker? Web Worker 是一种运行在后台线程中的 JavaScript 脚本,它不会阻塞主线程的执行。通过分离耗时的任务到独立的工作线程中,可以显著提升应用性能[^4]。 #### UniApp 对 Web Worker 的支持 UniApp 提供了对 Web Worker 的部分支持,允许开发者利用多线程技术优化复杂计算或长时间运行的操作。然而需要注意的是,在不同平台上的表现可能存在差异。例如,H5 平台完全支持标准 Web Worker API;而在 App 端,则依赖于底层环境的支持情况[^5]。 以下是具体的实现方法: --- #### 示例代码:创建并使用 Web Worker 假设我们需要在一个单独的线程中完成一些复杂的数学运算操作,可以通过如下方式进行设置: ##### 主文件 (main.js) ```javascript if (typeof window !== 'undefined' && typeof Worker !== 'undefined') { const worker = new Worker('./worker.js'); // 引入工作线程脚本 worker.postMessage({ data: [1, 2, 3, 4, 5], action: 'sum' }); // 向子线程发送消息 worker.onmessage = function(e) { // 接收来自子线程的消息 console.log('Received result:', e.data); }; } else { console.error('当前环境下不支持 Web Worker'); } ``` ##### 工作线程文件 (worker.js) ```javascript self.onmessage = function(event) { let sum = event.data.action === 'sum' ? event.data.data.reduce((acc, val) => acc + val, 0) : null; self.postMessage(sum); // 将结果返回给主进程 }; ``` 注意:上述 `worker.js` 文件路径需确保能够被正确加载。如果是在 NPM 构建模式下开发,可能还需要额外配置 Webpack 来解析这些资源[^6]。 --- #### 兼容性分析 | **平台** | **支持程度** | |----------------|------------------------------------------------------------------------------| | H5 | 完全支持标准 Web Worker API | | 微信小程序 | 不直接支持 Web Worker ,但可通过插件形式模拟类似的异步逻辑 | | 支付宝小程序 | 类似微信小程序,无内置支持 | | App | 需要借助 uni-app 插件机制引入原生模块来扩展功能 | 对于无法原生支持 Web Worker 的场景(如小程序),建议采用以下替代方案之一: - 利用 Promise 或 async/await 结构拆分大任务; - 借助第三方工具库或者框架提供的虚拟化线程池解决方案[^7]。 --- #### 组件库与构建工具链集成注意事项 当项目规模较大时,推荐结合成熟的组件库以及自定义 Webpack 加载器简化流程。比如参考开源仓库 [@campus/c-card](https://github.com/WindrunnerMax/Campus),其中包含了关于如何编写 Webpack loader 和 plugin 的实践案例[^8]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值