Итак, я прочитал немного о распределении объектов.Не стесняйтесь ошибаться в этом, но если у вас есть выделенный объект и на него есть ссылка, он не должен быть удален, верно?
Цель: допустим, я использовал канал сообщений, чтобы получить список, и каждый элемент в списке представлял собой элемент, описанный ниже, с использованием метода window.open, а затем отправлял сообщение 24 раза в секунду:
{
texture:{index:randomNumber,width:randomNumber,height:randomNumber},
transform: {x:randomNumber,y:randomNumber,rotation:randomNumber0-360}
}
Как в основном потоке, так и в дочернем потоке есть список этих объектов, и оба они в настоящее время очищаются после того, как они сделаны с использованием объектов внутри.Есть ли способ, которым я могу создать пул объектов, чтобы убедиться, что сборка мусора не происходит?- Заявление об окончании цели
это код внутри окна, которое я сейчас использую для визуализации моих объектов
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>game</title>
</head>
<body>
<div id= "wrapper" class ="wrapper">
<canvas id="canvas" width="3840" height="2160" draggable="true"></canvas>
</div>
<style>
.wrapper {
position: relative;
width: auto;
height: 100%;
}
.wrapper canvas {
position: absolute;
padding-left: 0;
padding-right: 0;
margin-left: auto;
margin-right: auto;
display: block;
width: 100%;
min-width: 1000px;
height: auto;
}
.GUI{
top: -315px;
left: -302px;
position: absolute;
width: 300px;
height: 300px;
background-color: cadetblue;
opacity: .5;
word-wrap: break-word;
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
</style>
<div id = GUI class = "GUI"></div>
<script src="../HTML-Thread/ImageResource.js"></script>
<script src="../HTML-Thread/background.js"></script>
<script src="../myapi/utils.js"></script>
<script src ="../HTML-Thread/GUI/GUI-functionBox.js"></script>
<script src="../HTML-Thread/GUI/GUI-Control.js"></script>
<script src=" ../HTML-Thread/GUI/PlanetUiCode.js"></script>
<script src="../HTML-Thread/GUI/GameObjectUiCode.js"></script>
<script src = "../myapi/indexedDB/IDBfunctions.js"></script>
<script src ="../HTML-Thread/mainThreadFunctions.js"></script>
<script src="../myapi/engine/BaseVCharacter.js"></script>
<script src="../myapi/engine/BaseGameObject.js"></script>
<script src="../myapi/indexedDB/IDBfunctions.js"></script>
<script src="../myapi/indexedDB/IDBMain.js"></script>
<script>
window.document.getElementById("canvas").getContext("2d").canvas.addEventListener("click",onClick);
window.onbeforeunload = function(){
window.opener.postMessage({Procedure:"onClose",guiOwnerCode:window.guiOwner.guiOwnerCode})
};
//TODO: Create canvas/canvases here instead of third.html
window.imageArray = [];
var cameraFocus = {x:0,y:0,rotation:0}
,mapWidth = 10000000,mapHeight = 10000000,
imageIndexArray = [], myImageResource = new ImageResource(),objectPool = [];
myImageResource.loadAllTextures(function () {onImagesLoaded();});
function onImagesLoaded () {
//when images are loaded build a conversion for images via 'buildImageArray', send message to main js thread to start
buildImageArray(myImageResource,window.imageArray,imageIndexArray);
let canvasCtx = document.getElementById("canvas").getContext("2d");
window.renderScale = .09;
window.guiOwner = {transform:{x:0,y:0,rotation:0}};
window.onmessage = function (event) {
let message = event.data;
if(message.Procedure ==="guiUserUpdate"){
window.guiOwner = Object.assign(window.guiOwner,message.guiOwner);
cameraFocus.x = window.guiOwner.transform.x;
cameraFocus.y = window.guiOwner.transform.y;
}else if(message.Procedure ==="sendObjectsToRender"){
//for auto scaling the canvas
canvasCtx.canvas.width=window.innerWidth;
canvasCtx.canvas.height=window.innerHeight;
// Clear the whole context and reset the canvas
canvasCtx.clearRect(0, 0, ( canvasCtx.canvas.width )/ 2, ( canvasCtx.canvas.height) / 2);
canvasCtx.setTransform(1, 0, 0, 1, 0, 0);
// Scroll the canvas so that the middle of the screen is the coordinate origin
canvasCtx.translate(( canvasCtx.canvas.width )/ 2 , ( canvasCtx.canvas.height) / 2 );
// And scroll it so that the camera focus is in the middle
canvasCtx.translate(-cameraFocus.x * window.renderScale,
cameraFocus.y * window.renderScale);
drawBackground(canvasCtx,window.renderScale,window.imageArray,window.imageIndexArray,window.mapWidth,window.mapHeight);
let array = message.gameObjects;
for (let i =0;i<array.length;i++){
objectPool[i]= array[i];
renderGameObject(objectPool[i])
}
// For Click evt TODO: Make sep-function for these
}else if(message.Procedure ==="buildGameObjectClickBox"){
let gameObject = message.gameObject;
if(clickBox.objectType!== undefined){
GUI.removeChild(clickBox.objectType);
}
buildGameObjectClickBox(clickBox,window.guiOwner,gameObject,0,500,500,500)
}else if(message.Procedure==="buildPlanetClickBox"){
let gameObject = message.gameObject;
if(clickBox.planettype!== undefined){
GUI.removeChild(clickBox.planettype);
}
buildPlanetClickBox(clickBox,window.guiOwner,gameObject,500,1200,500,500)
}
};
function renderGameObject(gameObject) {
let pIndex = gameObject.texture.index;
let img = imageIndexArray[pIndex];
let x = gameObject.transform.x * window.renderScale;
let y = -(gameObject.transform.y * window.renderScale);
let rotation = Math.radians(gameObject.transform.rotation);
let width = gameObject.transform.width;
width *= window.renderScale;
let height = gameObject.texture.height;
height *= window.renderScale;
// Render the gameObject
canvasCtx.translate(x, y);
canvasCtx.rotate(rotation);
canvasCtx.drawImage(img, 0, 0, width / window.renderScale, height / window.renderScale, // Make sure the image is not cropped
-width/2 , // X
-height/2 , // Y
width, height); // width and height
canvasCtx.rotate(-rotation);
canvasCtx.translate(-x, -y);
// Render all of its children
for (let childKey in gameObject.fixedGameObjects) {
renderGameObject(gameObject.fixedGameObjects[childKey]);
}
}
}
</script>
</body>
</html>
Проблема: чтобы быть полностью понятной, проблема, с которой я столкнулсяИмеется в том, что сборщик мусора работает сверхурочно и удаляет все объекты, тогда как я хочу использовать их повторно.Это не почтовое сообщение, перекрывающее проблему с трубой, оно работает нормально, но каждые несколько секунд наш добрый олегарожник в течение 10 часов поднимается на вашу дорогу, чтобы убрать ваши дневные продукты.
Что я пробовал: IЯ пытался присоединить массив для ссылки на новый массив, который поступает глобально, но, возможно, мне придется ссылаться на отдельные объекты.Я попытался просмотреть все объекты в списке и добавить их в глобальный массив, а затем использовать этот глобальный массив для рендеринга объектов (чтобы показать, что они все еще используются), однако это все равно приводит к полному разочарованию.
Примечания: Если вы хотите сослаться на меня при использовании буфера массива, я дам вам знать, что мне нужно отправить эти объекты нескольким дочерним потокам.Если это возможно с использованием буфера массива, я хотел бы знать, как это делается (подробно), поскольку я и большинство пользователей сети не знаем, как использовать буферы массивов, поскольку предоставляемая информация ограничена и использует совершенно другую структуручем просто создание массива и его отправка.
код в основном потоке - это просто цикл for, который собирает объекты в диапазоне «основного объекта» / guiOwner и затем отправляет эти объекты в окно послецикл в массиве, а затем удаляет массив при отправке.