¿El método DrawImage de Canvas es verdaderamente sincrónico?

Estoy implementando un sistema de menu para mi juego utilizando canvas (por ciertos motivos de performance no puedo usar HTML / CSS para hacer los menus). Tengo el menu configurado usando JSON y el menu. Los objects componentes se crean con sus respectivas properties (x, y, ancho, alto, imagePath, etc.). Tengo un cargador de menu que luego itera sobre los objects componentes y llama al método draw de componentObjects (todas las imágenes esperan que su evento onload se active primero, por supuesto).

De todos modos, espero que mis imágenes se dibujen en el order en que se llama su método de sorteo para que se superpongan en el order correcto. La mayoría de las veces este comportamiento es correcto pero ocasionalmente dibujarán en el order incorrecto.

Mi pregunta es: ¿puedo confiar en Canvas para dibujar imágenes en el order en que se llama drawMethod para esas imágenes? Digamos que tengo la image A, que es, por ejemplo, 10 MB y la image B, que es de 10 kb. Si llamo dibuje la image A y luego dibujo la image B, ¿hay alguna posibilidad de que la image B se cargue primero porque es una image más pequeña?

Intentaba ser inteligente con mi código (tenía componentes nesteds dentro de mis objects componentes y recurrentemente a los methods de dibujar) así que es posible que existan algunas condiciones de carrera en mi código, solo quiero confirmar que el comportamiento anterior es correcto. Si agrego lógica para forzar a mis objects a esperar hasta que se establezca un indicador de listo , parece que funciona. Pero, lamentablemente, eso ralentiza el time de carga de mis menus.

Para poner una respuesta formal a esta publicación:

Al final, simplifiqué mi solución para usar un object menuLoader que tiene una matriz de hashes para cada image que se dibujará (que contiene x, y, imagePath, bandera list). Llamo a un método de creación de componentes que construye estos valores hash con el indicador listo listo en falso de manera pnetworkingeterminada. Configuré un evento onload para cada image para establecer su respectiva bandera de list en verdadero.

Después de crear los componentes que terminaron de ejecutarse, utilizo setInterval para girar hasta que todos los indicadores se hayan establecido en verdadero. Una vez que se cumple esta condición, vuelvo a iterar a través de mi matriz de hashes y llamo al método de dibujo para cada image.

Hombre, me he enfrentado al mismo problema y me han visto afectado por ello durante unos tres días. Y pensé en algo interrelacionado. Por favor mire este fragment de código y bríndenme sus detalles.

 final ResourceManager rm = new ResourceManager(1000, 1000); rm.loadImgResource(LandCardResources.INSTANCE.getMeadow(), "meadow", 0, 0); rm.loadImgResource(LandCardResources.INSTANCE.getHellHorseKnight(), "knight", 150, 150); 

El administrador de resources es un object que representa BackBufferCanvas que contiene todas las imágenes en su context (como sprite de image simple). Constructor también es responsable de agregar este Backbuffer a RootPanel, por lo que podemos determinar que todo funcionó como esperábamos. Después de eso, estoy agregando mi canvas principal a la raíz tratando de dibujarlo desde backBufferCanvas usando una instancia de ResourceManager que funciona perfectamente.

 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); 

Y nunca funciona. Pero si, por ejemplo, agrego Button a rootPanel con handler responsable de rm.drawImage ….. Funcionará perfectamente onclick en este button. Realmente no puedo entender por qué esto está sucediendo ya que backBufferCanvas está conectado antes de mainCanvas, por lo que la lógica debe estar retrasada.