热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

不透明的NSWindow和WindowServer性能不佳

我需要创建不透明的透明窗口,并在其中创建不透明的子视图(称为surfaceView)。

我需要创建不透明的透明窗口,并在其中创建不透明的子视图(称为surfaceView)。每个子视图可以包含数千个子视图(称它们为controlView)。所以结构必须是这样的:

NSWindow(非透明)
-NSView(非透明)(窗口contentview)
-NSView(不透明)(SurfaceView)
--- NSView(不透明)(ControlView)

Illustration

问题是,当内部有成千上万的controlViews时,WindowServer会变得过载。看起来窗口中的所有NSView都变得不透明。我不明白我该怎么办。

如果NSWindow不透明,则WindowServer不会过载。但是我需要不透明的窗口。这种情况证明,不透明的NSView可以包含许多性能良好的子视图。

如果NSWindow的样式掩码为[.titled,.resizable],则窗口变为透明(这证明透明窗口具有良好的性能是可能的),但没有鼠标过载,但鼠标无法通过窗口的透明部分工作。此外,NSWindow还具有私有类NSThemeframe的圆角。该解决方案非常脏,因为它需要重新实现鼠标事件并替换私有类中的某些方法。

如果表面是childWindows而不是子视图,则没有重载。但是在这种情况下,曲面不能被主窗口裁剪,缩小动画效果不起作用,并且实际上该窗口并不是真正的窗口。

我曾尝试与CAlayer,opaque和其他应用程序进行不同的组合和操作,但看起来像个bug。绝对有可能获得良好的性能,但我不知道如何。有什么想法吗?


也许这会对某人有所帮助。问题是两个意外事实结合在一起的。


  1. NSWindow属性ignoresMouseEvents的行为非常奇怪。如果此 ignoresMouseEvents 为true,则窗口对鼠标完全透明;如果为false,则窗口对鼠标完全不透明,即使窗口的某些部分是透明的。窗口 ignoresMouseEvents 的默认值为false,但窍门是,如果您不更改此属性,则WindowsignosMouseEvents的真实行为将具有第三个选项-窗口对于鼠标透明是透明的零件,这是窗口的默认状态。

所以 ignoresMouseEvents 是一个布尔值,实际上具有三个选项:true,false和Schrödinger的默认状态(如果您不更改的话)。


  1. 如果窗口具有透明的背景并且窗口内有很多CALayer,则ignoresMouseEvents的这种不直观的第三个选项会导致windowServer的意外cpu重载。因此,在某些情况下,windowServer的鼠标透明性检查非常慢

因此,默认情况下,此代码将使您的windowServer在任何鼠标移动时都会哭泣:

let window = NSWindow(contentRect: windowrect,styleMask: [.borderless],backing: .buffered,defer: false);
window.setIsVisible(true);
window.contentView?.wantsLayer = true;
window.contentView?.layer?.borderWidth = 1;
window.backgroundColor = NSColor.clear;
for _ in 0...5000 {
let view = NSView(frame: viewrect);
view.wantsLayer = true;
view.layer?.backgroundColor = CGColor(gray: 1.0,alpha: 1.0);
window.contentView?.addSubview(view);
}

您的视图或图层是否不透明并不重要,它们是否是其他视图的子视图。但是,如果您添加 window.ignoresMouseEvents = false或true ,则windowServer会平静下来,但窗口对鼠标变为完全不透明或完全透明。

该解决方案是针对鼠标移动(使用trackingArea或GlobalMonitor)实现您自己的Windows透明性检查,如果鼠标位于窗口的透明部分,则将 ignoresmouseevents 设置为true,否则设置为false。幸运的是,很难编写鼠标检查的实现,这比默认的windowServer方法要慢。

P.S。抱歉,语言不好。


推荐阅读
  • 在最近的WWDC17大会上,苹果公司宣布了多项重要更新,其中一项是macOS High Sierra 10.13 Final的正式发布。这一版本经过优化,显著提升了系统的稳定性和响应速度,为用户在任何Mac设备上提供了更加流畅的使用体验。本文将详细介绍如何在Windows系统中利用VMware虚拟机软件安装并运行macOS High Sierra 10.13 Final,帮助用户在非苹果硬件上体验这一先进操作系统。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 本文介绍了在Visual C++环境中通过编程实现鼠标移动及点击的具体方法,包括获取鼠标当前位置、移动鼠标至指定位置并执行点击等操作。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 本文通过基准测试(Benchmark)对.NET Core环境下Thrift和HTTP客户端的微服务通信性能进行对比分析。基准测试是一种评估系统或组件性能的方法,通过运行一系列标准化的测试来衡量其表现。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • Parallels Desktop for Mac 是一款功能强大的虚拟化软件,能够在不重启的情况下实现在同一台电脑上无缝切换和使用 Windows 和 macOS 系统中的各种应用程序。该软件不仅提供了高效稳定的性能,还支持多种高级功能,如拖放文件、共享剪贴板等,极大地提升了用户的生产力和使用体验。 ... [详细]
  • 在 `UITableViewController` 中采用简洁的平面样式布局时,可以通过优化代码实现单元格扩展至屏幕边缘的效果,同时确保节标题以分组样式呈现,从而提升用户体验和界面美观度。通过这种方式,可以更好地组织和展示列表内容,使其更加清晰和有序。 ... [详细]
  • Dense Matrix Inversion Results in Segmentation Fault: Causes and Solutions ... [详细]
author-avatar
臭小子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有