Я пытаюсь использовать безголовый 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'
});
}