Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是画布';drawImage方法是否真正同步?_Javascript_Html_Canvas_Drawimage - Fatal编程技术网

Javascript 是画布';drawImage方法是否真正同步?

Javascript 是画布';drawImage方法是否真正同步?,javascript,html,canvas,drawimage,Javascript,Html,Canvas,Drawimage,我正在使用canvas为我的游戏实现一个菜单系统(出于某些性能原因,我无法使用HTML/CSS制作菜单)。我使用JSON配置了菜单,menuComponent对象是用它们各自的属性(x、y、width、height、imagePath等)创建的。我有一个菜单加载器,然后它迭代组件对象并调用组件对象的draw方法(当然,所有图像都等待其onload事件首先触发) 无论如何,我希望我的图像按照调用其绘制方法的顺序绘制,以便它们以正确的顺序重叠。大多数情况下,这种行为是正确的,但偶尔会以错误的顺序绘制

我正在使用canvas为我的游戏实现一个菜单系统(出于某些性能原因,我无法使用HTML/CSS制作菜单)。我使用JSON配置了菜单,menuComponent对象是用它们各自的属性(x、y、width、height、imagePath等)创建的。我有一个菜单加载器,然后它迭代组件对象并调用组件对象的draw方法(当然,所有图像都等待其onload事件首先触发)

无论如何,我希望我的图像按照调用其绘制方法的顺序绘制,以便它们以正确的顺序重叠。大多数情况下,这种行为是正确的,但偶尔会以错误的顺序绘制

我的问题是-我能相信Canvas按照为这些图像调用drawMethod的顺序来绘制图像吗?假设我有一个图像A,例如10MB,图像B是10kb。如果我调用draw image A,然后再调用draw image B,那么是否有可能会因为图像较小而首先加载图像B


我试图巧妙地使用我的代码(在我的组件对象中有嵌套的组件,递归地调用draw方法),所以我的代码中可能存在一些竞争条件,我只想确认上述行为是正确的。如果我添加逻辑来强制对象等待,直到设置就绪标志,那么它似乎可以工作。但不幸的是,这会拖慢我的菜单加载时间。

对这篇文章给出一个正式的回答-

最后,我简化了我的解决方案,使用了一个menuLoader对象,该对象为每个要绘制的图像(包含x、y、imagePath、ready标志)提供了一个哈希数组。我调用一个createcomponents方法,该方法使用默认设置为false的ready标志构建这些散列。我为每个图像设置了一个onload事件,以将其各自的就绪标志设置为true


在createcomponents完成执行后,我使用setInterval旋转,直到所有标志都设置为true。一旦满足了这个条件,我就再次迭代我的哈希数组,并为每个图像调用draw方法。

伙计,我也遇到过同样的问题,并且已经被困了大约三天了。我想到了一件事。请仔细阅读这段代码片段,并向我提供您的想法

final ResourceManager rm = new ResourceManager(1000, 1000);
rm.loadImgResource(LandCardResources.INSTANCE.getMeadow(), "meadow", 0, 0);
rm.loadImgResource(LandCardResources.INSTANCE.getHellHorseKnight(), "knight", 150, 150);
资源管理器是一个表示BackBufferCanvas的对象,它在其上下文中保存所有图像(如简单图像精灵)。构造函数还负责将这个Backbuffer添加到RootPanel中,所以我们可以确定这一切都像我们预期的那样工作。之后,我将我的主画布添加到root,尝试使用完美工作的ResourceManager实例从backBufferCanvas绘制它

canvas.setWidth(500 + "px");
canvas.setHeight(500 + "px");
canvas.setCoordinateSpaceWidth(500);
canvas.setCoordinateSpaceHeight(500);
RootPanel.get().add(canvas);
rm.drawImageFromMetaDb(ctx, 0, 0, 100, 100, 0, 0, 100, 100);
rm.drawImageFromMetaDb(ctx, 150, 150, 100, 100, 50, 50, 100, 100);

而且它从来都不起作用。但如果我使用负责rm.drawImage的处理程序将按钮添加到根面板。。。。。单击此按钮时,它将完美工作。无法真正理解为什么会发生这种情况,因为backBufferCanvas是在mainCanvas之前连接的,所以逻辑必须已经延迟。

drawImage是,但加载图像不是(同步)。简单的回答是:是的,画布是同步的。“
如果我添加逻辑来强制我的对象等待就绪标志设置,那么它似乎可以工作。
”我相信您刚才回答了自己的问题。预装所有的图片,然后开始画画。我很害怕。目前,所有对象都只是旋转,直到它们准备好自己绘制,这意味着用户可以看到为更复杂的菜单绘制单独的菜单组件块。我认为,按照您的建议,为所有加载的图像设置一个全局就绪标志会更好。加载页面时可能会有半秒到一秒的延迟,但至少所有内容都会立即绘制。为了理智起见,我可能只是将逻辑提取到一个对象中。谢谢大家@用户2872979为了避免用户看到部分加载,您可以隐藏所有页面并显示加载屏幕,直到显示为止在菜单之间显示加载屏幕并不是最好的用户体验:)我认为半秒钟是可以忍受的。如果它超过了这一点,那么我将考虑优化我的代码。