【发布时间】:2013-10-20 05:20:03
【问题描述】:
我正在使用画布为我的游戏实现菜单系统(出于某些性能原因,我不能使用 HTML/CSS 来制作菜单)。我使用 JSON 配置了菜单,并且 menuComponent 对象是使用它们各自的属性(x、y、宽度、高度、imagePath 等)创建的。我有一个菜单加载器,然后它遍历组件对象并调用组件对象的绘制方法(当然,所有图像都等待它们的 onload 事件首先触发)。
无论如何,我希望我的图像按照调用它们的绘制方法的顺序绘制,以便它们以正确的顺序重叠。大多数情况下,这种行为是正确的,但有时它们会以错误的顺序绘制。
我的问题是 - 我可以相信 Canvas 按照为这些图像调用 drawMethod 的顺序绘制图像吗?假设我有图像 A,例如 10MB,图像 B 是 10kb。如果我调用绘制图像 A 和 然后 绘制图像 B,那么图像 B 是否有可能首先加载,因为它是一个较小的图像?
我试图让我的代码变得聪明(在我的组件对象中嵌套组件并递归调用绘图方法)所以我的代码中可能存在一些竞争条件,我只是想确认上述行为是正确的。如果我添加逻辑来强制我的对象等到设置了 ready 标志,那么它似乎可以工作。但不幸的是,这会减慢我的菜单加载时间。
【问题讨论】:
-
drawImage 是,但加载图像不是(同步)。
-
简单的答案是:是的,Canvas 是同步的。 “
If I add logic to force my objects to wait until a ready flag is set then it seems to work.”我相信你刚刚在那里回答了你自己的问题。预加载所有图像,然后然后开始绘图。 -
我害怕这个。目前,所有对象都在旋转,直到它们准备好自己绘制,这意味着用户可以看到正在为更复杂的菜单绘制单独的菜单组件块。我认为按照您的建议,为 all 加载的图像设置一个全局 ready 标志会更好。加载页面可能会有半秒到一秒的延迟,但至少所有内容都会立即绘制。为了理智,我可能只是将逻辑提取到一个对象中。谢谢大家!
-
@user2872979 为避免用户看到部分加载,您可以隐藏所有页面并显示加载屏幕直到它显示
-
在菜单之间有一个加载屏幕并不是最好的用户体验:) 我认为半秒是可以忍受的。如果超过这个值,那么我会考虑优化我的代码。
标签: javascript html canvas drawimage