小编Nir*_*iel的帖子

我可以弱参考方法吗?

可能重复:
为什么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)

python weak-references

5
推荐指数
1
解决办法
1823
查看次数

仅在isJust时应用函数

我正在寻找一种惯用的方式

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]吗?

haskell

5
推荐指数
2
解决办法
476
查看次数

没有准备好读取频道时怎么办?

让我们从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)如何在没有阻止的情况下做任何事情?

channel go

5
推荐指数
1
解决办法
1461
查看次数

当我的主循环等待通道勾选并传递事件时,OpenGl 似乎卡住了

我写了一个简单的 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 go

5
推荐指数
1
解决办法
882
查看次数

关于OpenGL内存管理的困惑

我问这个问题是因为我不想花时间编写一些复制OpenGL驱动程序功能的代码.

OpenGL驱动程序/服务器可以容纳比视频卡更多的数据吗?说,我有足够的视频RAM来容纳10个纹理.我可以要求OpenGL分配15个纹理而不会出现GL_OUT_OF_MEMORY错误吗?

如果我可以依赖驱动程序在需要时巧妙地将纹理/缓冲区/对象从"普通"RAM发送到视频RAM,那么我自己并不需要生成/删除这些对象.我受限于"正常"RAM,与视频RAM相比,它通常很丰富.

opengl

5
推荐指数
2
解决办法
3835
查看次数

glGenerateMipmap是否在线性空间中为sRGB纹理执行平均?

OpenGL 3.3规范似乎没有要求mipmap生成在线性空间中完成.我能找到的是以下内容:

派生的mipmap数组的内部格式都与levelbase数组的内部格式匹配,派生数组的维度遵循3.8.14节中描述的要求.通过对levelbase数组的重复,过滤的减少来计算派生数组的内容.对于一维和二维阵列纹理,每个图层都是独立过滤的.虽然建议使用盒式过滤器作为默认过滤器,但不需要特殊的过滤器算法.

据我所知,如果原始图像在sRGB中,调用glGenerateMipMap的结果是在sRGB中,我没有问题.但是中间会发生什么?当然,我们不希望平均对数刻度的颜色.这是特定于实现的吗?

opengl mipmaps srgb

5
推荐指数
1
解决办法
716
查看次数

在monad中绑定一个函数n次

我已经看到使用iteratereplicate为了应用函数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 …

haskell

4
推荐指数
1
解决办法
971
查看次数

切片内容的大小(以字节为单位)

我正在尝试向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)

go slice

4
推荐指数
1
解决办法
2457
查看次数

SDL可以创建sRGB OpenGL上下文吗?

SDL的文档似乎没有提到很多关于颜色空间的内容.我没有看到任何SRGB标志/参数SDL_SetVideoModeSDL_GL_SetAttribute.在FrameBuffer 0上写入时,SDL是否可以要求OpenGL执行色彩校正? GLUT似乎能够提供该功能.

如果SDL无法做到这一点,通常的解决方法是什么?我正在考虑使用GL_FRAMEBUFFER_SRGB启用渲染到sRGB纹理,然后将其渲染到FRAMEBUFFER_SRGB禁用的FrameBuffer 0中.有什么好主意吗?

opengl sdl srgb

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

如何更改 matplotlib 3D 绘图轴的颜色?

我已经设定

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)

matplotlib

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

标签 统计

opengl ×4

go ×3

haskell ×2

srgb ×2

channel ×1

matplotlib ×1

mipmaps ×1

python ×1

sdl ×1

slice ×1

weak-references ×1