我正在尝试编写现代的OpenGL,但是遇到了一些让我烦恼的东西.
我有这段代码:
glUseProgram(skybox_program->id);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->id);
glUniform1i(get_program_uniform(skybox_program, "cubemap_tex"), 1);
//From here
GLint save_cull_mode, save_depth_mode;
glGetIntegerv(GL_CULL_FACE_MODE, &save_cull_mode);
glGetIntegerv(GL_DEPTH_FUNC, &save_depth_mode);
glCullFace(GL_FRONT);
glDepthFunc(GL_LEQUAL);
//To here
glUniformMatrix4fv(get_program_uniform(skybox_program, "camera"), 1, GL_FALSE, cam_rot.mat);
glBindVertexArray(skybox_vao);
glDrawArrays(GL_TRIANGLES, 0, 6 * 2 * 3);
//And these next 2 lines
glCullFace(save_cull_mode);
glDepthFunc(save_depth_mode);
glUseProgram(0);
Run Code Online (Sandbox Code Playgroud)
正如您可能已经意识到的那样,此代码绘制了一个天空盒.部分原因是禁用剔除(所以我们可以在里面看到方框)并更改深度功能(基本上是优化,其中一部分在着色器中,部分在此处).我想保存并恢复这些值,但由于我无法使用gl[Push/Pop]Attrib,我必须自己做.这对于两个属性来说并不是什么大不了的事,但如果我使用更多属性,这很快就会变成一个巨大的痛苦(而且,据我所知,速度glGet*很慢,因为速度不是很快).我读到推送/弹出功能已被弃用,因为它们主要用于处理FFP状态,但这显然不是FFP状态,但推/弹功能非常适合使用.我应该用什么呢?或者我必须处理它?
我正在使用Flask和gevent-socketio:
$ cat requirements.txt
Flask==0.10.1
Jinja2==2.7.1
MarkupSafe==0.18
Werkzeug==0.9.3
argparse==1.2.1
gevent==0.13.8
gevent-socketio==0.3.5-rc2
gevent-websocket==0.3.6
greenlet==0.4.1
itsdangerous==0.23
wsgiref==0.1.2
Run Code Online (Sandbox Code Playgroud)
我正在使用一个非常标准的设置来启动服务器:
#Called from __main__
def run_dev_server():
app.debug = True
port = 5000
dapp = werkzeug.debug.DebuggedApplication(app, evalex = True)
SocketIOServer(('', port), dapp, resource="socket.io").serve_forever()
Run Code Online (Sandbox Code Playgroud)
我的SocketIO命名空间的一个非常标准的钩子:
@app.route('/socket.io/<path:rest>')
def push_stream(rest):
print 'ws connect', rest
try:
socketio.socketio_manage(request.environ, {'/join_notification': JoinsNamespace}, request)
except Exception as e:
app.logger.error("Exception while handling socketio connection", exc_info=True)
return flask.Response()
Run Code Online (Sandbox Code Playgroud)
但是,我遇到的问题是客户端没有触发'connect'事件.经过一番挖掘,我意识到即使我127.0.0.1 - - [2013-08-19 12:53:57] "GET /socket.io/1/websocket/170191232666 HTTP/1.1" 101 - -在输出中收到消息,我也没有收到ws connect消息(而代码中的其他打印语句工作正常).我注释掉了这个端点,果然它甚至没有被调用.这可以解释为什么我的命名空间没有被使用.但为什么?我注册我的命名空间错了吗?
print app.url_map …
这是一个奇怪的问题,所以我将解释:
我有一个像这样的生成器,它充当 IRC 服务器的生成器前端:
def irc_iter(): # not the real code, simplified
msgs = get_msgs()
for msg in msgs:
if is_ping(msg):
pong()
else:
to_send = yield msg
for s in to_send:
send(s)
Run Code Online (Sandbox Code Playgroud)
从理论上讲,这应该允许我做一些很酷的事情,例如:
server = connect()
for line in server:
if should_respond(line):
server.send('WOW SUCH MESSAGE')
Run Code Online (Sandbox Code Playgroud)
但是,有一个问题:也会generator.send 产生下一个值。这意味着这server.send也给了我下一条消息......我更愿意像所有其他消息一样处理它,产生为line.
我知道我可以用一种丑陋的方式来解决这个问题,在接收到发送后只产生一个垃圾值,但我试图保持我的代码优雅,但恰恰相反。有没有办法告诉生成器我还不需要新值?
谢谢。
我有一对存储在eax和ecx中的32位浮点数.我可以直接将它们加载到FPU中对它们进行操作,而无需先存储到内存中吗?这将显着简化一些编译器代码,但fld似乎只能在内存上运行.