首页 > 解决方案 > SetDIBitsToDevice() 太慢?

问题描述

我有一个 Hamamatsu Photonics 的硅上液晶空间光调制器(LCOS SLM),它基本上是一个 1280 x 1024 像素的屏幕,通过 DVI 连接到我的显卡。它可以显示8bit灰度图像,即像素值从0到255。

我正在使用 WINAPI 函数SetDIBitsToDevice()在 SLM 上绘制预先计算的 1280 x 1024 8 位设备无关位图 (DIB)(带有正确的标头和所有内容)。我在 python 中使用 ctypes 的实现是这样的:

def draw(data: numpy.array):  # data has dtype=numpy.uint8 and lies in memory like a standard C-array in 8bit format, row-major order
    data_p = data.ctypes.data_as(ctypes.c_void_p)  # pointer to data of C-type void*
    SetDIBitsToDevice(SLM_HDC,          # display context of screen
                      0, 0, 1280, 1024, # fill whole screen
                      0, 0, 0, 1024,    # draw whole data-array
                      data_p, pbmi, 0)  # pbmi is a ctypes.POINTER(BITMAPINFO), i.e. of C-type BITMAPINFO*

如果您有兴趣,可以在我对这个问题的回答中找到更多实现细节。例如,您可以在具有 2 个屏幕的任何计算机上运行,​​从我的dropbox下载,在显示测试文件中调整屏幕分辨率并运行它。关键是它可以在办公室的普通液晶显示器和 SLM 上工作。

但是:在 SLM 上,我在屏幕开始更新之前测量了 > 70 毫秒的延迟。由于 60Hz DVI 频率和 120Hz SLM 频率,预期的最大延迟为 1/(60Hz) + 1/(120Hz) = 25 毫秒。我在 python 中所做的只是上述函数中的两行代码;其他一切都是预先计算好的和静态的。你能看到任何会导致超过 40 毫秒延迟的编程原因吗?我希望我犯了一些愚蠢的错误,有人可以指出。

PS 我很难联系到滨松的技术支持,所以我没能请教专家。

标签: pythonwinapictypesgdi

解决方案


推荐阅读