Мой сайт позволяет пользователям записывать холст, а также рисовать на холсте одновременно. если пользователи начнут записывать холст, а также начнут рисовать на холсте рисунок на холсте, он начнет лагировать. Мне говорят, что многопоточные веб-работники должны иметь возможность решить эту проблему. однако я не уверен, как мне начать.Как реализовать многопоточность в моем JavaScript?
Может ли кто-нибудь помочь мне, пожалуйста? что я должен положить в postmessage/onmessage?
var recordUrl;
var audioUrl;
var audioStream;
var audiorecorder;
var elementToShare = document.getElementById("elementToShare");
var recorder = RecordRTC(elementToShare, {
type: 'canvas'
});
document.getElementById('start').onclick = function() {
/*
<script id="worker" type="javascript/worker">
<!--M KY -->
multithreading
var blob = new Blob([document.getElementById('worker').textContent]);
var worker = new Worker(window.webkitURL.revokeObjectURL(blob));
URL.revokeObjectURL(blob);
return worker;
worker.onmessage = function(event) {
}
worker.postnmessage = function(event) {
}
*/
$('#record').trigger('click');
if (!audioStream)
navigator.getUserMedia(audioConstraints, function(stream) {
if (window.IsChrome) stream = new window.MediaStream(stream.getAudioTracks());
audioStream = stream;
// "audio" is a default type
audiorecorder = window.RecordRTC(stream, {
type: 'audio',
bufferSize: typeof params.bufferSize == 'undefined' ? 16384 : params.bufferSize,
sampleRate: typeof params.sampleRate == 'undefined' ? 44100 : params.sampleRate,
leftChannel: params.leftChannel || false,
disableLogs: params.disableLogs || false
});
audiorecorder.startRecording();
}, function() {});
else {
audio.src = URL.createObjectURL(audioStream);
audio.muted = true;
audio.play();
if (audiorecorder) audiorecorder.startRecording();
}
window.isAudio = true;
recorder.startRecording();
document.getElementById('start').disabled = true;
setTimeout(function() {
document.getElementById('stop').disabled = false;
}, 1000);
//worker.terminate();
// }
};
холст код
<div id="cover">
<!-- <canvas id="fakecanvas" width="890" height="1267" style="z-index: 2; position: absolute;left:18%"></canvas> -->
<canvas id="canvas" width="890" height="1267" style="z-index: 1; border:1px solid black; position: absolute;"></canvas>
</div>
</div>
</section>
<section id="section-2">
<div style="width: 100%; height:5%; float:left;">
<a id="capture2" onclick="capFunction2();">
<input type="image" name="screenshot2" value="Save This Page" style="float: right; width:25px; height:25px;" src="img/camera.png">
</a>
<script>
function downloadCanvas2(link, canvasId, filename) {
html2canvas([document.getElementById(canvasId)], {
onrendered: function(cvs2) {
//var canvasData = cvs2.toDataURL('image/png');
var link = document.createElement("a");
link.href = cvs2.toDataURL();
link.download = filename;
link.click();
}
});
}
document.getElementById('capture2').addEventListener('click', function() {
var currentTime2 = new Date().YYYYMMDDHHMMSS();
downloadCanvas2(this, 'viewer2', currentTime2 + '.jpg');
}, false);
</script>
Web Workers не может получить доступ к DOM, что может быть ограничением для использования. Тем не менее вы можете использовать его для обработки необработанных данных в фоновом режиме для вашего рекордера, хотя я не знаю, как это работает. – Ali
спасибо .. кто-нибудь еще может помочь мне в осуществлении веб-работника по вышеуказанному коду? –
WebWorkers будет полезен только для выполнения огромных вычислений, например, в контексте imageData. Если это то, что вы делаете, отправьте imagedata своему веб-сайту. Здесь у нас нет ничего о вашем коде на холсте, за исключением того, что вы, похоже, пытаетесь записать его благодаря RecordRTC. Эта запись не должна создавать задержки, которые вы испытываете. – Kaiido