キャンバスの背景に画像を描いています。この画像は毎秒更新されますが、キャンバスはそれよりも頻繁に (0.5 秒ごと) 再描画する必要があります。私が遭遇しているように見える問題は、bgImg 変数から画像データを失ったように見えるため、キャンバスを更新するときに Safari がちらつくことです。Firefox は期待どおりに動作し、ちらつきは発生しません。
これを回避する方法についての手がかりはありますか?本当に明らかな何かが欠けていますか?
このコードをテストするには、以下のコード全体を html ファイルに貼り付けて、ブラウザでロードします。それがすべきことは次のとおりです。
- キャンバスを作成する
- 毎秒画像を読み込む
- 画像を背景として使用して、500 ミリ秒ごとにキャンバスを再描画します。
コードは次のとおりです。
<html>
<head>
<script type="text/javascript">
var bgImg = new Image();
var firstload = false;
var cv;
var ctx;
var updateBackground = function() {
bgImg.onload = function() {
firstload = true;
console.log("image loaded. Dimensions are " + bgImg.width + "x" + bgImg.height);
}
bgImg.src = "http://mopra-ops.atnf.csiro.au/TOAD/temp.php?" + Math.random() * 10000000;
setTimeout(updateBackground, 1000);
}
var initGraphics = function() {
cv = document.getElementById("canvas");
ctx = cv.getContext("2d");
cv.width = cv.clientWidth;
cv.height = cv.clientHeight;
cv.top = 0;
cv.left = 0;
}
var drawStuff = function() {
console.log("Draw called. firstload = " + firstload );
ctx.clearRect(0, 0, cv.width, cv.height);
if ( firstload == true) {
console.log("Drawing image. Dimensions are " + bgImg.width + "x" + bgImg.height);
try {
ctx.drawImage(bgImg, 0, 0);
} catch(err) {
console.log('Oops! Something bad happened: ' + err);
}
}
setTimeout(drawStuff, 500);
}
window.onload = function() {
initGraphics();
setTimeout(updateBackground, 1000);
setTimeout(drawStuff, 500);
}
</script>
<style>
body {
background: #000000;
font-family: Verdana, Arial, sans-serif;
font-size: 10px;
color: #cccccc;
}
.maindisplay {
position:absolute;
top: 3%;
left: 1%;
height: 96%;
width: 96%;
text-align: left;
border: 1px solid #cccccc;
}
</style>
</head>
<body>
<div id="myspan" style="width: 50%">
<canvas id="canvas" class="maindisplay"></canvas>
</div>
</body>
</html>