Godot: 应该检查GPU功能并正常退出

创建于 2015-01-10  ·  87评论  ·  资料来源: godotengine/godot

我认为Godot应该以某种方式检查系统是否可以处理GLES2,而不是中止或失败,而是向用户显示有关其驱动程序不支持GLES2的有意义的错误消息。 “您的计算机似乎当前不支持运行此程序所需的GLES2。需要新的驱动程序或硬件升级。” 遵循这些原则。

我不确定这将要做什么,但是在代码中必须有某种方法可以做到。

这是专门针对Windows用户的,他们似乎总是拥有糟糕的GPU和糟糕的驱动程序,但理想情况下,检查应在所有平台上进行。

bug enhancement core rendering

最有用的评论

我刚刚在旧的上网本上使用Windows下不兼容的糟糕英特尔igp进行了测试。

rasterizer_gles2.cpp 10791行中,我在RasterizerGLES2::init()添加了以下几行:

    if (!glewIsSupported("GL_VERSION_2_1")) {
        print_line(String("Your graphics card is crappy. It does not support Opengl 2.1. Now Godot is going to crash."));
    }

Godot仍然崩溃,但是在晕倒之前它会在控制台中显示此错误消息。

我不知道如何告诉Godot取消光栅化器的初始化(RasterizerGLES2 :: init()不会返回true / false,就像它别无选择,只能成功或崩溃),我也不知道如何告诉Godot退出正确地。

即使此兼容性测试可能不是100%可靠的,它也至少可以减少静默崩溃的次数,并显示一个小的系统对话框,警告用户即将崩溃以及原因。

所有87条评论

+1

+10

+1

我在context_gl_win.cpp中编写了该代码,但是由于
由于驱动程序糟糕,Windows中一些未实现的功能
我希望我能找出原因

2015年1月17日,星期六,下午2:56,MSC [email protected]写道:

+1

-
直接回复此电子邮件或在GitHub上查看
https://github.com/okamstudio/godot/issues/1162#issuecomment -70376758。

暂时将其设置为高优先级将是一个非常有用的功能。 我们收到大量死机报告,原因是有人使用非常老的英特尔IGP或不支持GLES2的东西。

好的,我想我已经参考了足够多的崩溃来强调我的上述“吨”,我将停止深入研究档案:D

+1为什么Godot可以在Ubuntu上神奇地工作而在Windows上却不能工作?

关于如何实现@reduz的任何想法吗?

我在context_gl_win.cpp中编写了该代码,但是由于Windows中一些未实现的功能,它通常会崩溃

那为什么不使用动态链接呢? 很明显,缺少哪个功能。 我相信https://github.com/p3/regal可以做到这一点。

我已经进行了检测并尝试显示一条消息,但是似乎
仍然无法正常工作。
由于我没有任何不受支持的硬件,因此我看不到它为什么崩溃并且
因此,无法修复它。
欢迎公关。

在2016年2月2日星期二中午12:11,anatoly techtonik < [email protected]

写道:

我在context_gl_win.cpp中编写了该代码,但是由于
Windows中一些未实现的功能

那为什么不使用动态链接呢? 显然哪个功能是
失踪。 我相信https://github.com/p3/regal可以做到这一点。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -178624438。

如果使用旧GPU的人可以尝试在Linux上通过gdb运行Godot,那么可能会很有帮助。 Windows“问题签名”调试信息似乎毫无意义:/

我根本没有做C ++。 只有Python,所以我是用户。 告诉我要运行什么,我可能会得到信息。

告诉我要运行什么,我可能会得到信息。

我不知道如何在Windows上通过调试器运行内容,但是对于那些没有太多在Windows上编译内容的经验的人来说,这并不简单。 这就是为什么我建议某人尝试在Linux上使用GDB进行调试的原因,因为它非常易于使用:

$ gdb /path/to/godot/binary // if possible self-compiled in debug mode, to have more info
-> run
// see that it segfaults in the terminal
-> bt

并将此bt (backtrace)命令的输出复制到此错误报告。

当然,问题可能出在Windows上,因此在Linux上进行调试是没有意义的,但是我相信Linux用户也遇到了段错误,这些段错误并未被告知用户其硬件不支持OpenGL(ES)2.1。

Beta 2.0无法在我的Linux上运行,但似乎与图形卡无关-#3557

呵呵,您很幸运地遇到了我们在极端情况下遇到的所有已知问题:)

我想我只有一个“抱怨人才”和一个GitHub帐户。 =)

我不知道这些旧的视频卡在启动时会崩溃,但是在NVIDIA 6800 GT上,
它仅在少数项目上崩溃。 因此,在所有项目和Godot模块上都有关于帧缓冲区错误的cmd输出。 通过禁用项目光栅化器设置中的“ fp16_framebuffer”设置,可以完全修复该问题。 我知道,在相同的视频卡上(不知道完全连接),存在错误的光栅化(没有纹理),可以通过禁用“ fragment_lighting”设置完全固定。
因此,我认为Godot应该检查是否支持这些功能,如果不支持,请注意用户并禁用它们。
也许对启动时崩溃也有帮助。

告诉我要运行什么,我可能会得到信息。

$ gdb / path / to / godot / binary //如果可能的话在调试模式下自动编译,以获取更多信息

Godot_v2.0_beta_20160205_x11.64不会在具有相同硬件的Fedora 23上崩溃。 在此处将其检测为Mobile Intel® GM45 Express Chipset

Godot_v2.0_beta_20160205_win32.exe在Vista 32上仍然崩溃。

@techtonik我认为原因是,与Windows不同,Linux在硬件OpenGL存在问题时使用OpenGL的软件实现,但是它的速度比硬件慢。

@ Algrin6如果引擎可以提供一些透明性,那就太好了。 在过去,Baldur's Gate之类的游戏附带图形测试二进制文件。 http://www.fileplanet.com/13582/download/Baldur's-Gate-Graphics-Test

BIOWARE VIDEO DRIVER TEST

PURPOSE
-------
This program tests each of the DirectDraw calls used in the full version of Baldur's
Gate.  The program uses 640x480 mode with 16-bit color, which has proved to be 
problematic with some video drivers.

REQUIREMENTS
------------
This program requires a video card with 2 MB of memory.  This program also expects
to see DirectX 3.01a or greater on your system.
...

2 MB的内存! 现在我有3 GB + 3 GHz,并且无法运行游戏引擎。 怎么来的?

2 MB的内存! 现在我有3 GB + 3 GHz,并且无法运行游戏引擎。 怎么来的?

因为我们在2016年,而那个Bioware引擎已经过时了? 并且此测试旨在检查图形驱动程序是否足够强大,因此该测试很可能是从DirectX 3.01a开始_正在工作,但是如果您低于DirectX 7或其他,则可能会说“升级硬件或驱动程序”。 Bioware引擎仅在MS Windows <= XP上运行,而Godot在十几个平台上运行...

现在,既然您似乎确切地知道我们需要做什么,请提出请求。

@techtonik的主要问题是核心开发人员都没有旧硬件可以测试该问题。 因此,您要么必须提供调试信息以查明问题的原因,要么自己解决(这是开源的魅力)。

博德之门未在通用2D / 3D游戏引擎中进行编程。
它是使用C,x86汇编器(可能是Watcom)定制的定制程序
编译器,保护模式,并使用基本的堆栈计算机进行脚本编写。 也
随时自行完成所有自定义的blitting代码。

在2016年2月7日,星期日,下午12:36,George Marques [email protected]
写道:

@techtonik https://github.com/techtonik关于此的主要问题是
核心开发人员都没有旧硬件可以测试该问题。 所以
您要么提供调试信息以查明故障原因,要么
自行修复(这是开源的美)。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -181034018。

@reduz Godot可以为引擎产生的代码(或由编辑器使用)生成“平台兼容性表”

如果目前无法做到这一点,那么这至少在技术上是否可行?

验证的用例是能够产生一个最小的游戏(测试),该游戏可以在任何打点设备上运行并衡量性能。

@ Algrin6检查旧版本的OpenGL是否支持该内容是毫无意义的。 这些GPU的驱动程序告诉OpenGL所有功能都受支持,然后进入某种奇怪的软件回退,该回退很慢,冻结或崩溃。

我更愿意假装这种旧硬件不存在,已经从地球上掉下来了。

我认为这意味着“欢迎补丁”,我真的怀疑有人会拒绝
很好的支持
较旧的平台。

2016年2月11日星期四,凌晨3:41,胡安·利尼茨基[email protected]
写道:

@ Algrin6 https://github.com/Algrin6检查是否没有意义
OpenGL的较早版本支持该功能。 这些GPU具有驱动程序
告诉OpenGL所有内容都受支持,然后进行某种
缓慢,死机或崩溃的怪异软件回退。

我更愿意假装这样的旧硬件不存在并且已经崩溃
来自地球。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -182658216。

我仍在等待使用旧芯片组的人做出更好的贡献
检测不支持的硬件。 我没有任何硬件,因为
十年,所以我无能为力。

2016年2月10日,星期三,晚上11:30,谢尔盖·拉平(Sergey Lapin) [email protected]
写道:

我认为这意味着“欢迎补丁”,我真的怀疑有人会拒绝
很好的支持
较旧的平台。

2016年2月11日星期四,凌晨3:41,胡安·利尼茨基[email protected]
写道:

@ Algrin6 https://github.com/Algrin6检查是否没有意义
OpenGL的较早版本支持该功能。 这些GPU具有驱动程序
告诉OpenGL所有内容都受支持,然后进行某种
缓慢,死机或崩溃的怪异软件回退。

我更愿意假装这样的旧硬件不存在并且已经崩溃
来自地球。

-
直接回复此电子邮件或在GitHub上查看
< https://github.com/godotengine/godot/issues/1162#issuecomment -182658216

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -182676389。

我可以使用80年代到2000年初的PC进行存储,如果有帮助的话,
但是我需要一些有关如何测试和调试的详细信息,因为我不是
Windows开发人员以任何方式,对工具等一无所知。
有一套带有win95se2盒的i740,甚至还有Pentim233MMX。
出于会计考虑,这要到2025年才被丢弃。

顺便说一句,胡安,您可以通过电子邮件与我联系,以便获得您的个人地址吗?
不会用任何愚蠢的东西轰炸它。

2016年2月11日,星期四,5:48 AM,胡安·利尼茨基[email protected]
写道:

我仍在等待使用旧芯片组的人做出更好的贡献
检测不支持的硬件。 我没有任何硬件,因为
十年,所以我无能为力。

2016年2月10日,星期三,晚上11:30,谢尔盖·拉平(Sergey Lapin) [email protected]
写道:

我认为这意味着“欢迎补丁”,我真的怀疑有人会
拒绝
很好的支持
较旧的平台。

在2016年2月11日,星期四,凌晨3:41,Juan Linietsky <
[email protected]>
写道:

@ Algrin6 https://github.com/Algrin6检查是否没有意义
OpenGL的较早版本支持该功能。 这些GPU具有驱动程序
告诉OpenGL所有东西都受支持,然后再进行某种排序

缓慢,死机或崩溃的怪异软件回退。

我更愿意假装这样的旧硬件不存在并且具有
堕落
来自地球。

-
直接回复此电子邮件或在GitHub上查看
<
https://github.com/godotengine/godot/issues/1162#issuecomment -182658216

-
直接回复此电子邮件或在GitHub上查看
< https://github.com/godotengine/godot/issues/1162#issuecomment -182676389

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -182678470。

您不需要再往回走。 只是Intel Series 3/4或i940是
足以使其崩溃...
只需使用mingw / msvc进行编译,然后尝试找出导致崩溃的原因
显示不支持硬件的MessageBox的视图

2016年2月11日,星期四,12:00 AM,谢尔盖·拉平(Sergey Lapin) [email protected]
写道:

我可以使用80年代到2000年初的PC进行存储,如果有帮助的话,
但是我需要一些有关如何测试和调试的详细信息,因为我不是
Windows开发人员以任何方式,对工具等一无所知。
有一套带有win95se2盒的i740,甚至还有Pentim233MMX。
出于会计考虑,这要到2025年才被丢弃。

顺便说一句,胡安,您可以通过电子邮件与我联系,以便获得您的个人地址吗?
不会用任何愚蠢的东西轰炸它。

2016年2月11日,星期四,5:48 AM,胡安·利尼茨基[email protected]

写道:

我仍在等待使用旧芯片组的人做出更好的贡献
检测不支持的硬件。 我没有任何硬件
以来
十年,所以我无能为力。

2016年2月10日,星期三,晚上11:30,谢尔盖·拉平(Sergey Lapin)< [email protected]

写道:

我认为这意味着“欢迎补丁”,我真的怀疑有人会
拒绝
很好的支持
较旧的平台。

在2016年2月11日,星期四,凌晨3:41,Juan Linietsky <
[email protected]>
写道:

@ Algrin6 https://github.com/Algrin6检查是否没有意义

OpenGL的较早版本支持该功能。 这些GPU具有
司机
告诉OpenGL所有东西都受支持,然后再进行某种排序

缓慢,死机或崩溃的怪异软件回退。

我更愿意假装这样的旧硬件不存在并且具有
堕落
来自地球。

-
直接回复此电子邮件或在GitHub上查看
<
https://github.com/godotengine/godot/issues/1162#issuecomment -182658216

-
直接回复此电子邮件或在GitHub上查看
<
https://github.com/godotengine/godot/issues/1162#issuecomment -182676389

-
直接回复此电子邮件或在GitHub上查看
< https://github.com/godotengine/godot/issues/1162#issuecomment -182678470

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -182679526。

用MinGW编译的godot.windows.tools.32.exe。 崩溃。 接下来做什么?

我唯一能想到的就是您需要调试崩溃。 ID
从main()函数开始并打印每个函数名称
它一直运行到找到崩溃的那一个,然后将打印添加到
函数的每一行以查找确切的行
崩溃并报告结果。 另外,如果您使用mingw编译,
您可以使用的崩溃地址
addr2line -e / path / to / debug / exe 0x

找出行号。
这些信息将非常有帮助,
但这并不意味着调试已在此处完成,但这将是一个很大的过程
向前一步。

在2016年2月11日,星期四,晚上11:46,anatoly techtonik <
[email protected]>写道:

用MinGW编译的godot.windows.tools.32.exe。 崩溃。 接下来做什么?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183054269。

实际上,MinGW似乎随附有gdb

E:\r\godot\bin>gdb godot.windows.tools.32.exe
GNU gdb (GDB) 7.8.1
...
This GDB was configured as "i686-w64-mingw32".
...
Reading symbols from godot.windows.tools.32.exe...done.
(gdb) run
Starting program: E:\r\godot\bin\godot.windows.tools.32.exe
[New Thread 384.0xca0]
EXEC PATHP??: E:\r\godot\bin\godot.windows.tools.32.exe
EXEC PATHP??: E:\r\godot\bin\godot.windows.tools.32.exe
EXEC PATHP??: E:\r\godot\bin\godot.windows.tools.32.exe
DETECTED MONITORS: 1

Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) bt
#0  0x00000000 in ?? ()
#1  0x004baf5f in RasterizerGLES2::init (this=0xa144dd0) at drivers\gles2\rasterizer_gles2.cpp:10808
#2  0x00db4863 in VisualServerRaster::init (this=0xa1c6a20) at servers\visual\visual_server_raster.cpp:7550
#3  0x00db5cef in VisualServerWrapMT::init (this=0xb3c3e30) at servers\visual\visual_server_wrap_mt.cpp:156
#4  0x004041e6 in OS_Windows::initialize (this=0x22dd20, p_desired=..., p_video_driver=0, p_audio_driver=0) at platform\windows\os_windows.cpp:984
#5  0x004101c6 in Main::setup2 () at main\main.cpp:852
#6  0x0040f504 in Main::setup (execpath=0x8f143a8 "E:\\r\\godot\\bin\\godot.windows.tools.32.exe", argc=0, argv=0x8f1438c, p_second_phase=true)
    at main\main.cpp:796
#7  0x00401935 in widechar_main (argc=1, argv=0x273e58) at platform\windows\godot_win.cpp:138
#8  0x00401a53 in main (_argc=1, _argv=0x8f11c98) at platform\windows\godot_win.cpp:172
(gdb)

根据上面的跟踪,它在以下行崩溃:

...
    glGenTextures(1, &white_tex);
    unsigned char whitetexdata[8*8*3];
    for(int i=0;i<8*8*3;i++) {
        whitetexdata[i]=255;
    }
--> glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D,white_tex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE,whitetexdata);
    glGenerateMipmap(GL_TEXTURE_2D);
...

https://github.com/godotengine/godot/blame/f6a8a0f51358e42295cc5a049074a59466161ad8/drivers/gles2/rasterizer_gles2.cpp#L10808

下一个是什么?

apitrace输出

E:\r\godot\bin>apitrace.exe trace godot.windows.tools.32.exe
apitrace: loaded into E:\r\godot\bin\godot.windows.tools.32.exe
EXEC PATHP??: E:\r\godot\bin\godot.windows.tools.32.exe
EXEC PATHP??: E:\r\godot\bin\godot.windows.tools.32.exe
EXEC PATHP??: E:\r\godot\bin\godot.windows.tools.32.exe
DETECTED MONITORS: 1
apitrace: tracing to E:\r\godot\bin\godot.windows.tools.32.1.trace
apitrace: warning: caught exception 0xc0000005
apitrace: flushing trace due to an exception
E:\r\godot\bin>glretrace.exe godot.windows.tools.32.1.trace -v -d
2 <strong i="8">@0</strong> wglCreateContext(hdc = 0xcd01199a) = 0x10000
3 <strong i="9">@0</strong> wglMakeCurrent(hdc = 0xcd01199a, hglrc = 0x10000) = TRUE
warning: ChoosePixelFormat returned a pixel format supported by the GDI software implementation
4 <strong i="10">@0</strong> glViewport(x = 0, y = 0, width = 1024, height = 600)
4: warning: glGetError(glViewport) = GL_INVALID_ENUM
5 <strong i="11">@0</strong> glScissor(x = 0, y = 0, width = 1024, height = 600)
741 <strong i="12">@0</strong> glEnable(cap = GL_DEPTH_TEST)
742 <strong i="13">@0</strong> glDepthFunc(func = GL_LEQUAL)
743 <strong i="14">@0</strong> glFrontFace(mode = GL_CW)
744 <strong i="15">@0</strong> glClearColor(red = 0, green = 0, blue = 0, alpha = 1)
745 <strong i="16">@0</strong> glClear(mask = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)
746 <strong i="17">@0</strong> glGenTextures(n = 1, textures = &1)
Rendered 0 frames in 0.268717 secs, average of 0 fps

该函数为NULL,因为驱动程序未提供它,这就是为什么
崩溃。

2016年2月12日,01:21,anatoly techtonik [email protected]
写道:

godot.windows.tools.32.1.trace.zip
https://github.com/godotengine/godot/files/127485/godot.windows.tools.32.1.trace.zip

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183174112。

@ punto-您在哪里看到它为NULL?

在回溯的顶部,第0帧,地址为0x00000,这就是它的方式
看起来像当您调用一个为空的函数指针时

2016年2月12日,06:58,anatoly techtonik [email protected]
写道:

@ punto- https://github.com/punto-您在哪里看到它为NULL?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183257600。

但我不明白-C ++不是Python,因此当加载godot二进制文件时,系统应加载驱动程序dll并失败,并警告给定的符号不存在。 为什么不发生呢?

还是这意味着Godot实际上实现了动态运行时链接,但是没有警告缺少符号?

运行时链接出现问题,这就是功能存在但可以
有时为空。

2016年2月12日13:41,anatoly techtonik [email protected]
写道:

或这是否意味着Godot实际上实现了动态运行时链接,
但是不警告缺少符号吗?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183401773。

@punto-这似乎不正确。 这个GLEW可以为这些带有错误而不是段错误的NULL函数注入自己的存根吗?

我不知道..也许..那将是一个好主意

2016年2月12日15:01,anatoly techtonik [email protected]
写道:

@ punto- https://github.com/punto-这似乎不正确。 可以吗
GLEW为这些抱怨的NULL函数注入自己的存根
错误而不是段错误?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183431329。

C ++不是python,但是python是C :) glew可能会寻找符号
当它们不存在时,它将为函数指针分配NULL。 一世
不记得所有的细节,但这就是它总是崩溃的原因,
gl的任何函数都是NULL。

2016年2月12日13:40,anatoly techtonik [email protected]
写道:

但我不明白-C ++不是Python,因此当godot二进制加载时,
系统应加载驱动程序dll并失败,并警告给定符号为
不存在。 为什么不发生呢?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183401442。

拥有这些Intel卡之一的人可以尝试这种构建吗?

http://op.godotengine.org:81 / godot.windows.tools.angle.32.exe

2016年2月12日15:45,Ariel Manzur [email protected]写道:

C ++不是python,但是python是C :) glew可能会寻找符号
当它们不存在时,它将为函数指针分配NULL。 一世
不记得所有的细节,但这就是它总是崩溃的原因,
gl的任何函数都是NULL。

2016年2月12日13:40,anatoly techtonik [email protected]
写道:

但我不明白-C ++不是Python,因此当godot二进制加载时,
系统应加载驱动程序dll并失败,并警告给定符号为
不存在。 为什么不发生呢?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183401442

image

享有风景32

它是32位.. Windows是否可能只接受64位?

2016年2月14日,01:29,anatoly techtonik [email protected]
写道:

[image:图片]
https://cloud.githubusercontent.com/assets/515889/13031852/90815d62-d2ec-11e5-8b8c-ccbc54af1f48.png

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183819635。

依赖关系遍历器显示它是链接到32位库的64位模块。

它说哪个?

2016年2月14日,01:38,anatoly techtonik [email protected]
写道:

依赖关系遍历器显示它是链接到32位库的64位模块。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183820237。

(又为什么它在我的计算机上可以工作?那是32位的CPU吗?)

2016年2月14日,01:52,Ariel Manzur [email protected]写道:

它说哪个?

2016年2月14日,01:38,anatoly techtonik [email protected]
写道:

依赖关系遍历器显示它是链接到32位库的64位模块。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183820237

你可以试试这个吗?

http://op.godotengine.org:81 / godot.windows.opt.tools.angle.64.exe

2016年2月14日,01:54,Ariel Manzur [email protected]写道:

(又为什么它在我的计算机上可以工作?那是32位的CPU吗?)

2016年2月14日,01:52,Ariel Manzur [email protected]写道:

它说哪个?

2016年2月14日,1:38,anatoly techtonik < [email protected]

写道:

依赖关系遍历器显示它是链接到32位库的64位模块。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183820237

在我的旧笔记本电脑(intel gma x3100)上,它没有崩溃,但是窗口保持灰色,并出现以下错误:

ERROR: ShaderGLES2::get_current_version: CanvasShaderGLES2: Program LINK FAILED:
Failed to create D3D shaders.
   At: drivers\gles2\shader_gles2.cpp:544
ERROR: ShaderGLES2::get_current_version: Method/Function Failed, returning: 0
   At: drivers\gles2\shader_gles2.cpp:551
ERROR: ShaderGLES2::bind: Condition ' !version ' is true. returned: false
   At: drivers\gles2\shader_gles2.cpp:126
ERROR: ShaderGLES2::_get_uniform: Condition ' !version ' is true. returned: -1
   At: .\drivers/gles2/shader_gles2.h:354

可以是太旧的着色器版本吗?
但是奇怪的是它尝试使用D3D而不是GLSL ...

在2016年2月14日,星期日,上午9:03,Hondres [email protected]写道:

在我的旧笔记本电脑(intel gma x3100)上,它没有崩溃,但窗口仍然存在
灰色,出现以下错误:

错误:ShaderGLES2 :: get_current_version:CanvasShaderGLES2:程序链接失败:
无法创建D3D着色器。
位于:drivers \ gles2 \ shader_gles2。 cpp:544
错误:ShaderGLES2 :: get_current_version:方法/函数失败,返回:0
位于:drivers \ gles2 \ shader_gles2。 cpp:551
错误:ShaderGLES2 :: bind:条件'!version'为true。 返回:false
位于:drivers \ gles2 \ shader_gles2。 cpp:126
错误:ShaderGLES2 :: _ get_uniform:条件'!version'为true。 返回:-1
地点:。\ drivers / gles2 / shader_gles2.h:354

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183827627。

那么,有没有图形使用角度而不直接使用gl的情况?

2016年2月14日,03:25,Sergey Lapin [email protected]写道:

可以是太旧的着色器版本吗?
但是奇怪的是它尝试使用D3D而不是GLSL ...

在2016年2月14日,星期日,上午9:03,Hondres [email protected]写道:

在我的旧笔记本电脑(intel gma x3100)上,它没有崩溃,但窗口仍然存在
灰色,出现以下错误:

错误:ShaderGLES2 :: get_current_version:CanvasShaderGLES2:程序链接
失败:
无法创建D3D着色器。
位于:drivers \ gles2 \ shader_gles2。 cpp:544
错误:ShaderGLES2 :: get_current_version:方法/函数失败,
返回:0
位于:drivers \ gles2 \ shader_gles2。 cpp:551
错误:ShaderGLES2 :: bind:条件'!version'为true。 返回:false
位于:drivers \ gles2 \ shader_gles2。 cpp:126
错误:ShaderGLES2 :: _ get_uniform:条件'!version'为true。
返回:-1
地点:。\ drivers / gles2 / shader_gles2.h:354

-
直接回复此电子邮件或在GitHub上查看
< https://github.com/godotengine/godot/issues/1162#issuecomment -183827627

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183830014。

@ punto-tools报告godot.windows.tools.angle.32.exe不是有效的PE可执行文件。 您可以发布不被UPX触及的版本吗?

它的IMAGE_OPTIONAL_HEADER.Magic等于IMAGE_NT_OPTIONAL_HDR64_MAGIC,这是错误的https://msdn.microsoft.com/zh-CN/library/windows/desktop/ms680339%28v=vs.85%29.aspx

好的,试试这个:

http://op.godotengine.org:81 / godot.windows.opt.tools.angle.32.exe

它没有被upx压缩

2016年2月14日,5:10,anatoly techtonik [email protected]
写道:

@ punto- https://github.com/punto-其IMAGE_OPTIONAL_HEADER.Magic是
等于IMAGE_NT_OPTIONAL_HDR64_MAGIC,这是错误的
https://msdn.microsoft.com/zh-CN/library/windows/desktop/ms680339%28v=vs.85%29.aspx

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -183846301。

还是一样的问题。 depends认为它是64位二进制文​​件,而不仅仅是depends

E:\_IDE_\godot>file godot.windows.opt.tools.angle.32.exe
godot.windows.opt.tools.angle.32.exe: PE32+ executable (console) x86-64, for MS Windows

它是unix实用程序,顺便说一句。

@Hinsbart您可以在出现灰屏和该错误的计算机上尝试http://tof.p1x.in/html5/吗? 据说chrome对渲染器使用相同的代码。

@techtonik也许我遇到那个我使用bits = 32的错误,而实际上却得到了64位二进制文​​件?

@ punto-我不知道您如何编译它或指的是什么错误。 命令和构建日志可能会澄清它。 如果您准备将更改提交到某个分支,我可以自己编译。

是的,我在

这是https://github.com/punto-/godot/tree/angle

2016年2月15日14:53,anatoly techtonik [email protected]
写道:

@ punto- https://github.com/punto-我不知道如何编译它,或者
错误指的是什么。 命令和构建日志可能会澄清它。 我可以
如果您准备将更改提交到某个分支,请自己进行编译。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -184323695。

用angle = yes编译

2016年2月15日15:25,Ariel Manzur [email protected]写道:

这是https://github.com/punto-/godot/tree/angle

2016年2月15日14:53,anatoly techtonik [email protected]
写道:

@ punto- https://github.com/punto-我不知道如何编译
或指的是什么错误。 命令和构建日志可能会澄清它。 一世
如果您准备对某些内容进行更改,可以自己编译
科。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -184323695

scons: *** [drivers\theora\theora\x86\mmxencfrag.windows.tools.32.o] Source `drivers\theora\theora\x86\mmxencfrag.c' not found, needed by target `drivers\theora\theora\x86\mmxencfrag.windows.tools.32.o'.
scons: building terminated because of errors.

没有运气。

也尝试theora_opt = no

2016年2月15日18:40,anatoly techtonik [email protected]
写道:

scons:*** [drivers \ theora \ theora \ x86 \ mmxencfrag.windows.tools.32.o]源drivers\theora\theora\x86\mmxencfrag.c' not found, needed by target drivers \ theora \ theora \ x86 \ mmxencfrag.windows.tools.32.o'。
scons:建筑因错误而终止。

没有运气。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -184405417。

In file included from drivers\angle/common/angleutils.h:12:0,
                 from drivers\angle\common\angleutils.cpp:7:
drivers\angle/common/platform.h:62:28: fatal error: d3d11_1.h: No such file or directory
 #       include <d3d11_1.h>
                            ^

句号?

嗯,这就是角度,它使用直接3d而不是opengl:p

2016年2月15日18:57,anatoly techtonik [email protected]
写道:

在drivers \ angle / common / angleutils.h:12:0中包含的文件中,
来自drivers \ angle \ common \ angleutils。 cpp:7
drivers \ angle / common / platform.h:62:28:致命错误:d3d11_1.h:没有此类文件或目录
#包括
^

句号?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -184411949。

ANGLE有两个后端-较旧的一个使用DirectX9。我现在正在下载带有DirectX 11标头的更新的MinGW。

上下文是在platform / windows / gl_context_egl_angle.cpp中创建的,
认为那里有一个参数可以选择后端。
问题在于该文件中,可能有一种方法可以检测到哪些参数
最适合系统

2016年2月16日,05:51,anatoly techtonik [email protected]
写道:

ANGLE有两个后端-较旧的一个使用DirectX9。我正在下载较新的
现在具有DirectX 11标头的MinGW。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -184580963。

较新的gcc 5.3.0有很多错误,例如:

In file included from drivers\angle\common\angleutils.cpp:7:0:
drivers\angle/common/angleutils.h:29:21: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11
     NonCopyable() = default;
                     ^
...

我需要将-std=c++11到C ++标志中。
例如,在以下位置添加此行: https :

env_angle.Append(CCFLAGS=['-std=c++11'])

虽然不确定语法是否适用于MSVC,但是对于MinGW来说应该可以。

drivers\angle\libANGLE\renderer\d3d\d3d11\win32\NativeWindow.cpp:15:19: fatal error:
dcomp.h: No such file or directory
compilation terminated.

需要等待新的MinGW发布

也许有关ANGLE的讨论应该移到另一个问题上,让此问题只为“在崩溃前告诉用户其硬件已旧且不受支持”?

是的,我同意

2016年2月17日13:25,RémiVerschelde [email protected]
写道:

也许关于ANGLE的讨论应该移到另一个问题上,
保持这一状态是为了“告诉用户其硬件已经过时,
崩溃前不受支持”?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -185282158。

3634是角度问题。 #3694是PR,用于在加载引擎时获取更多信息。

@ Heybye44

为什么Godot可以在Ubuntu上神奇地工作而在Windows上却不能工作?

是! 我也想知道原因。 当我使用Xubuntu进行测试时,它可以工作,但不能在任何Windows版本上使用。

^^

这与操作系统无关,而与驱动程序有关。 通常,由于Direct3D,与Linux相比,GL驱动程序在Windows上被忽略了。 许多较旧的GPU最终都在较新版本的Windows上以最小的GL 1.5实现。

@阿道森

许多较旧的GPU最终都在较新版本的Windows上以最小的GL 1.5实现。

那么何时Godot将支持较早的OpenGL版本? 是否绝对有必要依赖2.0+? 这并不是说不存在向后兼容性,因此功能更强大的设备在渲染早期OpenGL时不会失败。 视觉编辑器本身是否具有围绕GLES2构建的功能,这些功能无法缩小以使用GL1.4代替? 我的意思是,大多数后来的GL功能仍然是用于3D渲染的,从打算用Godot来创建2D游戏的角度来看,这是不必要的。

@WinnerEX不会发生。 与GL 1.4兼容将意味着放弃许多用于2D和3D的有趣功能。 而在另一方面,我们迫不及待地希望获得GL 3+甚至Vulkan的支持。 您可以放心地将Godot视为GL 2.1+引擎; 如果这不是您想要的,那么还有很多其他的引擎可能具有较低的GL限制(例如OGRE 1.9或SDL 2.0)。

这里的主题是,当所需的GL 2.1+功能不可用而不是崩溃时,Godot应该给出适当的错误; 没有意图重写GLES1渲染器。 对于Windows用户,如果通过Direct3D为GL仿真集成了ANGLE,可能会有些希望,但是GLES2渲染器不会降级。

返回主题: @reduz ,我认为通过尝试在没有2D和3D加速的虚拟机中加载Godot,甚至可以在支持GL 2.1的硬件上重现崩溃。 我将尽快尝试进行确认,但这可能有助于找出崩溃的位置,以及如何使用人类可读的错误消息(而不是段错误)正确地进行紧急救援。

我认为,即使尝试在没有2D和3D加速的虚拟机中加载Godot,也可以在支持GL 2.1的硬件上重现崩溃。 我会尽快尝试确认

好吧,看起来像使用VirtualBox 5一样,这并不容易,因为它现在具有不错的GL驱动程序,该驱动程序最多支持OpenGL 3.0 xD。

opengl 3.0更易于检测,因为您必须请求特殊的conext
(我跳)

在2016年7月25日星期一12:28 PM,RémiVerschelde [email protected]
写道:

我认为即使在GL 2.1上也有可能重现崩溃
通过尝试在没有2D的虚拟机中加载Godot来实现功能强大的硬件
和3D加速。 我会尽快尝试确认

好吧,看起来像使用VirtualBox 5一样,这并不容易,因为它现在已经很不错了
GL驱动程序,最多支持OpenGL 3.0 xD。

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/godotengine/godot/issues/1162#issuecomment -234987968,
或使线程静音
https://github.com/notifications/unsubscribe-auth/AF-Z2_MK5iQA0RxLwv0FHu6po8ucVE8kks5qZNYlgaJpZM4DQoN3

我刚刚在旧的上网本上使用Windows下不兼容的糟糕英特尔igp进行了测试。

rasterizer_gles2.cpp 10791行中,我在RasterizerGLES2::init()添加了以下几行:

    if (!glewIsSupported("GL_VERSION_2_1")) {
        print_line(String("Your graphics card is crappy. It does not support Opengl 2.1. Now Godot is going to crash."));
    }

Godot仍然崩溃,但是在晕倒之前它会在控制台中显示此错误消息。

我不知道如何告诉Godot取消光栅化器的初始化(RasterizerGLES2 :: init()不会返回true / false,就像它别无选择,只能成功或崩溃),我也不知道如何告诉Godot退出正确地。

即使此兼容性测试可能不是100%可靠的,它也至少可以减少静默崩溃的次数,并显示一个小的系统对话框,警告用户即将崩溃以及原因。

很棒的发现@SuperUserNameMan。 我试了一下,并确认它可以工作(至少在我的测试中,由于我的GPU支持,因此我检查了if (glewIsSupported("GL_VERSION_2_1")) )。 我们可以使用OS::alert()显示一个阻止消息框。

如您所述,唯一缺少的部分(也是最难的部分)是让Godot正确退出。 我快速浏览了一下,但是使Godot在其OS初始化过程中退出很困难。

以下是概念证明的区别:

diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp
index 4cd97a7..910d5bf 100644
--- a/drivers/gles2/rasterizer_gles2.cpp
+++ b/drivers/gles2/rasterizer_gles2.cpp
@@ -10788,8 +10788,14 @@ void RasterizerGLES2::init() {
        if (OS::get_singleton()->is_stdout_verbose()) {
                print_line(String("GLES2: Using GLEW ") + (const char*) glewGetString(GLEW_VERSION));
        }
-#endif

+       // Check for GL 2.1 compatibility, if not bail out
+       if (!glewIsSupported("GL_VERSION_2_1")) {
+               ERR_PRINT("Your system's graphic drivers seem not to support OpenGL 2.1 / GLES 2.0, sorry :(\nTry a drivers update, buy a new GPU or move to Linux; Godot will now exit.");
+               OS::get_singleton()->alert("Your system's graphic drivers seem not to support OpenGL 2.1 / GLES 2.0, sorry :(", "Insufficient OpenGL / GLES drivers");
+               // Now DIE! Or at least stop without segfault and memory leaks :)
+       }
+#endif



为了能够测试支持GL 2.1的人员,只需在if测试中删除!

它在X11上生成此(阻塞)消息框:
spectacle w30011

@reduz讨论

要在Linux下测试而不更改代码和重新编译,我认为您可以将环境变量MESA_GL_VERSION_OVERRIDE设置为2.0: http :

IIRC,这也是如何迫使MESA允许列入黑名单的GPU与Godot一起使用。

此页面是否有帮助?
0 / 5 - 0 等级