可能重复:
为什么weakref不能在这个绑定方法上工作?
一点背景:
我试图实现一个Listener(或Observer,同样的东西)模式:EventManager保存一个对Event感兴趣的所有Listener处理程序的列表.例如,Listener对象将有一个onEndOfTheWorldEvent方法,每次发布事件类EndOfTheWorldEvent的实例时,EventManager都会调用该方法.简单.
除了我想弱引用处理程序,因为我不希望EventManager在不再需要Listener时让我的处理程序(绑定方法)保持活动状态.
所以我想"让我们把所有处理程序都放在WeakSet中".我无法让它发挥作用.
我在这里转储代码(或者当我将它减少到最小时,它的左边是什么,这里只有一种类型的事件,只有一种类型的处理程序).
#! /usr/bin/python
"""
"""
import sys
import weakref
class Listener(object):
def handler(self, event):
print event
class EventManager(object):
def __init__(self):
self.handlers = weakref.WeakSet()
def register(self, listener):
print "Registering..."
self.handlers.add(listener.handler)
CountRefs(listener.handler)
print "Number of handlers registered:", len(self.handlers)
print "Registered."
def CountRefs(what):
print "Hard count:", sys.getrefcount(what)
print "Weak count:", weakref.getweakrefcount(what)
listener = Listener()
em = EventManager()
CountRefs(listener.handler)
em.register(listener)
CountRefs(listener.handler)
Run Code Online (Sandbox Code Playgroud)
结果:
Hard count: 3
Weak count: 0
Registering...
Hard count: 3
Weak count: 0
Number …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种惯用的方式
moveMaybeCreature Nothing world = world
moveMaybeCreature (Just creature) world = moveCreature creature world
Run Code Online (Sandbox Code Playgroud)
或者换句话说
if isJust c
then doSomething (fromJust c) w
else w
Run Code Online (Sandbox Code Playgroud)
我以为我可以这样做:
moveMaybeCreature c w = foldr moveCreature w (maybeToList c)
Run Code Online (Sandbox Code Playgroud)
我可以在不必转换的情况下Maybe Creature完成[Creature]吗?
让我们从GoTour中获取此示例,因为它说明了仅在存在事件时处理SDL事件的问题.
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(1e8)
boom := time.After(5e8)
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(" .")
time.Sleep(5e7)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有效.但是如果我不想在默认情况下打印或睡眠,但只是想保持循环呢?我试过这个:
case <-boom:
fmt.Println("BOOM!")
return
default: // Nothing here.
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它阻止了.
我在这里和那里看到一个关于goroutines调度的句子,但我不理解它们.所以我想我有两个问题:
1)为什么阻止?
2)如何在没有阻止的情况下做任何事情?
我写了一个简单的 Go 程序。它的目标是使用 OpenGl 在屏幕上旋转一个三角形。
编辑:主循环似乎是负责任的,OpenGl 很好,但我在 goroutines 和/或通道上做错了。见本文底部。我正在适当地更改这个问题的标题。
该程序几乎可以运行。它断断续续,在按预期旋转和只闪烁两个 OpenGl 缓冲区而不绘制任何内容之间交替。我尝试渲染的大约三分之二的帧以静默方式失败,我不明白为什么。
这不取决于我的帧速率。无论我以 50 FPS 还是 1 FPS 进行更新,我都会得到一系列混乱的帧,然后是较短的工作帧系列。我不认为我要求 OpenGl 工作得太快(glFinish()无论如何我都会打电话)。
我开始尝试并发现了一个奇怪的行为。我使用glGetUniformLocation作为第一步将我的新旋转矩阵发送到顶点缓冲区。我注意到,如果我要求glGetUniformLocation告诉我在哪里可以找到"dummy"一个在着色器中显然不存在的参数,它并不总是按预期返回 -1 ;它有时会返回 0。该虚拟属性不是问题的原因,它只是一个症状。
我在每次 OpenGl 调用后检查 glGetError,它们总是返回 NO_ERROR。
我在这里粘贴我的代码。我希望我能缩短它。我的真实代码在每次调用 OpenGl 后都会检查 glError,并且还会查看 0 个缓冲区或 -1 个位置。这个版本比较轻。 func main在顶部,跟随我的循环来处理旋转。
package main
import (
"fmt"
"github.com/0xe2-0x9a-0x9b/Go-SDL/sdl"
gl "github.com/chsc/gogl/gl33"
"math"
"time"
"unsafe"
)
const DEG_TO_RAD = math.Pi / 180
type GoMatrix [16]float64
type GlMatrix [16]gl.Float
var good_frames, bad_frames, sdl_events int
func main() …Run Code Online (Sandbox Code Playgroud) 我问这个问题是因为我不想花时间编写一些复制OpenGL驱动程序功能的代码.
OpenGL驱动程序/服务器可以容纳比视频卡更多的数据吗?说,我有足够的视频RAM来容纳10个纹理.我可以要求OpenGL分配15个纹理而不会出现GL_OUT_OF_MEMORY错误吗?
如果我可以依赖驱动程序在需要时巧妙地将纹理/缓冲区/对象从"普通"RAM发送到视频RAM,那么我自己并不需要生成/删除这些对象.我受限于"正常"RAM,与视频RAM相比,它通常很丰富.
OpenGL 3.3规范似乎没有要求mipmap生成在线性空间中完成.我能找到的是以下内容:
派生的mipmap数组的内部格式都与levelbase数组的内部格式匹配,派生数组的维度遵循3.8.14节中描述的要求.通过对levelbase数组的重复,过滤的减少来计算派生数组的内容.对于一维和二维阵列纹理,每个图层都是独立过滤的.虽然建议使用盒式过滤器作为默认过滤器,但不需要特殊的过滤器算法.
据我所知,如果原始图像在sRGB中,调用glGenerateMipMap的结果是在sRGB中,我没有问题.但是中间会发生什么?当然,我们不希望平均对数刻度的颜色.这是特定于实现的吗?
我已经看到使用iterate或replicate为了应用函数n时间的解决方案.但是,我没有设法在州monad中使用它.
此代码有效:
-- Stuff an empty game level with obstacles.
generateLevel :: Level -> State StdGen Level
generateLevel lvl =
placeRandomWall lvl >>= placeRandomWall >>= placeRandomWall
Run Code Online (Sandbox Code Playgroud)
这个也很有效,不出所料:
generateLevel :: Level -> State StdGen Level
generateLevel lvl =
placeRandomWall =<< placeRandomWall =<< placeRandomWall lvl
Run Code Online (Sandbox Code Playgroud)
但是,这与以下内容不同:
generateLevel :: Level -> State StdGen Level
generateLevel lvl =
(placeRandomWall =<< placeRandomWall =<< placeRandomWall) lvl
Run Code Online (Sandbox Code Playgroud)
关于类型的最新抱怨.因此,我不能foldl (=<<) id (relicate 42 placeRandomWall),也不能iterate.
这是有道理的,因为迭代需要一个a -> a …
我正在尝试向OpenGl发送一些数据.由于Sizeof,发送阵列很容易:
array := [...]Whatever {lots of data}
array_ptr := gl.Pointer(&array[0])
array_size := gl.Sizeiptr(unsafe.Sizeof(array))
gl.BufferData(gl.ARRAY_BUFFER, array_size, array_ptr, gl.STATIC_DRAW)
Run Code Online (Sandbox Code Playgroud)
我想使用切片而不是数组,因为我的3D模型的大小在编译时是未知的.
如何检索切片内容的大小(以字节为单位)? 我想到了这个:
size := uintptr(len(slice)) * unsafe.Sizeof(slice[0])
Run Code Online (Sandbox Code Playgroud)
但它不是很一般.实际上,我需要知道切片的基础类型才能使其工作,并且假设数组的所有元素具有相同的大小.
我也可以遍历整个切片并添加每个元素的所有大小.它不是很快.
我准备保持len(s)== cap(s),这可以帮助我吗?
编辑:使用运行时反射实现建议的解决方案
package main
import "fmt"
import "reflect"
func ElemSize(container interface{}) uintptr {
return reflect.TypeOf(container).Elem().Size()
}
func ElemSizeVerbose(container interface{}) uintptr {
t := reflect.TypeOf(container)
e := t.Elem()
s := e.Size()
fmt.Println(t, e, s)
return s
}
func main() {
a := [...]int8{2, 3, 5, 7, 11} // Array …Run Code Online (Sandbox Code Playgroud) SDL的文档似乎没有提到很多关于颜色空间的内容.我没有看到任何SRGB标志/参数SDL_SetVideoMode或SDL_GL_SetAttribute.在FrameBuffer 0上写入时,SDL是否可以要求OpenGL执行色彩校正? GLUT似乎能够提供该功能.
如果SDL无法做到这一点,通常的解决方法是什么?我正在考虑使用GL_FRAMEBUFFER_SRGB启用渲染到sRGB纹理,然后将其渲染到FRAMEBUFFER_SRGB禁用的FrameBuffer 0中.有什么好主意吗?
我已经设定
import matplotlib as mpl
AXES_COLOR = '#333333'
mpl.rc('axes', edgecolor=AXES_COLOR, labelcolor=AXES_COLOR, grid=True)
mpl.rc('xtick', color=AXES_COLOR)
mpl.rc('ytick', color=AXES_COLOR)
mpl.rc('grid', color=AXES_COLOR)
Run Code Online (Sandbox Code Playgroud)
轴标签和刻度的颜色在 2D 和 3D 中都正确设置。但是,edgecolor不适用于 3D 轴并且它们保持黑色。同样,网格不受影响。
我想知道如何访问 3D 绘图的各个轴:
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d # Needed for 3d projection.
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.w_zaxis # <- the z axis
Run Code Online (Sandbox Code Playgroud)
该文件提到了一个属性,我们可以使用,直到开发商已经完成了重构他们的3D代码:
import pprint
pprint.pprint(ax.w_xaxis._AXINFO)
{'x': {'color': (0.95, 0.95, 0.95, 0.5),
'i': 0,
'juggled': (1, 0, 2),
'tickdir': 1},
'y': {'color': (0.9, 0.9, 0.9, 0.5), …Run Code Online (Sandbox Code Playgroud)