遵照 中兴 Vive 的 VR 游戏开发入门

正文  – 
起首了, 直接聊天

上学自 CSDN 高校公开课视频 http://edu.csdn.net/course/detail/2629

  以下都是祥和面试中遇见的宽泛的问题.如有不妥的地方就当见笑了. 哈哈

VR 硬件急速发展, 但内容却极为难得,作为开发者,我们到底该怎么样上手 VR
开发?具体到在不同的阳台上咋做?如何是好工具选型?延迟、晕眩、全景、人机交互、3D
动画、性能优化… 无一不是痛点. 又该咋样将 VR
技术更好地选取到游戏、应用开发以及内容创作中,了然什么是从业 VR
开发必备技能,又有什么是为「糟粕」亟需放任.

 图片 1

1. Vive VR 设计的提出 #

刷新率必须在 90 FPS 以上, 延时要小(交互延时, 运算延时, 显示延时)
打闹时长提出 30 分钟之内
镜头纹理不要太复杂
油画机不要乱动, 如模拟震荡,颠簸等, 能够有静物参考
尽心尽力真实, 像真的即可, 场景尽量简单(质量达到, 如小于场景),
避免本来就令人眩晕的场地
不用有移动争论, 尽量不要代用户发声
互相多元, 自然的互相, 行走,抓取,抛掷,躲避,爬行等等
交互指引十分重要
四人游戏更好玩, 如对阵,协作,对话等
对延时要求高, 暂时只好设计对网格要求低或局域游戏
虚拟印象和 IK 动画
先做原型, 验证验证再作证

1. 谈论你们服务器的架构吧.

2. 转战 VR 开发重点关注点 #

1.输入输出模式转变

输入输出更自然,直观, 容易让玩家错过音信, 不易判断玩家输入意图,
比如面向某物体时触发输出, 或者利用声音吸引用户注意力

头显(地点和通往)
控制器 / 手柄(明确的触及指令和职务,朝向消息)
手势(leap motion)
话音控制
自制工具(结合 optitrack)
触感(需要额外硬件配合)
… …

2.近似无 2D 界面

多方指点都是直接 3D 物体的来得, 比如某个物体分外,
类似高亮或虚化
也会附在万象的某个设备中, 以 2D 界面突显, 如 Raw Data 场景中的展现器
天空中飘来多少个字, 假使是漂浮的 2D 界面, 距离在 0.5 米以外较好,
也不要太远
以合适大小的书体附在手柄上也是科学的抉择
… …

3.数学, 物理

3D 和 2D 的移位, 朝向, 形变, 成像等总括, 重温线性代数知识
互相时的磕碰, 摩擦, 重力加速等效率
要像真正, 比如一个石块, 抛出去要有石块的手感, 要有生命周期,
避免物体飞远了直接存在

4.音乐音效
5.光景的采纳

因地制宜, 尽量在情景中的东西都是实惠的,
比如射击游戏中建筑都可以做掩护
出现的物体尽量都足以互相, 否则应当让玩家很容易区分出来
实体出现的相距相比较规律或一定, 比如都是 3 米或 5 米或 10 米相差,
否则眼睛容易疲倦
… …

6.互联网数据同步

多个人时更幽默, 弱联网游戏或者局域网游戏
弱联网即数据同步可以接受相比较长的延时, 即秒级其余延时, 像三国杀,
棋牌之类
局域网才适合实时对战,格斗类, 否则延时会严重影响沉浸感
能收看队友或对手, 涉及到岗位, 姿态同步以及 IK
… …

7.SteamVR API

Value Software openvr, 目的是硬件无关的通用 API
IVRSystem – Main interface for display, distortion, tracking,
controller, and event access.
IVRChaperone – Provides access to chaperone soft and hard bounds.
IVRCompositor – Allows an application to render 3D content through the
VR compositor
IVROverlay – Allows an application to render 2D content through the VR
Compositor
IVRRenderModels – Allows an application access to render models.
IVRScreenshots – Allows an application to request and submit
screenshots.

分析:

3. VR 开发资源 #

https://www.htcvive.com/cn/develop_portal/

End.

  假若这是率先个问题, 你可以走了. 可能各地点原因他不想要你.
或者其余意外已经有人更符合了. 

或者只是为着学一点东西.哈哈.一般面试游戏服务器开发的时候,这上头一定会问的.
关于游戏服务器架设,

亟需自己拼命积累是硬功夫.没有个100页doc难搞下去.且不同商家架构依旧很不一样.

只是为着回应面试,可以参考

   MMORPG服务器架设
 http://www.blogjava.net/landon/archive/2012/07/14/383092.html

   云风的
BLOG
 http://blog.codingnow.com/

足足可以简简单单扯一点, 对吧.平常这一个题目控制你最后资格,极其首要,
也是大家干程序的大势所趋要积累的.

 

2. 奇迹也会问,项目组正在开发中问题. 因集团而异.

比如怎么统筹跨服对阵的事体, 怎么设计一个棋牌的自由排序算法.

分析: 

  1)对于跨服对阵, 当初是个卡牌战斗类, 简单些. 依照老套路

    a) 每个服前10名, 特定时刻提请

    b) 遵照服务器id,玩家id 构建一个新服

    c) 参照老套路了, 有了新服对阵开端了…

  2) 对于棋牌的轻易算法, 基本都是一个傻大哈方法

//
//    简单棋牌随机算法
//  chess    : 存放棋牌的数组
//    len        : 棋牌处理长度
//
void chess_rand(char chess[], int len) {
    if (!chess || len < 2)
        return;

    for (int i = 0; i < len; ++i) {
        int j = rand() % len;
        if (i != j) {
            char c = chess[i];
            chess[i] = chess[j];
            chess[j] = c;
        }
    }
}

现实就是您做过就按照你做过的思路说, 没做过就依照自己思绪实诚一点说. 哈哈

 

3. 用过什么数据, 什么数据库引擎,优化什么的扯个淡.

分析:

  一般都是mysql, 问多少个简单的sql查询.然后问innodb 和 myisam 区别.

  MyISAM和InnoDB的区别 

  Mysql二种索引类型的区分及适用意况

骨子里现在开发自己觉着从C++ 软件开发层面. mysql没有mariadb优势大,
高级层面的优化交给数据库开发者. 业务层开发也就是索引等等.

到此地有时候会细问DB Server 设计. 缓存服务器设计等. 因公司工作不同,
说一说完全可以.

  高并发服务器的设计–缓存的设

  想在C++游戏服务器中落实热更,数据缓存要如何做呢?

也能扯个半天.

 

4. 这开首扯除了架构之外最根本的了, 多线程设计了.

分析:

  首先一般面试官会这样先导, 啊, 这线程和进程的异议是什么啊?这东西常问,
不管是应届菜鸟如故老油条.

因为面试官多数问自己原先被旁人问的, 可以参考天涯论坛上研讨, 基本都知情了,
可以来回扯了.

  线程和经过的分别是如何?

当然这只是个先导,有时候会让您现场写代码. 这就需要团结回顾 pthread POSIX
这套了. 当然遭受必须手写的话, 表达这个人也是尴尬你.

您也足以放心了. 前边愉快自然些. 他恐怕还没你通晓多.
详细的可以清楚下面知识.

  [转]至于多线程并发:每个开发人士都应询问的内容

实际上关于线程真实工作中, 实战经验为零. 最扯淡的是, 会说的不自然会写,
会写的难说. 依然推荐可以看看 云风 的 github,

地点多线程代码不少. 还有就是POSIX 多线程这本书特别经典.很给力.

享受个六个线程顺序循环执行的代码, 哈哈如下:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

// 测试线程数量
#define _INT_THS    (3)

struct threadarg {
    pthread_t tids[_INT_THS];
    sem_t sids[_INT_THS];
};

// 简单运行函数
static void * _run(void * arg) {
    int i = -1, j = -1;
    struct threadarg * ths = arg;
    pthread_t tid = pthread_self();
    pthread_detach(tid);

    // 确定这是第几个线程
    while (++i < _INT_THS)
        if (pthread_equal(tid, ths->tids[i]))
            break;

    // 循环个特定遍数就结束吧
    while (++j < _INT_THS) {
        // 第 i 个线程, 等待 第 i - 1 个线程, 输出 'A' + i 
        sem_wait(ths->sids + (i - 1 + _INT_THS) % _INT_THS);
        putchar('A' + i);
        // 第 i 个线程, 激活 第 i 个信号量
        sem_post(ths->sids + i);
    }

    return NULL;
}

//
// 写个测试线程信号量代码
// 开启 _INT_THS 个线程, 顺序打印数据 A->B->C->...->A->B->....
//
void test_pthread_sem(void) {
    // 开始初始化了
    int i, j;
    struct threadarg targ;

    // 先初始化信号量,后初始化线程
    for (i = 0; i < _INT_THS; ++i) {
        // 0 : 表示局部信号量当前可用; 0 : 当前信号量值为0
        if (sem_init(targ.sids + i, 0, 0) < 0)
            goto __for_exit;
    }

    // 开启线程
    for (j = 0; j < _INT_THS; ++j) {
        // 开启三个线程
        if (pthread_create(targ.tids + j, NULL, _run, &targ) < 0)
            goto __for_exit;
    }

    // 激活第一个线程, 输出 'A' 开头
    sem_post(targ.sids + _INT_THS - 1);

    // 中间等待一些时间吧
    getchar();

__for_exit:
    // 注意的是, 假如信号量释放了, 线程还在跑, 会异常
    for (j = 0; j < i; ++j)
        sem_destroy(targ.sids + j);
#ifdef __GNUC__
    exit(EXIT_SUCCESS);
#endif
}

编译指令是

test_pthread_sem.exe:test_pthread_sem.c
    gcc -g -Wall --entry=$(basename $@) -nostartfiles -o $@ $^ -lpthread

末端也可以参照下边链接学习一下.

   信号量与标准变量的区分

 

5. 那再两遍到语法基础部分了. C++各个语法妖魔来了. 哈哈

留存这么一个情状. 一个函数玩家new了个对象.
可是忘记delete了.直接return了,怎么搞别内存泄漏.

分析:

  其实这类C++问题, 在C++最经典的图书中都有解释.
一般人会答应用智能指针. 这时候面试官和蔼的告知您不行.

您sb了. 这怎么搞哈哈. 倘使做过很简短,没做过就xxx了.
其实此时候面试官希望您自己实现个简单的智能指针. 其实这一个

很好搞,
本质就是C++栈上变量在函数再次来到时候会退栈,执行变量析构函数.其实再扯一点,这种特性本质就是编译器在编译的时候

,帮大家插入了这个构建和清理的代码而以. 一个简单的代码如下:

template<typename T> class AutoPtr {
    T * _ptr;
public:
    explicit AutoPtr(T * ptr) {
        _ptr = ptr;
    }

    ~AutoPtr(void) {
        delete _ptr;
    }

    T & operator*() {
        return *_ptr;
    }

    T * operator->() {
        return _ptr;
    }
};

用法也特别简单

    class People { };
    AutoPtr<People> ptr(new People());

到这里就各类妖魔鬼怪出来. 例如会连续问placement new 的用法. 呵呵,
各个奇葩问题来了.

  C++ 中为何一直不placement
delete

参考下边资料看的挺有意思.一般而言 placement new 用在指定对象分配上.

#define _INT_XX (108)
char xx[_INT_XX];
T * p = new(xx) T;

自然还有更加奇葩的在构造函数和析构函数中抛出万分.
这种题材面试一问基本上基础部分就象是尾声了. 能扯个30min吧.

  构造函数、析构函数抛出十分的问题

  关于社团函数 和 析构函数
能否抛出卓殊的商讨

简易, C++ 的 new 和 delete 还是很有搞头的 O(∩_∩)O哈哈~  ┻┳|・ω・)问我?

 

6. 又是最简易的虚函数了, 必问. 直接搞起吧.

  虚函数virtual可以说是C++面向对象的所有.
面试时必问的根底中的基础.(✪ω✪) 让我们来分析其中的机密吧.  

virutal虚函数围绕本质在于编译器帮我们在类中插入了 __vfptr 变量.
例如下面例子.

图片 2

如上就是虚函数实现原理.通过汇编好实现.通过纯C++实现有点难搞,
需要记住类型.

 

7. 这到了STL部分了,也是素有的. 搞一搞吧.

  STL是必问的,其实问的都很简单. 多数是探望下面STL代码是够有问题. 奥,
常见的有各个容易的区别.

答问的时候需要吸引迭代器特点. 存储结构特点.
例如唯有vector和deque是顺序存储并且援助随机迭代器的.

有的会问怎么删除vector中是偶数的迭代器. 手写代码.

    int i = 0;
    std::vector<int> vs;
    std::vector<int>::iterator it = vs.begin();
    while (it != vs.end()) {
        if (++i % 2 == 0)
            it = vs.erase(it);
        else
            ++it;
    }

最重如果注意一下迭代器失效的意况.

  C++STL常汇合试题

末尾扯扯C++11下面知识. 其实哈哈, 都C++17了, 还11. 说白了高级程序员,

尖端的地点不在于功底, 不在于能力, 最重点的是事情熟练度,
和眼前店家的工作匹配度.

 

8. TCP 和 epoll 出现了. 其实也很简单.

  网络这块也是逃不掉的.什么三回分别, 3次握手是必须的.

   TCP相关面试题总计

  TCP滑动窗口控制流量的规律

此地TCP搞完了, 这起来问select, epoll 什么的. 可以了开班考验你api 和
内核的知晓了

  linux下epoll咋样贯彻长足处理百万句柄的

   epoll
底层实现源码分析

  epoll实现机制分析

套路都差不多. 多总计总计,
这中间试官一问能扯个5-10min吧. 毕竟除了老一辈的程序员功底好些.

新的对于这个也只是 –>  “编程5min摆龙门阵2h” !
O(∩_∩)O哈哈~  关于epoll 实际用法可以参见我的上边博文

  C高级 服务器内核分析和构建
(一)
  

 

后记 – 新的起头, 哈哈

   以上就是老鸟找工作必问的题目, 深刻的扯可以扯好久…. 错误是在所难免的,
欢迎指正, 共同提高~~~

  
虚虚实实 
http://music.163.com/\#/m/song?id=189433&userid=16529894

  图片 3

                   人生没有重来,
贪婪有何不足  -|-  对不起自己的哥们儿和自家的阿妹

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图