আমি প্রোগ্রামটিমেটিকভাবে সীমাটি বের করার চেষ্টা করেছি: ক্যানভাসের আকার 35000 থেকে শুরু করে, বৈধ আকার না পাওয়া পর্যন্ত 100 দ্বারা নেমে আসা। প্রতিটি পদক্ষেপে ডান-নীচে পিক্সেল লিখুন এবং তারপরে এটি পড়ুন। এটি কাজ করে - সাবধানতার সাথে।
গতি গ্রহণযোগ্য হয় প্রস্থ বা উচ্চতা কিছু নিম্ন মান (যেমন 10-200।) এই ভাবে সেট করা হয় যদি: get_max_canvas_size('height', 20)
।
তবে যদি প্রস্থ বা উচ্চতা ছাড়াই কল করা হয় get_max_canvas_size()
তবে তৈরি ক্যানভাসটি এত বড় যে সিংগল পিক্সেলের রঙ পড়া খুব ধীর এবং আই এর মধ্যে মারাত্মক স্তব্ধ হয়ে যায়।
এটির মতো পরীক্ষা যদি পিক্সেল মান না পড়ে কোনওভাবে করা যায়, গতিটি গ্রহণযোগ্য হবে।
অবশ্যই সর্বাধিক আকার সনাক্ত করার সবচেয়ে সহজ উপায় হ'ল সর্বাধিক প্রস্থ এবং উচ্চতা সম্পর্কে জিজ্ঞাসা করার কিছু দেশীয় উপায়। তবে ক্যানভাসটি 'একটি জীবনযাত্রার মান', তাই এটি কোনও দিন আসছে may
http://jsfiddle.net/timo2012/tcg6363r/2/ (সচেতন হন! আপনার ব্রাউজারটি ঝুলতে পারে!)
if (!Date.now)
{
Date.now = function now()
{
return new Date().getTime();
};
}
var t0 = Date.now();
//var size = get_max_canvas_size('width', 200);
var size = get_max_canvas_size('height', 20);
//var size = get_max_canvas_size();
var t1 = Date.now();
var c = size.canvas;
delete size.canvas;
$('body').append('time: ' + (t1 - t0) + '<br>max size:' + JSON.stringify(size) + '<br>');
//$('body').append(c);
function get_max_canvas_size(h_or_w, _size)
{
var c = document.createElement('canvas');
if (h_or_w == 'height') h = _size;
else if (h_or_w == 'width') w = _size;
else if (h_or_w && h_or_w !== 'width' && h_or_w !== 'height' || !window.CanvasRenderingContext2D)
return {
width: null,
height: null
};
var w, h;
var size = 35000;
var cnt = 0;
if (h_or_w == 'height') w = size;
else if (h_or_w == 'width') h = size;
else
{
w = size;
h = size;
}
if (!valid(w, h))
for (; size > 10; size -= 100)
{
cnt++;
if (h_or_w == 'height') w = size;
else if (h_or_w == 'width') h = size;
else
{
w = size;
h = size;
}
if (valid(w, h)) break;
}
return {
width: w,
height: h,
iterations: cnt,
canvas: c
};
function valid(w, h)
{
var t0 = Date.now();
var color, p, ctx;
c.width = w;
c.height = h;
if (c && c.getContext)
ctx = c.getContext("2d");
if (ctx)
{
ctx.fillStyle = "#ff0000";
try
{
ctx.fillRect(w - 1, h - 1, 1, 1);
p = ctx.getImageData(w - 1, h - 1, 1, 1).data;
}
catch (err)
{
console.log('err');
}
if (p)
color = p[0] + '' + p[1] + '' + p[2];
}
var t1 = Date.now();
if (color == '25500')
{
console.log(w, h, true, t1 - t0);
return true;
}
console.log(w, h, false, t1 - t0);
return false;
}
}
tens OR hundreds of thousands
...