我有一个C#.NET应用程序,我用它创建了一个自定义图像显示控件。每个图像显示代表它自己的显示上下文并使用glDrawPixels绘制图像(是的我知道使用纹理会更好,我计划在期货中但这个应用程序已经太远而且我的时间有限)。
我现在正试图让两张图像同时平移。也就是说,当一个图像向下移动十个像素时,第二个图像向下移动十个像素。像这样:
imageOne.YPan -= 10;
imageTwo.YPan -= 10;
imageOne.Invalidate(); //This forces a redraw.
imageTwo.Invalidate(); //This forces a redraw.
好吧,这就是我遇到的问题。只有一个图像显示正在重绘。如果我在两个Invalidate调用之间暂停并使暂停持续时间至少为110毫秒,则两者都将重绘,但不会同时重绘。所以看起来好像第二张图片总是试图赶上第一张图片。另外,110毫秒的暂停会使运动减慢太多。
我尝试将每个图像的更新和无效放在自己的线程中,但这没有帮助。
在绘图开始时,我使适当的上下文是最新的,最后我调用swapbuffers()。我尝试在绘制函数的末尾添加glFinish,但没有变化。
可能是它的显卡是问题吗?我被困在使用只有openGL 1.4的集成gpu。
希望我已经提供了足够的细节,可以找到我的问题的答案。
答案 0 :(得分:1)
很难说出你做了什么是错的,因为你提供的细节很少。以下是一些可能有用的提示
- 在上下文中执行某些操作之前,请确保将其设置为当前上下文。如果要平移两个上下文,请将第一个上下文设为当前,将其平移,然后将第二个设置为当前并平移它。这不是为什么这不起作用的真正原因
- 如果看起来有时间问题,在战略位置添加glFinish()
可能有助于解决问题
- 应该总是这样,有时候打电话给glError()
,看看一切进展顺利
- 我不确定你在谈论的框架中是如何做到这一点的,但是你应该确保两个上下文都为每一帧进行swapBuffers()
调用。
答案 1 :(得分:0)
Invalidate
不会强制立即重绘。它标记窗口无效,当消息队列用完其他消息时,将创建并处理绘制消息。但是,在您完成当前消息的处理并返回到主消息循环之前,这种情况不会发生,并且可能会延迟甚至更多。
通常,OpenGL动画是在Control.OnPaint
内(或在Control.Paint
事件的处理程序中)进行所有绘制的规则的例外。