Запретить сборку мусора в другом окне (из сообщения) - PullRequest
0 голосов
/ 24 сентября 2018

Итак, я прочитал немного о распределении объектов.Не стесняйтесь ошибаться в этом, но если у вас есть выделенный объект и на него есть ссылка, он не должен быть удален, верно?

Цель: допустим, я использовал канал сообщений, чтобы получить список, и каждый элемент в списке представлял собой элемент, описанный ниже, с использованием метода 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 и затем отправляет эти объекты в окно послецикл в массиве, а затем удаляет массив при отправке.

...