4.2 克隆

一,什么是克隆?

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

克隆可用于提高性能:

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

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

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

例如,假设有一个完全透明的窗口,除了需要有一个在一角进行混合的水印。如果去混合整个窗口,那么成本会很高,可以通过将此窗口的透明度设置为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() 后显示发生更改,则缓冲区不会更新。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# 使用MSTest进行单元测试

目录 写在前面 代码实现 执行结果 写在前面 MSTest是微软官方提供的.NET平台下的单元测试框架;可使用DataRow属性来指定数据,驱动测试用例所用到的值,连续对每个数据化进行运行测试,也可以使用DynamicData 属性来指定数据&…

服务器数据恢复-服务器断电导致linux操作系统数据丢失的数据恢复案例

linux操作系统服务器数据恢复环境: 某品牌R730服务器MD3200系列存储,linux操作系统。 服务器故障: 机房意外断电导致服务器linux操作系统部分文件丢失。 服务器数据恢复过程: 1、将故障服务器连接到北亚企安数据恢复中心备份服务器…

vue3 组合式pinia的使用 案例

需求:用户登录时,结合session实现永久化存贮个人信息 import { computed, ref } from vue import { defineStore } from pinia import { logOn } from /service// sessionStorage的封装 import { SET_USER_TOKEN, STORAGE_GET, STORAGE_SET } from /util…

【PyTorch】代码学习

文章目录 直接定义nn.Sequential(), 然后append(),最后直接net(),少写很多forward,适合直连式网络 直接定义nn.Sequential(), 然后append(),最后直接net(),少写很多forward,适合直连式网络 代码来源:https://github.com/zshhans/MSD-Mixer/b…

ros2启动gazebo方式

我安装的是官方建议的gz-harxxx版本。就用这个启动 ros2 launch ros_ign_gazebo ign_gazebo.launch.py 哎我鼓捣了2个小时的东西,就这么公布出来好像有点不甘心啊,此文章全国第一个发布,没有之一

SQL指南:掌握日期函数来查询和管理数据

文章目录 1. 引言2. 建立数据库表2.1 建表语句2.2 数据插入 查询案例3.1 查询当前日期的订单3.2 查询过去一周内的订单3.3 查询明天的日期3.4 查询今年的订单3.5 查询特定月份的订单 总结 1. 引言 在数据库管理中,处理日期和时间是一项基本但重要的任务。本指南将通…

SpringCloudGateway网关处拦截并修改请求

SpringCloudGateway网关处拦截并修改请求 需求背景 老系统没有引入Token的概念,之前的租户Id拼接在请求上,有的是以Get,Param传参形式;有的是以Post,Body传参的。需要在网关层拦截请求并进行请求修改后转发到对应服务。…

Centos7在安装Graylog时新安装MongoDB报错端口不监听服务不启动无法运行启动失败

由于虚拟机服务器上需要安装Graylog需要安装MongoDB,尝试官网下载安装包,和yum安装均无法正常启动,折腾了好几天,重装了十几次,网上搜索了很多很多资料,均无法正常运行,百度上搜索各种文档&…

内网穿透的应用-Docker本地部署青龙面板并实现公网远程访问管理界面

文章目录 一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用。本教程使用Docker部署青龙,如何安装Docker详见: 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 青龙…

【数字图像处理】实验三 图像增强

图像增强 一、实验内容: 1. 熟悉和掌握利用Matlab工具进行数字图像的读、写、显示等数字图像处理基本步骤。 2. 熟练掌握各种图像增强的基本原理及方法。 3. 能够从深刻理解图像增强,并能够思考拓展到一定的应用领域。…

WPF组合控件TreeView+DataGrid之TreeView封装

(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…

《代码整洁之道:程序员的职业素养》读后感

概述 工作即将满8年,如果算上2年实习的话,满打满算我已经走过将近10年的程序员编码生涯。关于Spring Boot知识点,关于微服务理论,也已经看过好几本书籍,看过十几篇技术Blog,甚至自己也写过相关技术Blog。 …

【计算机网络】TCP心跳机制、TCP粘包问题

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525; 给大家跳段…

案例125:基于微信小程序的个人健康数据管理系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Nginx快速入门:nginx各类转发、代理配置详解|location、proxy_pass参数详解(五)

0. 引言 咱们上节讲解了nginx的负载均衡配置&#xff0c;但是还有很多其他的转发情况&#xff0c;包括不同路径转发至不同的业务服务&#xff0c;通配符识别路径转发等。 今天一起来学习nginx的转发配置 1. location模块的匹配模式 首先我们要了解nginx进行转发代理的核心在…

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

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

stable diffusion工作原理

目录 序言stable diffusion能做什么扩散模型正向扩散逆向扩散 如何训练逆向扩散 Stable Diffusion模型潜在扩散模型变分自动编码器图像分辨率图像放大为什么潜在空间可能存在&#xff1f;在潜在空间中的逆向扩散什么是 VAE 文件&#xff1f; 条件化(conditioning)文本条件化&am…

jetbrains idea 报错 java.lang.ClassNotFoundException 之后自动搜索包导入包

-- 搜索类所在的包 导入包 搜索包 mac环境 pom中右键或者 cmdn

shell 的错误处理和调试方法

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

nodejs微信小程序+python+PHP个性化书籍推荐系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…