3. Дополненная реальность сегодня
u
Возможности ограничены мощностью
устройства
u
Высокое энергопотребление
u
30FPS – это минимум
u
Обилие и фрагментация платформ
u
Разнообразие языков программирования
4. Дополненная реальность в облаке
u
Работает везде
u
Потребляет меньше энергии
u
С++ для алгоритмов
u
Производительность и масштабируемость
u
Легкий обмен данными между устройствами
5. Так появился CloudCV –
Cloud Computer Vision Platform
Цель – Algorithms as a Service
6. Так появился CloudCV –
Cloud Computer Vision Platform
u
Инфраструктура для алгоритмов в облаке:
u
u
3Д реконструкция
u
Анализ видео (подсчет людей, выявление дефектов)
u
u
Дополненная реальность
Распознавание объектов и лиц
Node.js & C++
8. Почему C++ и Node.js
С++
Node.js
• Производительность
• Простая обработка запросов
• Библиотеки
• Поддержка С++
• Опыт разработки
• Легковесный
• Он прикольный J
9. Node.js и C++ такие разные
u
Компиляция vs Интерпретация
u
Строгая типизация vs Слабая типизация
u
Makefile vs nothing
u
И это работает!
10. Взаимодействие Node.js и С++
u
Node.js построен на базе движка V8
u
V8 написан на С++
u
Можно грабить корованы писать свои модули
u
?????
u
PROFIT!
12. Что тут неправильно?
#include
<node.h>
#include
<v8.h>
using
namespace
v8;
Handle<Value>
Method(const
Arguments&
args)
{
HandleScope
scope;
return
scope.Close(String::New("world"));
}
void
init(Handle<Object>
exports)
{
exports-‐>Set(String::NewSymbol("hello"),
FuncPonTemplate::New(Method)-‐>GetFuncPon());
}
NODE_MODULE(hello,
init)
13. Неблокирующие вычисления в С++
u
Node.js работает асинхронно
u
Блокирующие задачи - в отдельном потоке
u
Код С++ также должен следовать парадигме
14. Как правильно
1.
Вызов функции С++ из JavaScript
2.
Создание рабочего потока (libuv)
3.
WorkerFn – чистый С++ код (без V8)
4.
Возврат результата через callback
16. Передача данных между потоками
struct
Task
{
uv_work_t
request;
Persistent<FuncPon>
callback;
//
Custom
data
int32_t
theAnswer;
};
17. Передача данных между потоками
struct
Task
{
uv_work_t
request;
//
Хранит
внутреннее
состояние
задачи
Persistent<FuncPon>
callback;
//
Custom
data
int32_t
theAnswer;
};
18. Передача данных между потоками
struct
Task
{
uv_work_t
request;
//
Хранит
внутреннее
состояние
задачи
Persistent<FuncPon>
callback;
//
JavaScript
функция,
которая
будет
вызвана
по
//
Custom
data
int32_t
theAnswer;
};
выполнению
работы
21. О чем следует помнить
u
AsyncWork – блокирующая функция
u
Внутри AsyncWork запрещен доступ к V8
u
Task хранит аргументы и результат
u
Используйте TryCatch при обращениях к V8
22. Использование TryCatch
//
Trying
to
call
JavaScript
callback:
TryCatch
try_catch;
callback-‐>Call(Context::GetCurrent()-‐>Global(),
1,
/*
Number
of
arguments
of
callback
*/
res
/*
Array
of
arguments
*/);
if
(try_catch.HasCaught())
{
node::FatalExcepPon(try_catch);
}
24. Дополненная реальность в браузере
u
Используется только браузер и веб-камера
u
Вся «магия» происходит на сервере
u
Потоковая обработка в реальном времени
Захват кадра
(JavaScript)
Отправка
кадра
(node.js)
Визуализация
Обработка (С+
+)
Отправка
ответа
(node.js)