我正在开发一个应用程序,它根据通过网络收到的信息在屏幕上绘制一些图形。 我的问题是,有时这些事件的进入速度高于我可以绘制的速度,而且我遇到了延迟。现在问题不在于延迟,而是延迟的类型。 如果我根据事件进行绘制,例如用鼠标点击并拖动这不会发生,我认为这是因为事件的传递方式。我怎么能找出视图何时“准备好”再次绘制,因为那样我就可以丢弃通过网络收到的一些事件并仅绘制最新的事件。
现在我有一个透明窗口位于窗口层次结构的“顶部”。 我正在绘制一个NSImage,它是屏幕的大小,在每次绘图操作之后,我会对绘图发生的视图进行setneedsdisplayinrect调用。当我收到直接调用时,我绘制了包含在脏矩形中的图像部分。 我解决这个问题的尝试有点像黑客,因为我不知道另一种方法。我在每个setneedsdisplayinrect之后将Boolean设置为true,并在drawrect中将其设置为false。如果我得到一个后续事件来绘制图像我只是忽略它的布尔值设置为true。
我还有其他选择吗?
我想过使用cashapelayers并修改它们的路径但是我不确定一旦路径变大,形状层的效率如何。我还想过为路径的不同部分使用多个形状图层(不连续),但如果我想清除图形,如果有很多图层,我会删除图层,我注意到了一点性能。 我能想到的另一种方式是使用open gl进行绘制,但考虑到OpenGL视图的性质(屏幕大小和透明度),我不确定这会有多大的性能问题。
任何提示将不胜感激。
感谢。
答案 0 :(得分:0)
我明白了:)
从管理网络连接的对象我使用主调度队列发送事件。根据我的理解 - 我可能错了 - 可以跨越runloop的多次迭代。我需要的是在运行循环的每次迭代期间分派事件,并创建一个自定义的运行循环源,每当我通过网络连接获得新事件时它就会发出主runloop信号,这大大提高了我的性能。