参与深圳VR/AR产业大会有感



  • 0_1449669027109_444.jpg
    0_1449669065533_445.jpg
    参与深圳VR/AR产业大会有感
    昨天刚来到深圳,深圳的天灰蒙蒙的,刚从上海过来的我苦笑道,深圳难道也有雾霾?不过当我的脚第一次踏上深圳这块土地,这些疑问就消失得无影无踪了。原来深圳也比较寒冷啊。虽然冬季15度的天气,对于常年生活在上海的我来说,是暖和许多,但一阵凉风让身穿薄西装的我,依然感到了一阵凉意。
    我已经没有精力来细细品味深圳的高楼大厦了。2015年这个时候,深圳的速度让来自上海的我也不得有一丝松懈。还好,深圳的地铁系统和上海的差不多,我很快就赶到了会展中心站。在那儿我要参与VRAR行业大会,这场大会很可能即将改变我们的生活。
    可能是来得比较早吧,我很快地入场了,选择了一个有利的地形,连行李都没有寄存的我望着大大的横幅、匆忙调试工作人员,期待着几个小时后的热闹场景。
    很快,会场中与会的精英已经坐满了整个会场,还有一些朋友们被迫站着观看会议。我差一点忘记了还有产品展示的环节,幸亏喝主办方带来的水,让我在去卫生间的途中,有幸体验到了两款VR产品。一款给人感觉沉稳大气,VR眼镜是特制的,展示的作品是茫茫的太阳系。另外一款产品则是我喜欢的二次元方向的,虽然做工采用了便宜讨好的卡板,设备也是来自于手机,但是二次元萌妹子的跳舞还是让我这个技术宅有一种想要沉浸其中的快感。
    回到了主会场,业内的前辈、大佬们开始逐个展示他们对VR、AR的独到见解。这是一个非常难得机会,我深深地感到古训“听君一席话,胜读十年书”的真正含义。VR和AR兴起于美国,兴盛于中国。目前在这个新兴的领域既有巨头的布局以及蓄势待发,也有诸多小微企业冲锋陷阵、勇攀高峰。这些兴盛的现象的大背景是:中国已经成为世界上第二大经济体,拥有最大的中产阶级。根据马斯洛需求模型,在满足低层次需求后,大家开始追逐较高层次的精神文化需求。就像一位专家在讨论会上所说的,大家追求的就一个字:“爽”。就这一个字,足以催生数千亿级别的市场,让在座的各位,包括我在内,热血沸腾,浮想联翩。
    但,一阵疯狂之后,我们不免会反思自己。VR、AR产业落地的问题,现在仍然是较难解决的一大问题。在硬件领域,VRAR设备技术要求高,导致成本降不下来,如果是C端的话,势必会将成本负担转嫁到消费者,这是消费者不愿意看到的。此外,设备供应链长,硬件标准不统一,这些都是企业家们颇为头疼的事儿。在软件领域,由于操作系统、SDK、中间件的不完善和碎片化现象,让开发者们望而却步,此外,VRAR开发具有较高的技术门槛,虽然Unity3D、Unreal能够提出一揽子解决方案,但过多地依赖这些游戏引擎厂商也会带来额外的商业风险。
    这些问题复杂且难以解决,让我几近绝望。假设世间有神的话,我恳求神,希望在中国这片大地上创造出专用VR和AR的操作系统,就像十年前Android一样;希望在软硬件方向大家都能够制定出相应的行业规范,让更多上下游的人员加入进来,这样VR和VR才能普及开来。
    想到这里,我手里握着自己的app产品,有点感到无助:我们这款名叫萌梦的app,虽然是自研的渲染引擎,虽然结合了语音识别,虽然结合了人工智能,虽然有了自己小生态的雏形,虽然是我两年以来的心血……但是离行业先进水平、离我热爱的AR,还相去甚远。怎么办呢?难道就不再走下去了吗?我拍了拍自己的脸,给自己鼓劲儿,我们还有希望:现在很多人都聚焦我们这个行业,源源不断的投资正在涌入这个能够迫切对人们生活带来变革的行业,许许多多献出数年宝贵青春的同行们一直在守望在这个行业……
    AR和VR,这个看似离我们非常遥远的未来产业,经过昨天大会的熏陶,让我好似拨开了迷雾,眼前愈发清晰。我相信,我们正处于黎明前短暂的黑暗,前景一定是光明的!



  • 先顶再看。筹够八个字。



  • 期待AR和VR真的进入人们的生活中。



  • 先瞅瞅,再看看,多想想



  • 着实牛逼,着实牛逼!



  • 支持AR与VR的发展。



  • 支持AR与VR的发展,加油!


Log in to reply
 

走马观花

最近的回复

  • Qt for MCUs

    搭建Qt for MCUs PC端开发环境。qt for mcus提供了一个完整的图形框架和工具包,包含了在MCUs上设计、开发和部署gui所需的一切。它允许您在裸机或实时操作系统上运行应用程序。

    先决条件

    开发主机环境支持仅限于Windows 10

    MSVC compiler v19.16 (Visual Studio 2017 15.9.9 or newer) x64

    CMake v3.13 or newer (you can install it using the Qt Online installer) x64

    使用Qt联机安装程序安装Qt for MCUs,该安装程序可通过Qt帐户下载

    安装Qt 5.14和Qt Creator 4.11 or higher

    安装链接

    › Qt: https://account.qt.io/downloads
    › CMake: https://cmake.org/download/
    › Python 2.7 32-bit: https://www.python.org/downloads/release/python-2716/
    › Arm GCC: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnutoolchain/gnu-rm/downloads
    › J-Link Software Pack: https://www.segger.com/downloads/jlink/JLink_Windows.exe
    › J-Link OpenSDA Firmware: https://www.segger.com/downloads/jlink/OpenSDA_MIMXRT1050-EVKHyperflash
    › STM32CubeProgrammer: https://www.st.com/en/development-tools/stm32cubeprog.html
    › STM32 ST-LINK Utility: https://www.st.com/en/development-tools/stsw-link004.html​​​​​​​

    Qt Creator设置 启用Qt Creator插件 选择“帮助>关于插件”,然后从列表中选择“MCU支持(实验性)”插件,重新启动Qt Creator以应用更改
    替代文字 为MCU创建Qt工具包

    选择工具>选项>设备>MCU

    选择Qt for MCUs-Desktop 32bpp作为目标

    如果尚未设置,请提供Qt for MCUs安装目录的路径。

    单击Apply应用。

    替代文字

    替代文字
    替代文字

    注意:

    编译器要选X64,Qt版本要选64bit,CMake Tool选x64

    打开恒温器项目demo

    选择文件>打开文件或项目。。。

    打开CMakefiles.txt文件来自thermo文件夹的文件。

    选择Qt作为MCU-桌面32bpp套件。

    单击“配置项目”以完成。

    替代文字

    问题

    开发主机环境支持仅限于Windows 10

    C++编译失败,文本大字体.pixelSize.

    文本类型无法正确呈现需要复杂文本布局的unicode序列。对复杂文本使用StaticText

    read more
  • H

    hi 有问题请教你,方便加个联系方式吗

    read more
  • boost.asio是一个很棒的网络库,这回儿我也开始系统地学习起来了。想想当年接触boost,也有八年多了。这次开始接触boost,觉得既熟悉又陌生。熟悉的是小写字母+下划线的命名方式、晦涩的模板、很慢的编译速度以及较大的程序体积,陌生的是asio的各种概念:io服务、接收器、套接字等等:我之前对网络编程不是非常了解。

    于是根据我的理解,参考《Boost.Asio C++网络编程》实现了这样一个简单的客户端和服务端通信的例子,例子非常简单,还不完善,但是幸运的是,可以在本机上互通了。
    下面是客户端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void writeHandler( const boost::system::error_code& ec, size_t bytesTransferred ) { if ( ec ) { cout << "Write data error, code: " << ec.value( ) << "transferred: " << bytesTransferred << endl; } else { cout << "OK! " << bytesTransferred << "bytes written. " << endl; } } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::socket sock( service ); ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; sock.connect( ep, ec ); if ( ec ) { cout << "Connect error, code: " << ec.value( ) << ", We will exit." << endl; return ec.value( ); } else { char buf[1024] = "Hello world!"; sock.async_write_some( buffer( buf ), writeHandler ); sock.close( ); } return service.run( ); }

    下面是服务端的代码:

    #include <iostream> #include <boost/asio.hpp> #include <boost/proto/detail/ignore_unused.hpp> using namespace std; using namespace boost::asio; using namespace boost::system; using namespace boost::proto::detail;// 提供ignore_unused方法 void acceptHandle( const boost::system::error_code& code ) { cout << "Accepted." << endl; } int main(int argc, char *argv[]) { ignore_unused( argc ); ignore_unused( argv ); io_service service; ip::tcp::endpoint ep( ip::address::from_string( "127.0.0.1" ), 6545 ); boost::system::error_code ec; ip::tcp::socket sock( service ); ip::tcp::acceptor acceptor( service, ep ); acceptor.async_accept( sock, acceptHandle ); if ( ec ) { cout << "There is an error in server. code: " << ec.value( ) << endl; } return service.run( );// 阻塞运行 }

    运行结果是这样的:
    78448d7b-b3ae-42fc-9e2e-4dd2fbdac2c2-image.png

    我对boost.asio中几个概念的理解:

    io_service,这就是一个类似事件循环的东西,它为io设备提供服务,故名。不管是套接字、文件还是串口设备,都要使用它的服务。它的run()函数相当于启动了一个事件循环。一旦有消息了,即进行响应。这也是实现异步编程的重要基础。 socket,这个类则是套接字,可以处理TCP或者是UDP请求。有同步以及异步的处理方式,也有带异常以及不带异常的处理方式。 acceptor,接收器,仅仅是服务端使用。相当于其余框架中的listener,作接收用的。

    比较浅显,如果有不当之处,敬请指正。

    read more
  • 843143141.jpg
    闲下来了,我又开始大规模地学习了。
    最近开始学习内存模型和无锁结构。因为这个是和操作系统密切相关的,懂得这些对于编写C++服务端应用程序
    有着非常好的帮助。之前我对内存模型以及无锁结构几乎没有什么了解,我就询问群里的大佬看看有没有可以参考的资料。
    大佬很高兴,并且推荐了我一本名为《Memory Model》的电子书。这本电子书虽然页数不多,但是从起源到发展,
    从源码到汇编,都给我们详细地介绍了。看了一遍,不是非常理解,但是依然尝试将自己的理解写下来,以便日后翻阅。
    首先因为多核处理器成为主流,多线程的程序已经非常常见,因此我们不可避免地要处理多线程程序的同步问题。
    然后,因为编译器默认都对源码进行了优化,在单核处理器中这通常不是什么问题,但是在多核处理器中,就会因为编译器
    对其进行了乱序处理而导致程序出现问题。由此深入地探讨内存模型。
    内存模型主要分为:
    载-载 顺序(load-load order)
    载-存 顺序(load-store order)
    存-载 顺序(store-load order)
    存-存 顺序(store-store order)
    依赖载入顺序(dependent loads order)

    通过内存栅栏(memory barrier)能够避免编译器对指令的乱序。Linux中有

    READ_ONCE( x, value ) WRITE_ONCE( x )

    避免这些读写被编译器乱序或者是优化掉。

    这里谈到volatile关键字。在另外一篇博客上说,volatile具有“易变性、不可优化性、顺序性”。简单说,由于
    被volatile声明的变量,指令须从内存读取,并且不能被编译器乱序以及优化。在Java(语言扩展)和MSVC(系统兼容)上,
    还附带了Accquire()和Release()语义,因此可部分用于多线程环境。但多数情况下,还是慎用volatile,
    因为不同架构的处理器,它的内存模型是千变万化的,不能一而概之。

    至于C++11,它提供了std::atomic<T>这个模板类,相当于提供了很多方式来实现不同内存模型的原子操作。
    它的load()和store()方法,第二个参数有以下几个选项:

    std::memory_order_relaxed std::memory_order_seq_cst std::memory_order_acq_rel std::memory_order_acquire std::memory_order_release std::memory_order_consume

    我们最常用来实现RCpc(Release Consistency、Processor Consistency)是使用

    std::memory_order_acquire std::memory_order_release

    这两对。

    作为例子,在实现自旋锁时使用std::atomic<T>是这样的:

    struct SpinLock2 { void lock( ) { for ( ; ; ) { while ( lock_.load( std::memory_order_relaxed ) ); if ( !lock_.exchange( true, std::memory_order_acquire ) ) break; } } void unlock( ) { lock_.store( false, std::memory_order_release ); } std::atomic<bool> lock_ = { false }; };

    read more

关注我们

微博
QQ群