4.2 克隆

news2024/11/24 15:04:03

一,什么是克隆?

克隆是指通过共享缓冲区来复制内容(例如,两个窗口共享相同的内容)。

克隆可用于提高性能:

  • 可以减少所需的更新次数。

你可以在多个显示器上显示内容,但只需要更新一个缓冲区。视频播放就是一个很好的例子。你可以解码一次,但在多个显示器上播放。

  • 可以减少显示器的混合量。

例如,假设有一个完全透明的窗口,除了需要有一个在一角进行混合的水印。如果去混合整个窗口,那么成本会很高,可以通过将此窗口的透明度设置为SCREEN_TRANSPARENCY_DISCARD来完全避免。然而,为了保持水印可见,我们可以创建另一个窗口,与透明窗口共享其缓冲区。这样,透明窗口大部分被丢弃,只有一小块区域,即只有水印的 那部分大小才会被混合。

二,窗口的缓冲区共享

当你希望一个窗口显示与另一个窗口相同的内容时,可以使用缓冲区共享。

当窗口共享缓冲区时,只有一组缓冲区。也就是说一个窗口必须是缓冲区的所有者,另一个窗口只是访问这些缓冲区。这些缓冲区必须使用 screen_create_window_buffers() 创建或与 screen_attach_window_buffer() 相关联。共享缓冲区的窗口本身不一定需要任何缓冲区,因为它依赖于使用其他窗口拥有的缓冲区。自然地,不拥有缓冲区的窗口不能设置这些缓冲区的任何属性;共享缓冲区的属性由拥有它们的窗口控制。

共享缓冲区的更新只能由拥有缓冲区的窗口发布(即,其句柄被标识为 screen_share_window_buffers() 的第二个参数(share)的窗口)。只有 screen_share_window_buffers() 被调用时存在的缓冲区才是共享的。这意味着,如果拥有共享缓冲区的窗口在 screen_share_window_buffers() 被调用后创建了新的缓冲区,则共享窗口无法访问新创建的缓冲区。旧缓冲区仍然存在,因为有一个与缓冲区相关的窗口,但它们不会被更新。你可以再次调用 screen_share_window_buffers() 用任何新的或更新的缓冲区更新共享窗口。

在显示这些窗口的内容时,Screen使用一组缓冲区来更新所有窗口。

如下图,为我们展示了窗口之间的缓冲区共享:

55ad22975f724ad4b4c24cad4fd5b6b4.png

 2.1 嵌套窗口下的缓冲区共享

调用 screen_share_window_buffers() 时,子窗口的缓冲区不包含在共享缓冲区中。只有在API函数中指定的窗口的缓冲区(而不是其子窗口)可以访问以共享。例如,假设有一个窗口,该窗口有一个子窗口。父窗口只是一个黄色背景,子窗口有一个缓冲区,其中包含一个简单的沙漏形状的图像。如果另一个窗口与父窗口共享缓冲区,则该窗口将无法访问子窗口的沙漏形状。

下图是一个嵌套窗口下的缓冲区共享示例:

a5322a5d638c4bab9ec80dd29a2279f4.png

 

正如你所看到的,与父窗口(Window_A)共享缓冲区的窗口(Window_B)不包括沙漏,因为沙漏图像存储在子窗口(Window_C)的缓冲区中,因此不包括在Window_B和Window_A之间的共享缓冲区中。

如果你需要的是在另一个窗口中看到一个窗口的可见内容,而不用担心原始窗口的层次结构,可以使用函数 screen_read_window()。该函数会截取一个窗口的屏幕截图,并将结果存储到你提供的缓冲区中。它可以是像素图或窗口缓冲区。这样,你就可以访问另一个窗口的可见内容,而无需共享窗口及其子窗口的缓冲区。

下图是一个窗口正在截取另一个窗口的屏幕截图示例:

30b88a737fe74d5d9e7610628949ad41.png

三,流的缓冲区共享

当需要窗口显示与流相同的内容时,同样使用缓冲区共享。

当一个流与一个窗口共享其缓冲区时,只有一组缓冲区。流是缓冲区的所有者,窗口只是访问这些缓冲区。这些缓冲区必须使用 screen_create_stream_buffers() 创建或与 screen_attach_stream_buffer() 相关联。窗口本身不需要任何缓冲区,因为它依赖于使用流所拥有的缓冲区。自然地,窗口不能设置缓冲区的任何属性;共享缓冲区的属性由拥有它们的流控制。

共享缓冲区的更新只能由拥有缓冲区的流发布。只有调用 screen_share_stream_buffers() 时存在的缓冲区才会共享。这意味着,如果拥有共享缓冲区的流在调用 screen_share_stream_buffers() 后创建了新缓冲区,则窗口无法访问新创建的缓冲区。旧缓冲区仍然存在,因为窗口与缓冲区相关联,但它们不会被更新。你可以再次调用 screen_share_stream_buffers(),用任何新的或更新的缓冲区更新窗口。

下图是流的缓冲区共享示例:

6aa1c3aeaa224dbb8526e0a5121b138f.png

Screen不允许共享已消耗的缓冲区。如下图,不允许共享已消费的缓冲区。

 

c97c3d47a130437082837d9844ebd5c0.png

四,显示设备的缓冲区共享

当需要窗口显示与显示器相同的内容时,可以使用缓冲区共享。

当调用 screen_share_display_buffers() 时,帧缓冲区(framebuffer)是与窗口共享的。在显示设备支持回写的情况下,如果需要,以考虑大小、像素格式或组织内容,函数 screen_share_display_buffers() 会创建新的缓冲区。支持回写的显示设备会触发新缓冲区的创建,并将帧缓冲区的内容复制到这些新缓冲区。这种行为与 screen_share_window_buffers() 不同,因为当窗口共享缓冲区时,缓冲区只是共享,而不会创建新的缓冲区。

下图是显示器之间的缓冲区共享,如显示设备1共享缓冲区给到显示设备2.

654d774fc7424c6d83f292f5a6740e94.png

通常对于显示器,帧缓冲区是共享的,因为显示器本身并不与任何实际的缓冲区相关联。当没有现成的帧缓冲区,就需要创建一个,此时则根据启动Screen时在graphics.conf中指定的配置来创建帧缓冲区。如果没有在graphics.conf中配置帧缓冲区种类,那么当我们尝试共享显示缓冲区时,将返回错误,errno为ENOTSUP。

当窗口共享缓冲区时,只会应用拥有缓冲区的窗口的属性。但是,当窗口与显示器共享缓冲区时,会考虑窗口的属性,如SCREEN_PROPERTY_FORMAT和SCREEN_PROPERTY_SWAP_INTERVAL,因为显示器没有自己的缓冲区。因此,窗口更新的速率可能与原始显示器的刷新速率不同。例如,如果将SCREEN_PROPERTY_SWAP_INTERVAL属性设置为0,则表示窗口缓冲区将在显示器更新时进行更新。如果将SCREEN_PROPERTY_SWAP_INTERVAL属性设置为1,则窗口缓冲区将以显示器的刷新速率进行更新,即使显示器上没有发生任何变化。设置适当的交换间隔非常重要,因为我们不想在绝对必要时更新窗口缓冲区。

共享显示缓冲区的另一种方法是使用函数 screen_read_display()。通常,如果只需要显示的一次性截图,则可以使用此函数。如果调用 screen_read_display() 后显示发生更改,则缓冲区不会更新。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息论安全与概率论

目录 一. Markov不等式 二. 选择引理 三. Chebyshev不等式 四. Chernov上限 4.1 变量大于 4.2 变量小于 信息论安全中会用到很多概率论相关的上界,本文章将梳理几个论文中常用的定理,重点关注如何理解这些定理以及怎么用。 一. Markov不等式 假定…

大模型之二十一-小语言模型塞道开启

当前提到大语言模型,大家想到的都是动辄百亿规模以上参数量的模型,13B、70B都是稀疏平常入门级的,但是目前从模型层面来看,模型参数量的规模两极分化已经来临,早期各大公司为了效果怼上去,采取了简单粗暴的…

OpenSergo使用详解

简介 OpenSergo是一个基于微服务治理的标准和生态,覆盖了服务元信息、流量治理、服务容错、数据库/缓存治理、服务注册发现、配置治理等十几个关键领域,覆盖了完整的微服务生命周期(从开发态到测试态,到发布态,再到运…

DMR与DPMR以及DMR的分层

数字移动无线电 (DMR) 和数字专用移动无线电 (dPMR) 是数字对讲机中使用的流行通信技术。 与传统模拟无线电相比,这两种技术都提供了改进的音频质量、增强的安全功能和增加的网络容量。 但是,DMR 和 dPMR 无线电之间使用的技术存在重大差异&#xff…

字符串逆序输出

逆序输出就是本来abc输出的,然后我想让他输出成cba,那么我们还是要用到for循环,只不过原先是从零开始往上加,这回呢,是从上面往下减 我们观察上面这个图片,我们想要输出olleh,那么我们就要从4开…

【CentOS 7.9 分区】挂载硬盘为LVM操作实例

LVM与标准分区有何区别,如何选择 目录 1 小系统使用LVM的益处:2 大系统使用LVM的益处:3 优点:CentOS 7.9 挂载硬盘为LVM操作实例查看硬盘情况格式化硬盘创建PV创建VG创建LV创建文件系统并挂载自动挂载添加:注意用空格间…

redis 从0到1完整学习 (四):字符串 SDS 数据结构

文章目录 1. 引言2. redis 源码下载3. 字符串数据结构4. 参考 1. 引言 前情提要: 《redis 从0到1完整学习 (一):安装&初识 redis》 《redis 从0到1完整学习 (二):redis 常用命令》 《redis…

css图片属性,图片自适应

CSS 图片属性指南:background-size 和 object-fit 在前端开发中,使用图片是非常常见的。为了让图片在网页中显示得更好,CSS 提供了多种属性来调整和控制图片的大小和布局。其中,background-size 和 object-fit 是两个常用的属性&a…

2023 年人工智能研究与技术排名前 10 的国家

人工智能研究是一项全球性的工作。虽然美国和中国因其对人工智能的贡献而备受关注,但事实是,世界各国都在涉足这项技术,尝试新的突破,并吸引投资者的关注。 斯坦福大学的《2023年人工智能报告》估计,到 2022 年&#…

Mybatis-Plus——03,CRUD改

CRUD改 一、CRUD——改update————————如觉不错,随手点赞,关注,收藏(* ̄︶ ̄),谢谢~~ 一、CRUD——改update Test//测试更新public void updateTest(){User user new User();user.setId(3L);//怎么改…

shell 的错误处理和调试方法

简介 在我们写代码过程中,一般有两个阶段:调试阶段和试运行阶段。在调试阶段我们希望尽可能的输出日志,方便在出错的时候快速定位问题。在试运行阶段希望将日志标准化,且有些错误的日志是在预期内不想展示的时候如何处理&#xff…

在 Windows 搭建 SVN 服务

近公司给配了台新电脑,配置挺主流的,但是不舍得抛弃自己的旧电脑(原配嘛,这叫贪新不舍旧),于是打算在新电脑上只作开发环境,然后旧电脑作为版本库,这样保存版本的时候可以直接上传到…

vue项目npm run build报错npm ERR! missing script: build(已解决)

vue项目npm run build报错npm ERR! missing script: build(已解决) 错误描述: 今天准备打包vue项目上线是出现下列错误: 找了很多解决方法都不行,最后打开自己的package.json文件发现:build后面多了个&a…

idea SpringBoot项目 Run Dashboard 多个启动类分组展示 失效

idea SpringBoot项目 Run Dashboard 多个启动类分组展示 想要的显示格式 失效的显示格式, 没有按照分组进行平铺展示 解决方案 勾选 展示服务树 参考文章: IDEA 打开Run Dashboard 分组启动 https://www.cnblogs.com/hanjun0612/p/10917689.html idea springBoot项目Run…

深入理解网络 I/O:mmap、sendfile、Direct I/O

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

论文中公式怎么降重 papergpt

大家好,今天来聊聊论文中公式怎么降重,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 论文中公式怎么降重 一、引言 在论文撰写过程中,公式是表达学…

Spring Environment 注入引起NPE问题排查

文章目录 背景原因分析1)Spring Aware Bean 是什么?2)从 Spring Bean 的生命周期入手 解决方案 背景 写业务代码遇到使用 Spring Environment 注入为 null 的情况,示例代码有以下两种写法,Environment 实例都无法注入…

机器视觉系统选型-图像清晰度

 确定图像中所要检测的部分处于清晰的焦距之内  相机分辨率和镜头解析度较好的匹配,考虑镜头的景深等 TIPS: 每一款镜头都有一定的“焦距”,每一款镜头都有一定光圈范围,也有一定的景深; 缩小光圈可以加大景深&am…

Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

学习视频:【编程不良人】2021年SpringBoot最新最全教程 第十三章、拦截器 拦截器 :Interceptor 拦截 中断 类似于javaweb中的Filter,不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦…

ssm420基于JavaEE的企业人事管理信息系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本企业人事管理信息系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…