Unievrsity of Games University of Games

How to speed up loading of Unity WebGL builds in Web Browser?

When using Unity 5.3 and above, your game assets will be compressed with gzip by default, and will have a gz prefix on the filenames. Some…

Photo by Chris Liverani / Unsplash

How to speed up loading of Unity WebGL builds in Web Browser?

When using Unity 5.3 and above, your game assets will be compressed with gzip by default, and will have a gz prefix on the filenames. Some of the WebGL game publishers will automatically set the Content-Encoding: gzip header so that the assets can be decompressed by the browser instead of JavaScript, leading to a much better loading experience.

However, if you are hosting your game externally, you will need to manually ensure that the assets are being served with the correct encoding. You will know if this is an issue because Unity will log messages like Decompressed Release/MyGame-WebGL.jsgz in 500ms in the console, the browser may appear to lock up during loading, and your progress bar will not work properly.

If you are using apache or a compatible server, you can use the .htaccess file that Unity generates for you to resolve this issue. However, if you are hosting on S3 or something similar, you can force the encoding by changing the filenames in your index.html to add the gz suffix, like so:

enable deflate in WebGL:  
sudo a2enmod userdir  
sudo a2enmod deflate  
sudo a2enmod rewrite  
sudo apache2ctl restartif "Unknown error" add crossdomain.xml.htaccess :"  
Options +FollowSymLinks  
RewriteEngine on  
   
RewriteCond %{HTTP:Accept-encoding} gzip  
RewriteCond %{REQUEST\_FILENAME}gz -f  
RewriteRule ^(.\*)\\.js$ $1\\.jsgz \[L\]  
   
RewriteCond %{HTTP:Accept-encoding} gzip  
RewriteCond %{REQUEST\_FILENAME}gz -f  
RewriteRule ^(.\*)\\.data$ $1\\.datagz \[L\]  
   
RewriteCond %{HTTP:Accept-encoding} gzip  
RewriteCond %{REQUEST\_FILENAME}gz -f  
RewriteRule ^(.\*)\\.mem$ $1\\.memgz \[L\]  
   
RewriteCond %{HTTP:Accept-encoding} gzip  
RewriteCond %{REQUEST\_FILENAME}gz -f  
RewriteRule ^(.\*)\\.unity3d$ $1\\.unity3dgz \[L\]  
   
AddEncoding gzip .jsgz  
AddEncoding gzip .datagz  
AddEncoding gzip .memgz  
AddEncoding gzip .unity3dgz  
"Add gz in index.html:  
var Module = {  
TOTAL\_MEMORY: 536870912,  
errorhandler: null,  
compatibilitycheck: null,  
dataUrl: "Release/20160222\_1.datagz",  
codeUrl: "Release/20160222\_1.jsgz",  
memUrl: "Release/20160222\_1.memgz",  
};

You will also need to ensure that S3 is set up to send the Content-Encoding: gzip header for each of the files that end in gz, or you will get decompression errors upon loading the game. You can use the browser network inspector to ensure the header is being sent properly by the server.

Other Resources

  • Read the Unity Blog and documentation religiously — such a vast amount of knowledge is available there. Many of the concepts in this article are discussed in much more technical detail here, for example.
  • Check out this Kongregate Developer Blog entry focused on managing in-game memory for Unity WebGL projects.
  • Read the Unity Manual about WebGL performance considerations

To help us create more free stuff, consider leaving a donation through Patreon where you can vote for the next asset pack and get access to future packs & articles earlier. Sharing knowledge is our passion. Unfortunately, keeping a team of professionals costs a lot that’s why we are constantly taking on new opportunities.

​We’ll be publishing any news on the following outlets:

Thanks for reading!

Leszek W. Król

Leszek W. Król

On a daily basis, I accompany companies and institutions in designing strategies and developing new products and services.