“系统编程”是什么意思?


33

我正在为一家世界知名的游戏开发公司的游戏程序员实习做准备。当我在他们的网站上搜索必要的先决条件时,它向我显示了以下内容:

增加的优势

  • 了解DirectX / OpenGL。
  • 精通3D数学和物理。
  • 用于C ++开发的Visual Studio IDE。
  • 系统编程和操作系统概念。

它们对系统编程和OS概念到底意味着什么?

我应该学习Windows编程吗?还是我应该进行Linux编程(这意味着他们希望我知道重要的概念)。还是完全不同?


评论不作进一步讨论;此对话已转移至聊天
乔什

“我应该学习Windows编程吗?还是我应该使用Linux编程?”两者都尽可能。至少要读懂它们的API,也许尝试使用各自的OS API做一个简单的“打开窗口”,以便您了解它们的不同之处以及可以付出的努力。
法拉普

@Pharap从技术上讲,没有可以打开窗口的Linux“ OS API”,最好使用glut,glfw或类似的方法来打开窗口,这样它就可以与X和Wayland(以及Windows和macOS)一起使用。
Majora320 '17

@ Majora320否,但是有一个处理它的外壳程序API,它们倾向于特定于Linux发行版(即X用于某些Linux发行版,但通常不用于Windows和Mac)。您也可以使用glut / glfw / SDL /,无论如何,重要的一点是采用低级方法,以便OP可以使用实现来了解基本概念(事件消息,用户土地vs操作系统土地等)。便携式/高级API倾向于抽象出很多可能阻碍学习过程的东西。
法拉普

@Dhannanjai如果我这么大胆,我想推荐一本叫做《操作系统DeMYSTiFieD》的书。在大学期间,硬件部门对我有很大帮助。它解释了操作系统的许多重要概念,如POST,线程调度技术(循环调度,有序队列等)和驱动程序。
法拉普

Answers:


54

“系统编程”(或“系统编程”)往往意味着比(例如)游戏编程更低的抽象级别进行的编程。游戏性编程通常是关于构建用户可能会看到的实际游戏机制和前端功能,而系统编程则更多地是关于构建游戏性程序员工作的框架。

这可能意味着图形,资源加载和流传输,音频,内存管理,文件IO,平台抽象API等。细节差异很大,并且由于游戏行业没有职位名称标准,因此类似的编程领域名称也没有标准。在一个工作室,您可能会发现“系统编程”意味着我上面列出的所有内容。在另一处,您可能会发现他们将“图形编程”区分为一个单独的域,并将其他所有非游戏编程任务称为“系统编程”。在另一种情况下,他们可能根本不使用该术语,而仅将其称为“引擎编程”。

由于它是一个较低级别的域,并且通常涉及为构建游戏的任何平台更直接地与特定于平台的API进行接口,因此了解这些平台将是有帮助的,了解更一般的域也将是有帮助的(例如, ,而不考虑特定OS的工作方式,例如虚拟内存是什么,或线程如何工作,IO缓冲如何工作等等。


2
简而言之,我想说的是非系统编程(实际游戏)将主要与平台无关(实际上不在乎是Mac / PC / Xbox),而系统编程则将更加针对平台(按顺序)为非系统程序员提供与平台无关的层)。
TripeHound

22

Josh的回答确实很好,但我认为我会抛弃一些有关我所在的系统团队的要点。我不在系统上工作,但我经常与他们合作。系统团队的职责因公司而异。

我们的系统团队负责很多工作:

  • 数学库
  • STD替换库
  • 核心游戏框架
  • 核心应用框架
  • 输入项
  • 事件讯息
  • 组件实体系统
  • 脚本绑定
  • (和更多)

这里有很多Windows和Linux领域知识,以及很多物理,核心游戏逻辑和低级内存管理知识。系统团队通常会至少部分参与每个受支持的操作系统,因为他们的大多数项目都处于相当低的层次上。

一些可能属于“系统”团队的事情,我们分成了几个团队(但我们的系统团队仍在进行大量互动):

  • 物理
  • Linux(专用服务器)
  • 直接支持其他操作系统(iOS / Mac /控制台/等)
  • 构建系统
  • 音讯

0

系统编程的定义非常明确,但是公司试图将其扩展到他们的需求。如果您正在使用或编写系统调用,那么您正在进行系统编程。系统调用是内核或用户空间驱动程序提供的功能。这包括OpenGL,因为它基本上是驱动程序。


我认为图形程序员(OpenGL专家)不会申请系统程序员的工作……
Vaillancourt

图形编程和OpenGL编程是两回事。一种处理计算机图形算法,另一种处理API的细节。
Cem Kalyoncu

0

上面列出的其他优点主要是在必要时用于游戏引擎编程,因此涉及利用底层API。这里的系统编程希望您知道如何调用OS音频,进程管理,文件操作,网络调用等。


-6

由于它们引用的是Visual Studio,因此系统编程是指专门为Windows操作系统编写程序,这意味着:Windows syscall(例如,没有fork-exec链),用户帐户,将用户特定数据放在何处,数据共享模型位于其中。 Windows查找,例如,如何在Visual C ++中检查当前用户或如何启动新进程

操作系统概念,指的是调度,文件抽象,线程,用户空间等。os dev Wiki和论坛可以很好地阅读

在这两个部分中都以用户身份验证为例,因为Windows是单个用户操作系统,因此具有用户管理和用户界面的更深层的内核集成。

msdn是Windows编程api,库等所有内容的知识库https://msdn.microsoft.com/

实际编码的Stackoverflow(如果遇到问题)。


Windows不是单个用户操作系统。
Maximus Minimus

系统编程并不意味着专门为给定的OS编写程序。例如,驱动程序可以很容易地跨平台。由于实际的Windows系统调用因版本而异,因此通常通过kernel32.dll和user32.dll处理而不是直接与内核对话。
Maciej Piechotka,

@MaciejPiechotka Systemsprogramming正在接近硬件//的操作系统上进行编程。跨平台驱动程序的一部分是api,而不是syscall包装器。在Linux中,系统调用也包装在库中,否则您无法更改下面的实现,例如,通过寄存器获取CPU临时码在oses之间是非常不同的。
Git

@ LeComteduMerde-fou如果您仅查看用户的处理方式,那是正确的。->安全密钥(ctrl + alt + delete),GUI等。Unix // BSD完全不同地处理用户
Git

@gismo我写了用于生活的驱动程序-驱动程序还有很多,它不是操作系统特定的部分,然后是API;)我对syscall的观点是分开的,而不是about驱动程序。当然,在Linux中您具有库,但我的观点是Linux具有用于系统调用的ABI-即,至少在理论上,系统调用是稳定的并有文档记录(并近似于POSIX建模)。对于Windows,在各个发行版中,userspace <->内核接口均不稳定。
Maciej Piechotka '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.