当前位置:首页 > 技术分析 > 正文内容

看似不起眼的一个习惯,竟能直接让你的游戏卡死

ruisui883周前 (04-07)技术分析19

13. 阻塞与非阻塞

13. 阻塞与非阻塞

首先,我们这边所说的阻塞非阻塞指的是加载文件。在很多的api中,我们可以看到一个接口经常有2种形态:

readFile

readFileSync

或者unity里面加载资源的接口:

Resource.Load

Resource.LoadSync

我们用js写文件的时候,很容易建立一个认知。当我们想对文件进行有序的操作的时候,我们用阻塞的方式。如果我们不需要任何的时序或者只使用到很少的时序,那么我们就可以用非阻塞的形式。

在游戏里面,经常会被建议不要用阻塞的方式。因为阻塞行为一旦发生,它是可能卡住整个界面的,使得游戏无法做出任何的响应。那我们是不是就不用阻塞了?我们先来看一看阻塞的优点。阻塞相对非阻塞而言,它的速度是比较快的。它可以在一些场景中进行应用:

在游戏的启动加载过程中,为了缩短玩家的等待时间。我们大量使用阻塞,只在单个文件加载后更新一下界面,接着就继续阻塞加载了。

在大部分游戏引擎里面,加载界面资源我们常用的是非阻塞。但是当我们加载界面资源后,如果实例化这个对象一定是耗时的或者说卡的。那么这个时候我们一般会先把界面的外框加载出来,再加载里面的内容,这个时候我们就可以换用阻塞了。当存在某些逻辑是不得不卡住的或者说耗时严重的,而且也无法通过线程或者其他方式优化的时候,我们先阻塞加载静态的背景,再进行一系列耗时的操作,包含阻塞加载资源,对象的实例化等。

这2个案例告诉了我们它的应用场景,在效率至上的地方,以及在耗时已经超出的地方。因为如果一定要卡(耗时),那么就在一瞬间铺个静态背景卡个够。这边还可以举个例子就是场景切换后,需要加载大量的玩家对象。这些对象在加载的时候因为数量,也因为其他不确定的因素,可能是会导致CPU的高峰。那么我们就在切换场景的加载页面出现之前,先同步把它们都加载完。这样,进入场景后就不会再遇到它们导致的卡顿。

对于非阻塞,通常伴随着事件完成的回调处理。比如说加载一个文件,我们会在加载完成后回调到我们注册的函数。对于代码而言,阻塞的代码写起来是比较舒服的,不用各种回调嵌套,因为回调一旦多了,会引发“回调地域”的灾难,这在js里面有专门的介绍。我们可以通过协程来解决,模拟一个同步的写法。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3337.html

标签: readfilesync
分享给朋友:

“看似不起眼的一个习惯,竟能直接让你的游戏卡死” 的相关文章

vue3中父子传值、defineProps用法、defineEmits用法

Vue3中新增了一个 script setup 语法糖模式,可以在单文件组件中更简洁地编写组件逻辑。使用 script setup 语法后,props、data、computed、methods 等选项不再需要独立定义,而是可以直接在 setup 函数中声明,代码结构更加清晰,并且可以更方便地使用响...

vue:组件中之间的传值

一、父子组件之间的传值----props/$emit1、父组件向子组件传值--props2.子组件想父组件传值-this.$emit('select',item)二、父组件向下(深层)子组件传值----provide/injectprovide:Object | () => O...

vue中如何在自定义组件上使用v-model和.sync

自定义事件tips推荐始终使用 kebab-case 的事件名。(v-on会将事件名自动转换为小写,避免匹配不到)changeData ×change-data √自定义组件的v-model用法:父组件定义数据源(不需要定义修改数据的方法),在子组件标签上通过v-model="data...

壹啦罐罐 Android 手机里的 Xposed 都装了啥

这是少数派推出的系列专题,叫做「我的手机里都装了啥」。这个系列将邀请到不同的玩家,从他们各自的角度介绍手机中最爱的或是日常使用最频繁的 App。文章将以「每周一篇」的频率更新,内容范围会包括 iOS、Android 在内的各种平台和 App。本期继续歪楼,由少数派撰稿作者@壹啦罐罐介绍他正在使用的...

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出 JavaScript 中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可以像这样得到数组的长度:const arr = [1, 2, 3]; console.log(a...

基于Spring Cloud+VUE的多租户小程序商城源码「快速二开可商用」

一、系统介绍JooLun平台是一个专注微信快速二开系统研发的平台,采用Java语言开发,使用的是最新微服务前后端分离技术,目前有公众号和小程序商城两个版本,有公众号后台管理、小程序商城。基于Spring Cloud微服务+VUE实现的核心框架多租户小程序商城源码,核心框架采用SpringBoot2+...