Html画布1600x1200屏幕撕裂

2024-03-04

我见过几个关于这个问题的问题,但它们都已经存在了三年多了,通常最后都会说还没有太多解决办法,所以我想知道是否有什么改变。

我目前正在开发一款游戏,该游戏使用每秒发生 60 次的间隔在画布上进行绘制。它在我的 iPhone 和 PC 上运行得很好,它们的显卡不太好,但我现在在配备英特尔 i3 显卡的 Thinkcentre 上尝试它,我注意到一些巨大的屏幕撕裂:http://s21.postimg.org/h6c42hic7/tear.jpg http://s21.postimg.org/h6c42hic7/tear.jpg- 作为静止图像有点难以注意到。

我只是想知道是否有任何方法可以减少这种情况,或者轻松启用垂直同步。如果没有,我可以在游戏的 Windows 8 应用程序端口中执行某些操作吗?


您使用 requestAnimationFrame (RAF) 吗? RAF 将进行垂直同步,但 setTimeout/setInterval 不会。

http://msdn.microsoft.com/library/windows/apps/hh920765 http://msdn.microsoft.com/library/windows/apps/hh920765

另外,由于 30fps 足以让用户看到流畅的运动,因此将 60fps 分成 2 个交替部分怎么样:

  • 一帧期间“计算/更新”(无绘图)

  • 然后在下一帧中完成所有绘图。

并且,了解 Chrome 的时间轴工具。这个很棒的小工具可以让您分析代码以发现代码在哪里花费了最多的时间。然后重构这部分代码以获得高性能。

[添加:有关 requestAnimationFrame 的更多有用细节]

画布不会直接在显示屏上绘制。相反,画布“渲染”到临时的屏幕外缓冲区。 “渲染”是指执行canvas命令在离屏缓冲区上进行绘制的过程。当下一次屏幕刷新发生时,该离屏缓冲区将快速绘制到实际显示屏幕。

当刷新期间在实际显示屏幕上绘制离屏缓冲区时,当离屏渲染过程仅部分完成时,就会发生撕裂。

setInterval 不会尝试协调渲染与屏幕刷新。所以,使用setInterval来控制动画帧偶尔会产生撕裂现象。

requestAnimationFrame (RAF) 尝试通过仅在屏幕刷新之间生成帧(称为垂直同步的过程)来修复撕裂问题。典型的显示屏每秒刷新大约 60 次(即每 16 毫秒)。

使用 requestAnimationFrame (RAF):

  • 如果当前帧在下一次刷新之前没有完全渲染,

  • RAF 会延迟当前帧的绘制,直到下一次屏幕刷新。

  • 这种延迟减少了撕裂。

所以对你来说,RAF 可能会帮助你解决撕裂问题,但它也会带来另一个问题。

您必须决定如何处理物理处理:

  • 将其保留在单独的进程中,例如 setInterval。
  • 将其移至 requestAnimationFrame 中。
  • 将其移至 web-workers(工作是在与 UI 线程分开的后台线程上完成的)。

将物理保持在单独的 setInterval 中。

这有点像乘坐两列火车,每列一条腿——非常困难!您必须确保物理的所有方面始终处于有效状态,因为您永远不知道 RAF 何时会读取物理进行渲染。您可能必须创建物理变量的“缓冲区”,以便它们始终处于有效状态。

将物理转移到 RAF:

如果您可以在刷新之间的 16 毫秒内计算物理和渲染,那么此解决方案是理想的。如果没有,您的帧可能会延迟到下一个刷新周期。结果是 30fps,这并不可怕,因为眼睛在 30fps 时仍然可以感知清晰的运动。最坏的情况是有时会出现延迟,有时不会,那么您的动画可能会显得不稳定。因此,这里的关键是在刷新周期之间尽可能均匀地分布计算。

将物理转移到网络工作者中

JavaScript 是单线程的。 UI 和计算都必须在这个单线程上运行。但是您可以使用在单独线程上运行物理的网络工作线程。这可以释放 UI 线程,让其专注于渲染和绘画。但您必须协调背景物理与前台 UI。

祝你游戏顺利:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Html画布1600x1200屏幕撕裂 的相关文章

随机推荐

  • 如何查看上次 git pull 的时间?

    I did a git pull但现在想知道那件事发生在什么时间 有没有办法检查拉动的时间 请注意 当我进行拉动时 没有发生任何变化 但也许 SSH 连接已被记录 我想在本地计算机而不是服务器上检查这一点 使用 Linux git 版本 2
  • 使用 webView 时是否可以将 HTML 表单中的数据获取到 android 中?

    我正在 HTML 中制作一个非常简单的表单 可以使用 webview 在 android 中查看 该 webview 使用文本框接收您的姓名 当您单击按钮时 它会将其显示到一个段落中 并且它是使用 html 和 javascript 制作的
  • 如何隐藏ide主窗口标题栏? (在 IntelliJ IDEA 中)

    Title bar is completely useless for me Info it shows i can see in navigation bar It only takes space Is it possible to h
  • 提取分隔符之间具有特定长度的整数

    给定一个字符串列表 例如 L 1759 1 83 0 email protected cdn cgi l email protection email protected cdn cgi l email protection 1094 em
  • 如何根据 MVCContrib 网格中的数据设置行的样式?

    我正在修补MVCContrib 网格 http mvccontrib codeplex com wikipage title Grid并陷入如何根据数据格式化网格中的一行数据的问题 例如 假设我们有一个产品网格 其中每个产品都有名称 价格和
  • 端点“/api-docs”不适用于自定义 GsonHttpMessageConverter

    我从 Springfox Swagger 迁移到 Springdoc OpenApi 我在有关 springdoc 的配置中添加了几行 springdoc pathsToMatch api api docs path api docs sw
  • 在外部文件中保存Python字典?

    我正在编写的代码本质上是一个超级基本的人工智能系统 基本上是 Cleverbot 的简单 Python 版本 作为代码的一部分 我有一个起始字典 其中有几个键 其中包含列表作为值 文件运行时 字典会被修改 创建键并将项目添加到关联列表中 所
  • 使用 jquery 和 cookie 切换和保留状态

    我有 2 个用 jquery 切换的 div 我希望它们在页面重新加载时具有相同的状态 因此使用 coockie 但无论如何它都会卡在其中一个 div 上 那是因为我似乎无法设置正确的 coockie 怎么了
  • 重命名 Rails 4 应用程序

    我创建了一个 Rails 4 应用程序 但名称已更改 我已经更新了文件夹名称 但我想知道我需要进入并更新哪些文件才能在整个站点中使用这个新名称 或者是否有 Rails 命令可以快速轻松地完成此操作 https github com mors
  • CSS 转换被 JavaScript 阻止

    我正在尝试在veryJavaScript 的密集期 其中构建并填充了一些相当重的 3d 数组 该加载栏需要保持为空 直到用户单击按钮 发生结冰现象是否我在用着 webkit transition 这个应用程序可以是 chrome 独有的 在
  • 关于 requireEnd Matcher 方法的澄清

    直接来自this http docs oracle com javase 7 docs api java util regex Matcher html requireEnd 28 29java API 公共布尔 requireEnd 如果
  • 如何合并字体?

    我有很多字体 OpenSans bold ttf OpenSans boldItalic ttf OpenSans extrabold ttf OpenSans italic ttf OpenSans light ttf 我将如何继续只创建
  • 在RecyclerView顶部设置进度条并在数据加载后删除

    我想要一个加载图标 显示在 RecyclerView 所在位置的顶部 并在数据加载完成后消失 它看起来像 谁能帮我吗 我的代码显示 RecyclerView 上方有一个 TextView 上面写着 正在加载 并在数据加载后消失 但 Recy
  • 在 cURL PHP 中发送请求时出现 401 未经授权的响应

    我正在尝试使用 GitLab API 解决我的 gitlab 项目问题 我已经尝试过 但它似乎不起作用
  • ms Access 从查询中的文件导入表

    有没有办法让 msAccess DB 查询从文件导入表 是的 只要数据被组织起来 您可以将 VBA 或宏与 TransferText 一起使用 也可以使用菜单或功能区中的 获取外部数据 这将指导您完成这些步骤 EDIT 您可以从 CSV 导
  • NSString 到 NSArray

    我想分割一个NSString进入一个NSArray 例如 给定 NSString myString ABCDEF 我想要一个NSArray like NSArray myArray A B C D E F 如何使用 Objective C
  • GWT为移动设备定制CellList多选模型

    我有一个使用 MultiSelectionModel 的应用程序 它工作得很好 但我需要我正在开发的网站才能在移动设备上工作 所以我无法使用键盘来帮助选择元素 因为它不支持 不存在 例如 在桌面上 我只需按住 ctrl 并单击我想要选择的所
  • SQLAlchemy 提交 pickle 类型

    我在 sqlalchemy 中提交对 pickle 类型 列表 的更改时遇到问题 提交后它将表现得好像什么也没发生一样 这是我尝试提交的功能 def commit move game id player move game game que
  • 管理包:PyCharm vs conda vs pip

    我是 Python 新手 最近在 Windows 10 上安装了 PyCharm 2016 3 我还使用 Anaconda 3 我对包管理不太了解 想更好地了解它 通常我只是使用conda update all但我注意到 通过检查本地 Py
  • Html画布1600x1200屏幕撕裂

    我见过几个关于这个问题的问题 但它们都已经存在了三年多了 通常最后都会说还没有太多解决办法 所以我想知道是否有什么改变 我目前正在开发一款游戏 该游戏使用每秒发生 60 次的间隔在画布上进行绘制 它在我的 iPhone 和 PC 上运行得很