Autodesk Forge Viewer в безголовом Chrome, CONTEXT_LOST_WEBGL - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь использовать безголовый Chrome (v66 на Win10, используя C #), чтобы сделать серию скриншотов из 3D-модели в forge autodesk viewer.

Проблема, с которой я сталкиваюсь, заключается в том, чтоМодель загружена. Я устанавливаю камеру в первое положение, делаю снимок экрана и затем пытаюсь установить камеру в следующее положение для следующего снимка экрана.Как только я пытаюсь это сделать (устанавливая положение камеры позже, чем при начальной загрузке), контекст webgl теряется.

У меня слишком мало знаний о WebGL / swiftshaders / etc, но что я расстраиваю, так это то, что когдаЯ устанавливаю камеру сразу после загрузки, она работает.(То есть, обходной путь состоит в том, чтобы порождать отдельный сеанс без головы для каждого вида камеры, но поскольку загрузка геометрии занимает 20 секунд или более, это не является предпочтительным)

Итак, это:

viewerApp.myCurrentViewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
function () {
    _viewer = viewerApp.myCurrentViewer;
    SetPerspective();
    SetCamera(cams[0].position, cams[0].target);//no probs here
    document.getElementById('MyViewerDiv').classList.add("geometry-loaded");       
 });

работает (камера установлена), но когда я выполняю функцию javascript позже (используя driver.ExecuteScript($"SetCamera({JsonConvert.SerializeObject(target.Value.Position)},{JsonConvert.SerializeObject(target.Value.Target)});"); или по таймауту на самой странице, она выдает WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost.

Когда я использую меньшую модель,все работает. Таким образом, я думаю, я понимаю, что причина в слишком большом потреблении памяти / обработки, но почему это вообще работает?

Глядя на монитор ресурсов, я не уверен, что потребление на самом деле проблематично, мой ноутбукдолжен быть способен (i7HQ7700, gtx1050, 16gbRam) Я попытался поиграться с некоторыми флагами GPU и GL Chrome, но безрезультатно. Я подозреваю, что GPU не используется (что я нашел некоторые сообщения, что он на самом деле может быть использован без головы...) Кроме того, средство просмотра forge выводит используемую память GPU, но это может быть просто сообщение журнала:

Starting ChromeDriver 2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb) on port 62676
Only local connections are allowed.
[0517/203535.902:ERROR:gpu_process_transport_factory.cc(1007)] Lost UI shared context.

DevTools listening on ws://127.0.0.1:12556/devtools/browser/5b66c120-dc64-4211-a207-ac97152ace9a
---some ssl future warnings---
[0517/203540.524:INFO:CONSOLE(2)] "THREE.WebGLRenderer", source: https://developer.api.autodesk.com/modelderivative/v2/viewers/three.min.js (2)
[0517/203543.074:INFO:CONSOLE(0)] "[.Offscreen-For-WebGL-00000237DECBB270]RENDER WARNING: there is no texture bound to the unit 0", source: http://localhost:8881/Content/Screenshot.html
[0517/203543.074:INFO:CONSOLE(0)] "[.Offscreen-For-WebGL-00000237DECBB270]RENDER WARNING: there is no texture bound to the unit 0", source: http://localhost:8881/Content/Screenshot.html
[0517/203552.280:INFO:CONSOLE(2)] "Total geometry size: 8.434013366699219 MB", source: https://developer.api.autodesk.com/modelderivative/v2/viewers/three.min.js (2)
[0517/203552.281:INFO:CONSOLE(2)] "Number of meshes: 2909", source: https://developer.api.autodesk.com/modelderivative/v2/viewers/three.min.js (2)
[0517/203552.281:INFO:CONSOLE(2)] "Num Meshes on GPU: 2908", source: https://developer.api.autodesk.com/modelderivative/v2/viewers/three.min.js (2)
[0517/203552.281:INFO:CONSOLE(2)] "Net GPU geom memory used: 7494392", source: https://developer.api.autodesk.com/modelderivative/v2/viewers/three.min.js (2)
[0517/203558.143:INFO:CONSOLE(0)] "WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost", source: http://localhost:8881/Content/Screenshot.html

Для завершения запустите ту же программуm без флага --headless, работает нормально, поэтому я думаю, что сам код в порядке.

Есть ли способ увеличить разрешенные ресурсы или еще что-нибудь?

(код для SetCamera)

        function SetCamera(newPos, newTarget) {
        nav = nav || viewerApp.myCurrentViewer.navigation;

        nav.setPosition(newPos);
        nav.setTarget(newTarget);
        nav.orientCameraUp();
    }

РЕДАКТИРОВАТЬ: контрольный пример (в настоящее время на тестовом веб-сайте, поэтому мы будем в какой-то момент удалить его)

РЕДАКТИРОВАТЬ 2: Результат для выполнения коданиже

NodeJS:

try {

    const URN = '';
    const Token = '';

    (async () => {
        const puppeteer = require('puppeteer');
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        console.log('browsing');

        await page.goto('https://rogerintelligentcloud.azurewebsites.net/test?urn=' + URN + '&token=' + Token);
        //replace autodeskURN and token to point to your model

        console.log("waiting");
        await page.mainFrame().waitForSelector(
            '.geometry-loaded', {
                timeout: 60000
            });

        await takescreen(page, 'nodetest1');
        await takescreen(page, 'nodetest2');
        await takescreen(page, 'nodetest3');
        await takescreen(page, 'nodetest4');
        await takescreen(page, 'nodetest5');
        await takescreen(page, 'nodetest6');    

        await page.evaluate("Test();");

        await takescreen(page, 'nodetest11');
        await takescreen(page, 'nodetest12');
        await takescreen(page, 'nodetest13');
        await takescreen(page, 'nodetest14');
        await takescreen(page, 'nodetest15');
        await takescreen(page, 'nodetest16');        

        await browser.close();
    })();
} catch (e) {
    console.log(e);
}

async function takescreen(page, name){
    await page.screenshot({
        path: 'c:\\temp\\'+name+'.png'
    });
}

Result of code

1 Ответ

0 голосов
/ 30 мая 2018

Я не видел никаких сообщений об ошибках, связанных с WebGL, с вашим фрагментом и моделью rme_advanced_sample_project.rvt, единственное, что я вижу, это page.delay is not defined.Вот мой тестовый код, измененный из фрагмента вашего кода и демонстрации Philippe forge-viewer-headless .Если я что-то пропустил, пожалуйста, укажите.Спасибо ~

import puppeteer from 'puppeteer'
import 'babel-polyfill'
import path from 'path'
import os from 'os';

try {
    const URN = 'YOUR_URN';
    const Token = 'YOUR_TOKEN';

    (async () => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(`https://rogerintelligentcloud.azurewebsites.net/test?urn=${ URN }&token=${ Token }`);
    //replace autodeskURN and token to point to your model

        await page.mainFrame().waitForSelector(
            '.geometry-loaded', {
                timeout: 60000
            });

        await delay(3000);

        await page.screenshot({
          path: path.join( os.tmpdir(), 'nodetest.png' )
        })


        await page.evaluate("Test();");
        await page.evaluate("Test();");
        await page.evaluate("Test();");
        await page.evaluate("Test();");

        await delay(3000);

        const targetTxt = await page.evaluate(() => document.querySelector('body > :last-child').innerText );
        console.log( targetTxt );

        const targetLen = await page.evaluate(() => document.querySelectorAll('body > div:not(.box)').length );
        console.log( targetLen );

        await page.screenshot({
          path: path.join( os.tmpdir(), 'nodetest2.png' )
        })

        await browser.close();
    })();

    function delay(timeout) {
        return new Promise((resolve) => {
            setTimeout(resolve, timeout);
        });
    }
}
catch (e) {
    console.log(e);
}

Снимок из моего теста:

  1. nodetest.png: enter image description here

  2. nodetest2.png: enter image description here

Редактировать 2:

Протестировано с вашим кодом, этоотлично работает на моей машине.enter image description here

Но есть одно изменение, чтобы правильно запустить ваш код в моем env.Я изменил определение вашей takescreen функции:

function takescreen(page, name){
    return page.screenshot({
        path: 'c:\\temp\\'+name+'.png'
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...