html5 canvas game - how to add retina support

巧了我就是萌 提交于 2019-12-04 02:21:40

You use devicePixelRatio to separate retina displays from normal displays

Your game logic coordinates (sprite positions, etc.) must operate independently from the screen coordinates which will be always 2x multiplied on the retina display.

Your graphics assets must have two versions. High resolution version and 50% scaled down normal version. When you operate on retina display, you draw 2x size canvas, resized with CSS and on this canvas use high resolution assets.

A new article has just been published on the topic over at html5rocks.com:

upsize your canvas width and height by devicePixelRatio / webkitBackingStorePixelRatio and then use CSS to scale it back down to the logical pixel size you want. Taking our above case where Chrome reports a webkitBackingStorePixelRatio of 1 and a devicePixelRatio of 2 we would scale the dimensions of the canvas by 2 / 1, i.e. multiply them by 2, then we would use CSS to scale it back down.

I know this is now an old post but thought I'd update it with the solution I implemented.


1: I used two sets of images:

  • one for non retina displays (sized 1:1),
  • and another set for retina which are twice as big.

depending on what device is being used depends on what set is loaded.


2: I then resize the canvas (this is the key to it)

NON RETINA

    var canvas = document.createElement('myCanvas');

    canvas.width = 320;
    canvas.height = 480;
    canvas.style.width = "320px";
    canvas.style.height = "480px";

RETINA

    var canvas = document.createElement('myCanvas');

    canvas.width = 640;
    canvas.height = 960;
    canvas.style.width = "320px";
    canvas.style.height = "480px";

Notice that canvas.style.width & height are the same regardless whether you're using retina or not.


And that's really all there is to it!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!