游戏开发

专业和独立游戏开发人员的问答

3
OpenGL实际上需要多长时间来更新屏幕?
我在C中有一个简单的OpenGL测试应用程序,它根据按键输入绘制不同的内容。(Mesa 8.0.4,在配备NVIDIA GTX650的PC上与Mesa-EGL和GLFW,Ubuntu 12.04LTS一起尝试过)。绘制非常简单/快速(旋转三角形类型的东西)。我的测试代码没有以任何方式故意限制帧速率,它看起来像这样: while (true) { draw(); swap_buffers(); } 我对此进行了非常仔细的计时,发现从一个eglSwapBuffers()(或glfwSwapBuffers相同的东西)调用到下一个调用的时间约为16.6毫秒。eglSwapBuffers()即使画出的内容非常简单,从通话后到下次通话前的时间也仅比该时间少一点。交换缓冲区调用花费的时间不到1ms。 但是,从应用程序响应按键更改其绘画到实际在屏幕上显示更改的时间> 150ms(价值约8-9帧)。这是通过以60fps的屏幕和键盘的摄像机记录来测量的。 因此,问题是: 在调用交换缓冲区与实际显示在屏幕之间的绘制在哪里缓冲?为什么要延迟?看起来该应用始终都在屏幕前绘制许多帧。 OpenGL应用程序可以做什么以立即绘制屏幕?(即:无缓冲,仅阻塞直到绘制完成;我不需要高吞吐量,我需要低延迟) 应用程序可以做些什么来使上述立即抽奖尽快发生? 应用程序如何知道当前屏幕上实际显示的内容?(或者,当前缓冲延迟是几帧/几帧?)

1
用多个多边形分隔轴定理?
我正在尝试在C#中实现分离轴定理。我有一个可以计算两个多边形之间的最小平移矢量的函数。但是,我似乎无法创建一个函数来计算一个多边形与多个其他多边形之间的最小平移矢量。老实说,我已经为此工作了几个月,距离解决方案还很近,也无法在线找到解决方案。总是有一些边缘情况无法返回正确的结果,从而导致游戏中出现高优先级的错误。 以下是无法正常工作的常见边缘情况: 是否有针对此问题的知名解决方案?我只能发现有人说“只对每个多边形执行SAT”,但这很少产生最小的平移向量。 任何帮助将不胜感激。


1
光传播体积:体积数据的各向异性过滤
我已经实现了级联的光传播体积算法(尚无间接阴影),用于此处和此处详细介绍的实时漫反射全局照明。它工作正常,但我仍在尝试特别修复一个工件。 简短的摘要 如果您已经知道算法的工作原理,则可以跳过此步骤。 该算法的工作原理是将照明信息以球谐函数的形式存储在3D网格中,其中最初,网格每个单元中的数据来自渲染扩展的阴影图(反射阴影图)),还包括颜色和常规信息(深度除外)。这个想法是,光源看到的基本上所有像素都是间接照明第一次反弹的原因,因此您将所需的信息存储在用于阴影映射的普通深度缓冲区旁边,并对所有数据进行采样以初始化3D网格。然后,通过(对于每次迭代)将信息在一个单元中传播到它的6个直接邻居(上,下,左,右,上,下),以迭代方式传播3D网格中的信息。要使用网格中的信息来照亮场景,请在场景上应用全屏传递,并且对于每个栅格化像素,您都可以获得可用的栅格化表面的世界空间位置(例如,来自延迟阴影中的G缓冲区),因此您知道屏幕上某个像素所属的网格单元。 这在大多数情况下都可以正常工作,这是两个没有模拟GI的图像,只是一个硬编码的环境术语,其次是带有LPV算法的图像。注意表面上的彩色反射,更好的深度细节等。 问题 在光照阶段查找单元格时,使用三线性插值法(使用硬件纹理过滤器)可在单元格中心,其相邻单元格和实际查找的纹理坐标之间平滑地插值数据。本质上,此插值模拟了在单元中心的照明信息到在查找信息的中心附近的具体像素的传播。这是必需的,因为否则照明将看起来非常粗糙且难看。但是,由于三线性内插法未考虑在单元中编码的照明信息的光传播方向(请记住,它是在球谐函数中),因此光可能会错误地传播到所查找的像素。例如,如果在单元格中编码的辐射仅向(1,0,0)( 当网格中的像元大小比场景中的曲面大时,这会导致光不正确地穿过壁渗出(这是必要的,因为您需要大的像元以尽可能少的传播迭代将光传播到场景中)。看起来是这样的: 如您所见(从右上角的阴影轮廓中看到),场景被场景上方左上角的定向光源照亮。而且,由于只有一个单元将中庭的外部与内部隔开,因此光线会流过,并且左侧的墙会被错误地照亮。 实际问题 作者提出了一种手动各向异性过滤的形式来解决此问题。他给出了朝向表面法线n方向的辐射梯度(我假设是从当前单元格采样的SH系数),如下所示: 和州 因此,通过将辐射方向导数与实际辐射方向进行比较,可以计算出该点的辐射分布是否开始于其三线性插值。 我的问题: 在等式中,函数c(x)似乎是点(x)的SH系数。因此,辐射梯度似乎像正常的数值导数一样被计算为点x-(n / 2)和x +(n / 2)处SH系数的加权差。但是,在我的上下文中,c(x)是什么?目前,我假设c(x)指的是表面位置(x)上的三线性插值系数,但是我不确定,因为我不知道该如何为您提供有关方向的更多信息SH系数的分布。 然后,如何使用该渐变来确切地更改从单元采样的光照应用于表面的方式?作者只是写了“将辐射方向导数与实际辐射方向进行比较”,但这是相当模糊的。 他提到使用“中心差分方案”,并引用这些幻灯片的SH系数的中心差分,并且还引用本文足见其梯度的推导,但现在我不能从中得出任何有用的结论。

1
如何在“天际”中将对象“粘贴”到表格上并仍然允许这些对象与玩家互动?
我正在尝试使用Havok模拟将非静态电位计(RuinsPot01)放在桌子(RuinsAltar)上。 我将锅放在桌子上方一点,然后打开Havok。锅掉下来了,但漂浮在桌子上方。 如果我打开Havok并按下F它,使其与桌子正确对齐,但是一旦我打开Havok Simulation,它就会像以前一样略微跳起并漂浮。 有人对此有解决办法吗?使锅静态化不是一种选择,它必须是可移动的。

1
如何计算切线和双切向量
我在three.js中加载了纹理,然后传递给着色器。在顶点着色器中,我计算法线,然后将uv向量保存到变量中。 <script id="vertexShader" type="x-shader/x-vertex"> varying vec3 N,P; varying vec2 UV; void main() { gl_Position= projectionMatrix * modelViewMatrix * vec4(position,1.0); P= position; N= normalMatrix * vec3(normal); UV= uv; } </script> <script id="fragmentShader" type="x-shader/x-fragment"> varying vec3 N,P; varying vec2 UV; uniform sampler2D texture; void main() { gl_FragColor= texture2D(texture,UV); } </script> 如何计算T和B向量?

3
使快的东西变慢(Box2D)
我正在开发一款游戏,您可以控制投石机向对手投球。 这就像一个名为“中世纪围攻”的游戏。当投石机摆动手臂时,玩家需要抓住最佳时机按下按钮并释放球。然后,球将以切线角度飞行。 我现在的问题是,投石机的手臂摆动太快,以至于玩家无法抓住正确的时刻。同时必须如此之快,否则不能扔得足够远。并且有一根细绳将球和投石机臂连接起来,如果臂摆动太慢,则当臂移动时,球只是悬在绳上。 我通过切换步长来解决问题,每当手臂摆动时,我都将步长从1/60更改为1/200。一旦球员放开球,球便回到了1/60。 除了我的游戏适用于具有网络功能的多人游戏外,这还算不错。因此,更改步骤可能会导致问题。 我能想到的另一种解决方案是让它缓慢摆动,但是当玩家释放球时,我会在保持球方向的同时手动向球上增加速度。我不太喜欢这种解决方案,因为它看起来很假,但我仍然有一个问题,就是除非球非常短,否则球只是挂在弦上。 请对此有所说明,谢谢! 编辑 感谢大家的投入,我通过使手臂缓慢摆动来解决问题,并在玩家释放球时抓住球的速度和两倍。它看起来与更改步长大小完全相同。我只需要做一件事。因为手臂的摆动非常缓慢,所以球只是悬在手臂末端而不是摆动。我通过在挥杆期间和仅在挥杆期间在球上施加与重力相等的力来解决此问题。然后它不再挂在那里,而是与手臂一起摆动。 @MrCranky的答案很详细,看起来很可行,所以我接受。:)

3
绑带旋转镜
我使用以下代码旋转游戏角色以观看目标: transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f) startQuaternion是给定新目标时角色的当前旋转。 lookQuaternion是角色应查看的方向,其设置如下: destinationVector = currentWaypoint.transform.position - transform.position; lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up); TurningNormalizer只是Time.deltaTime增加,并且turningSpeed是编辑器中给定的静态值。 问题在于,尽管角色在大多数情况下都应该旋转,但在必须接近180度时仍存在问题。然后它有时会抖动并镜像旋转: 在此绘制效果不佳的图像中,角色(右侧)开始转向左侧的圆圈。不仅仅是左右旋转,它还可以启动“镜舞”: 它开始向新面貌旋转 然后突然突然以相同的角度但在另一侧并继续旋转 它执行此“镜像”的时间很长,直到它看着目标为止。这是带有四元数的东西吗? 编辑1: 显然问题不是由旋转本身引起的。更有可能的问题是,角色在旋转时会朝着面部移动。作为限制角度,当允许角色移动时,面对和目标之间的角度会减少,并且有时会消除抖动/镜像旋转。 这当然引发了更多的问题,为什么角色不能同时没有问题地同时移动和旋转呢?机芯使用的代码: transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);

2
如何吸引游戏改装者?
我正在开发游戏,但是当我独自开发游戏时,可以创建的内容数量非常有限。因此,我希望对游戏进行修改,为此,我计划创建一个完整的改装API,以供lua脚本使用。我还将创建教程来使人们入门。并且“原始”游戏也将是“ mod”(类似于Warcraft III地图)。 我的问题是:开发人员可以采取什么措施来鼓励其游戏改进? PS:我的游戏是沙盒式的多人生存游戏(大多数事情都是程序性的)。

2
协程系列
我将如何堆叠一系列应该一个接一个执行的Coroutine调用? 我试图获得闪烁的色彩效果,在协程中循环显示一系列色差,但无法正常工作。
9 unity 


1
如何在2D游戏中使用现代OpenGL?
我已经找到了很多有关3D的“现代” OpenGL(3.0+)教程,但是在寻找有关如何将其用于2D游戏开发的信息时,却几乎找不到。如何开始将OpenGL用于2D gamedev? 具体来说,我对获取以下主题的答案感兴趣: 我应该如何为正交投影设置各种矩阵? 着色器在2D应用程序中使用的程度与在3D应用程序中一样吗?如果是这样,它们在2D设置中的目的是什么? 我应该如何处理2D游戏显然需要的大量纹理? 对于这个相对广泛的问题,我深表歉意,但是我花了很长时间进行搜索,但发现很少有适用于现代OpenGL的有用信息。
9 opengl  2d 

3
许多小型多态类(用作属性,消息或事件)的灵活替代方法
我的游戏中有两个类非常有用,但逐渐变得很痛苦。消息和属性(属性本质上是一个组件)。 它们都从基类派生并包含一个静态ID,因此系统只能关注他们想要的对象。效果很好...除了... 随着游戏的扩展,我一直在不断开发新的消息类型和属性类型。每次我需要编写2个文件(hpp和cpp)和一堆样板文件,以获得本质上是classID和一种或两种标准数据类型或指针。 它开始使玩转和测试新想法成为真正的琐事。我希望当我想创建一个新的消息或属性类型时,我希望能够键入类似 ShootableProperty: int gunType, float shotspeed; ItemCollectedMessage: int itemType; 而不是创建头文件和cpp文件,而是编写一个构造函数,包括父类等。 大约20到40行(包括警卫和其他所有内容)在我脑海中逻辑上是1或2行。 是否有一些编程模式可以解决此问题? 用脚本(我一无所知)呢?有没有办法定义一堆几乎相同的类? 这正是一个类的样子: // Velocity.h #ifndef VELOCITY_H_ #define VELOCITY_H_ #include "Properties.h" #include <SFML/System/Vector2.hpp> namespace LaB { namespace P { class Velocity: public LaB::Property { public: static const PropertyID id; Velocity(float vx = 0.0, float vy = …

2
如何选择3D游戏世界的缩放比例?
我正在使用C ++进行一些物理模拟的3D坦克游戏原型。我需要做出的决定之一是游戏世界相对于现实的规模。例如,我可以考虑1个游戏中的测量单位对应于现实中的1米。这感觉很直观,但是我觉得我可能会缺少一些东西。 我可以将以下问题视为潜在问题: 3D建模程序兼容性。(?) 数值精度。(这很重要吗?)尤其是在大型比例游戏中,像《战地风云》这样的游戏如何拥有巨大的地图:如果使用真实世界比例的1:1映射,它们如何不失去数值精度,因为浮点表示会随着精度的提高而损失更多的精度。数字(例如射线投射,物理模拟)? 游戏性。我不希望在使用像-9.8 m/s^2重力这样的几乎真实的值时,单位的运动会感到缓慢或快速。(这可能是主观的。) 可以放大/缩小进口资产,还是最适合原始规模的世界? 渲染性能。具有相同顶点数的大型网格物体渲染速度是否较慢? 我想知道是否应该将其分为多个问题...

2
演示(和真实游戏)保护
我计划在几个月内开始向公众(互联网)展示我正在开发的(希望是商业性的)游戏。事实是,除了屏幕截图和预告片(具有功能性)外,如何正确制作可以保护的演示? 让我解释一下。该游戏是一种跨平台的RPG。现在,我对游戏进行编码的方式是,它从文件中读取地图,角色等数据,并决定了一切,这使我可以仅通过配置文件和添加资产来扩展世界/故事。 意思是,我担心的是如果我制作了游戏的演示版,即真实游戏,但是随后删除了所有资产/配置文件/ etc,因此它只是具有第一个地图/级别的演示。有没有一种方法可以防止有人在发布真实游戏的数据包后(发布时),而现在突然有了演示EXE的任何人都可以玩真实游戏? 演示保护是我的首要任务,因为我希望在发布真实游戏之前先进行演示。以后(在发布之前,但稍后),我总是可以决定从实际游戏中选择哪种保护方法。 我想它归结为有任何一种真正的方法来保护游戏(我不想限制用户必须进行任何在线检查,因为该游戏将是跨平台的,并且不需要互联网来玩)。我想做的最后一件事是与合法用户打交道。而且,我想尽可能让资产保持开放状态,因为这仅意味着轻松修补文件夹并允许改装者乱七八糟。 我的意思是,即使我建立了基本的密钥许可系统,是什么真正阻止了1个人将其密钥和游戏副本上传到某个地方?我见过人们谈论进行频繁的更新,以便二进制更改,并且他们不得不重新破解游戏。但是,当您可以获得1张合法的副本然后四处传播时,谁需要彻底破解游戏? 我不确定是否丢失了某些东西,我只是想确保自己没有。它真的可以归结为: 在其上拍打基本密钥许可证保护。 从演示中删除资产/配置文件 希望最好的 任何和所有建议,不胜感激!我对这一切都是新手; -;) 抱歉,如果这是重复的!在演示概念上找不到太多。

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.