在Cocoa冻结OS X屏幕

时间:2015-11-04 00:23:43

标签: objective-c macos cocoa

我有两种修改屏幕显示的方法。有没有办法冻结屏幕,直到第二个方法被调用?

// I want to freeze the screen here
updateDisplay1(); // Change in display doesn't take effect until screen is unfrozen
updateDisplay2();
// Unfreeze screen here

在Excel VBA中,这将类似于screenUpdating = FALSE。 Cocoa中有类似的功能吗?

一种可能的方法是截取屏幕截图:

// Take screenshot of the screen
// Display the screenshot image in front of the screen
updateDisplay1(); // Change is not visible
updateDisplay2();
// Remove screenshot image

但我担心这很慢并占用大量内存。有更有效的方法吗?

2 个答案:

答案 0 :(得分:0)

你在说什么屏幕?

标准Cocoa行为是:

  1. 您更新了您感兴趣的各种视图的属性;
  2. 每个人都会调用自己的setNeedsDisplayInRect。作为这些调用的结果,将在运行循环上安排重绘;
  3. 一旦完成所有更新,运行循环将能够移动到下一个项目;
  4. 最终会达到预定的重绘次数,并会对相应的观看次数进行适当的drawRect调用。
  5. 因此,您为响应某个操作而进行的所有视图更改都是自动原子的。您必须以自己的方式进行创建部分更新。

答案 1 :(得分:0)

使用CGWindowListCreateImage截取屏幕截图需要几毫秒并且大致使用任何内存。它通常直接在图形卡中完成。

在做任何表现假设之前尝试并测量: - )