Preventing canvas freeze/unresponsive tab from too many VideoTextures

I prepared a playground example here which shows 10 videotextures playing simultaneously https://playground.babylonjs.com/#DYW6PM#3

The issue is that in our BJS app, we could conceivably have more than 10, in fact, assuming our end-users computers can handle it, the more the better.

The problem here is that when I increase (totalVideoMeshes) from 10 to say 100, the canvas/tab will freeze and go unresponsive, but I don’t see any errors in the console or anywhere else, and my only recourse is to close the tab and open a new one.

Depending on the scene sometimes the lock ups will happen at 50, or 60, or 70, but at some point, things lock up, and I don’t really know where to “draw the line” so to speak.

Maybe someone can shed some light on the underlying cause(s), and ideas for how to optimize or prevent/handle this situation? (maybe monitoring GPU resource usage, or some such mechanism?)

Not sure if this is helpful at all but I thought to check chrome://gpu and this is what I see under Log Messages.

[13643:13704:1108/100648.814047:ERROR:validation_errors.cc(106)] : Invalid message: VALIDATION_ERROR_UNEXPECTED_NULL_POINTER (null field 1)
[13643:13704:1108/100648.814114:ERROR:gpu_child_thread.cc(67)] : Mojo error in GPU process: Validation failed for gpu.mojom.GpuChannel [VALIDATION_ERROR_UNEXPECTED_NULL_POINTER (null field 1)]
[13643:13704:1108/100648.841626:ERROR:interface_endpoint_client.cc(665)] : Message 208270303 rejected by interface gpu.mojom.GpuChannel
[13643:13704:1108/100648.841721:ERROR:validation_errors.cc(106)] : Invalid message: VALIDATION_ERROR_UNEXPECTED_NULL_POINTER (null field 1)
[13643:13704:1108/100648.841757:ERROR:gpu_child_thread.cc(67)] : Mojo error in GPU process: Validation failed for gpu.mojom.GpuChannel [VALIDATION_ERROR_UNEXPECTED_NULL_POINTER (null field 1)]
[13643:13704:1108/100648.841804:ERROR:interface_endpoint_client.cc(665)] : Message 208270303 rejected by interface gpu.mojom.GpuChannel

Update: At face value I don’t think it’s a resource consumption thing… when I watch CPU/GPU and RAM/VRAM utilization, I don’t see anything that really jumps out at me, but maybe I’m missing something :man_shrugging:

Also, I updated my playground example so you can progressively add more textures to the scene, in this version you can hit the “Enter” key to add 10 at a time https://playground.babylonjs.com/#DYW6PM#5 until it eventually freezes

Hello there! I tried to get it to crash on my dev machine (with a Quadro P620), but even with some 750 textures, it was still running (slightly modified your example to add to random positions once the position array runs out: Babylon.js Playground (babylonjs.com)). Through I did notice eventually that quite a few of the VideoTextures stopped playing.

Maybe @sebavan who has been working on video or @Evgeni_Popov have some idea of what could be done?

I’m not sure much can be done…

The number of videos you can show at once will probably depend on the browser / the GPU and the memory available. I don’t see a way to know beforehand how many videos you will be able to display simultaneously.

@carolhmj thank you for that test, that just made me think to test it in windows (since I was originally running this in linux mint) and as it turns out, I can reach my 100 videotexture target just fine in windows…

so something is happening that’s unique to the environment, and I’ve confirmed/reproduced on another laptop I have (different model different GPU)

some observations:

  1. windows chrome/brave everything works fine
  2. linux chrome/brave tab freezes/becomes unresponsive
  3. linux firefox tab never freezes but some of the video textures do

I don’t know if any of the above provides hints?

Here’s a video of what’s happening bjs videotexture freezing - YouTube

Hmmmm it might have to do with linux GPU drivers? Unfortunately the support is not quite as good there as in windows :confused:

Ok, I suppose I can do an OS check and throttle based on that.

Maybe one day it’ll just fix itself with new drivers or something.