小编Izm*_*man的帖子

跨平台浮点一致性

我正在开发一个使用锁步模型在网络上播放的跨平台游戏.作为简要概述,这意味着只传达输入,并且在每个客户端的计算机上模拟所有游戏逻辑.因此,一致性和决定性非常重要.

我正在编译使用GCC 4.8.1的MinGW32上的Windows版本,而在Linux上我正在使用GCC 4.8.2进行编译.

最近让我感到震惊的是,当我的Linux版本连接到我的Windows版本时,即使在两台机器上编译相同的代码,程序也会立即发生分歧或解除同步!原来问题是Linux构建是通过64位编译的,而Windows版本是32位.

在编译Linux 32位版本之后,我很幸运地解决了问题已经解决的问题.然而,它让我思考和研究浮点决定论.

这就是我收集的内容:

如果是,程序通常是一致的:

  • 在相同的架构上运行
  • 使用相同的编译器编译

因此,如果我假设,针对PC市场,每个人都有一个x86处理器,那么解决了一个要求.但是,第二个要求似乎有点傻.

MinGW,GCC和Clang(分别是Windows,Linux,Mac)都是基于/兼容GCC的不同编译器.这是否意味着实现跨平台决定论是不可能的?或者它只适用于Visual C++ vs GCC?

同样,优化标志-O1或-O2会影响这种决定论吗?让他们离开会更安全吗?

最后,我有三个问题要问:

  • 1)在编译器中使用MinGW,GCC和Clang时,跨平台确定性是否可行?
  • 2)应在这些编译器中设置哪些标志以确保操作系统/ CPU之间的最大一致性?
  • 3)浮点精度对我来说并不重要 - 重要的是它们是一致的.有没有任何方法可以将浮点数减少到较低的精度(如3-4个小数位),以确保跨系统的小圆整错误不存在?(到目前为止我尝试写的每个实现都失败了)

编辑:我做过一些跨平台的实验.

使用浮点数表示速度和位置,我保持Linux Intel笔记本电脑和Windows AMD台式电脑同步,最多可以浮动值的15位小数.但是,这两个系统都是x86_64.测试很简单 - 它只是通过网络移动实体,试图确定任何可见的错误.

如果x86计算机连接到x86_64计算机,假设相同的结果会成立是否有意义?(32位与64位操作系统)

c++ linux gcc

13
推荐指数
1
解决办法
4532
查看次数

检查NSIS中的注册表

我正在使用NSIS为我在Visual C++ 2012 Express中执行的项目创建可执行文件.因为我是初学者,所以我开始使用HM NIS Edit中的安装向导.

我正在尝试将Visual C++ 2012 Redistributable与我的程序捆绑在一起,但每次重新运行安装程序时,Redistributable都会弹出"修复"和"删除"选项,这看起来很烦人.

所以我决定编写一些NSIS脚本,这是脚本到目前为止的开始:

Var STR
Section CheckForReg

ClearErrors
ReadRegDWORD $0 HKLM "SOFTWARE\Classes\Installer\Dependencies\{8e70e4e1-06d7-470b-9f74-a51bef21088e}" "Version"

ifErrors 0 Blank
StrCpy $STR "$INSTDIR\vcredist_x86.exe"
GoTo End

Blank:
    StrCpy $STR ""
End:

SectionEnd
Run Code Online (Sandbox Code Playgroud)

这个部分在脚本的最开始调用,全局变量STR应用于:

!define MUI_FINISHPAGE_RUN $STR
Run Code Online (Sandbox Code Playgroud)

不久之后.

显然这是一个非常愚蠢的方法,但我不需要太多.

问题是CheckForReg始终认为注册表不存在,并且不会移动到标签Blank.作为一个注释,我每次都手动检查注册表,注册表项如下所示:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Dependencies\{8e70e4e1-06d7-470b-9f74-a51bef21088e}]
"Version"="11.0.51106.1"
"DisplayName"="Microsoft Visual C++ 2012 Redistributable (x86) - 11.0.51106"
Run Code Online (Sandbox Code Playgroud)

所以问题是:我在哪里出错?它看起来很简单,但显然我有一些倒退的东西.

- 删除代码转储

nsis

3
推荐指数
1
解决办法
3333
查看次数

顶点缓冲区的双缓冲与三重缓冲

许多图形编程资源似乎建议使用三重缓冲数据,以避免在GPU上进行同步。这里有一些例子:

OpenGL见解-异步缓冲区传输

苹果的最佳做法(三重缓冲)

另一个来源说

GPU和CPU异步运行...但是还有另一个因素:驱动程序。该驱动程序也可能异步运行(在桌面驱动程序实现中,它经常发生)。为了解决这个甚至更复杂的同步方案,您可以考虑使用三重缓冲:

  • 一个cpu缓冲区
  • 一个给司机
  • 一个为GPU

这样,管道中就不会出现停顿,但是您需要为数据牺牲更多的内存。

-

驱动程序实际上是第三个缓冲区吗?第三个缓冲区试图解决驱动程序上的哪个同步问题?感觉我们可以避免只使用两个缓冲区进行所有同步。

opengl graphics

2
推荐指数
1
解决办法
594
查看次数

标签 统计

c++ ×1

gcc ×1

graphics ×1

linux ×1

nsis ×1

opengl ×1