Java性能优化技巧

浅谈JavaSE性能优化(1)——BufferedImage与像素级渲染 写在前面的话:JAVA应用结构简单,易于编写,能够轻易完成高强度的复杂交互,并且安全性高,稳定性强,免费资源丰富,网络功能强大,拥有近乎完美的多线程机制。有必要的前提下,Java程序员甚至可以使用JNI直接与本地环境沟通,从而绕过虚拟机的性能制约。 而JAVA应用的跨平台特性,更(理论上)让其可以运 阅读详情

===================================
摘要:
===================================
可供程序利用的资源(内存、CPU时间、网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。本文讨论的主要是如何提高代码的效率。
===================================
提纲:
===================================
一、通用篇
  1.1 不用new关键词创建类的实例
  1.2 使用非阻塞I/O
  1.3 慎用异常
  1.4 不要重复初始化变量
  1.5 尽量指定类的final修饰符
  1.6 尽量使用局部变量
  1.7 乘法和除法
二、J2EE篇
  2.1 使用缓冲标记
  2.2 始终通过会话Bean访问实体Bean
  2.3 选择合适的引用机制
  2.4 在部署描述器中设置只读属性
  2.5 缓冲对EJB Home的访问
  2.6 为EJB实现本地接口
  2.7 生成主键
  2.8 及时清除不再需要的会话
  2.9 在JSP页面中关闭无用的会话
  2.10 Servlet与内存使用
  2.11 HTTP Keep-Alive
  2.12 JDBC与Unicode
  2.13 JDBC与I/O
  1.14 内存数据库
三、GUI篇
  3.1 用JAR压缩类文件
  3.2 提示Applet装入进程
  3.3 在画出图形之前预先装入它
  3.4 覆盖update方法
  3.5 延迟重画操作
  3.6 使用双缓冲区
  3.7 使用BufferedImage
  3.8 使用VolatileImage
  3.9 使用Window Blitting
四、补充资料
===================================
正文:
===================================
一、通用篇

“通用篇”讨论的问题适合于大多数Java应用。

1.1 不用new关键词创建类的实例

用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。

在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:


public static Credit getNewCredit() {
return new Credit();
}




改进后的代码使用clone()方法,如下所示:


private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}




上面的思路对于数组处理同样很有用。

1.2 使用非阻塞I/O

版本较低的JDK不支持非阻塞I/O API。为避免I/O阻塞,一些应用采用了创建大量线程的办法(在较好的情况下,会使用一个缓冲池)。这种技术可以在许多必须支持并发I/O流的应用中见到,如Web服务器、报价和拍卖应用等。然而,创建Java线程需要相当可观的开销。

JDK 1.4引入了非阻塞的I/O库(java.nio)。如果应用要求使用版本较早的JDK,在这里有一个支持非阻塞I/O的软件包。

请参见Sun中国网站的《调整Java的I/O性能》。

1.3 慎用异常

异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。

异常只能用于错误处理,不应该用来控制程序流程。

1.4 不要重复初始化变量

默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。

1.5 尽量指定类的final修饰符

带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。

另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。

1.6 尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。

1.7 乘法和除法

考虑下面的代码:


for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }




用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:


for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }




修改后的代码不再做乘以8的操作,而是改用等价的左移3位操作,每左移1位相当于乘以2。相应地,右移1位操作相当于除以2。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。

二、J2EE篇

前面介绍的改善性能技巧适合于大多数Java应用,接下来要讨论的问题适合于使用JSP、EJB或JDBC的应用。

2.1 使用缓冲标记

一些应用服务器加入了面向JSP的缓冲标记功能。例如,BEA的WebLogic Server从6.0版本开始支持这个功能,Open Symphony工程也同样支持这个功能。JSP缓冲标记既能够缓冲页面片断,也能够缓冲整个页面。当JSP页面执行时,如果目标片断已经在缓冲之中,则生成该片断的代码就不用再执行。页面级缓冲捕获对指定URL的请求,并缓冲整个结果页面。对于购物篮、目录以及门户网站的主页来说,这个功能极其有用。对于这类应用,页面级缓冲能够保存页面执行的结果,供后继请求使用。

对于代码逻辑复杂的页面,利用缓冲标记提高性能的效果比较明显;反之,效果可能略逊一筹。

请参见《用缓冲技术提高JSP应用的性能和稳定性》。

2.2 始终通过会话Bean访问实体Bean

直接访问实体Bean不利于性能。当客户程序远程访问实体Bean时,每一个get方法都是一个远程调用。访问实体Bean的会话Bean是本地的,能够把所有数据组织成一个结构,然后返回它的值。

用会话Bean封装对实体Bean的访问能够改进事务管理,因为会话Bean只有在到达事务边界时才会提交。每一个对get方法的直接调用产生一个事务,容器将在每一个实体Bean的事务之后执行一个“装入-读取”操作。

一些时候,使用实体Bean会导致程序性能不佳。如果实体Bean的唯一用途就是提取和更新数据,改成在会话Bean之内利用JDBC访问数据库可以得到更好的性能。

2.3 选择合适的引用机制

在典型的JSP应用系统中,页头、页脚部分往往被抽取出来,然后根据需要引入页头、页脚。当前,在JSP页面中引入外部资源的方法主要有两种:include指令,以及include动作。


include指令:例如<%@ include file="copyright.html" %>。该指令在编译时引入指定的资源。在编译之前,带有include指令的页面和指定的资源被合并成一个文件。被引用的外部资源在编译时就确定,比运行时才确定资源更高效。
include动作:例如<jsp:include page="copyright.jsp" />。该动作引入指定页面执行后生成的结果。由于它在运行时完成,因此对输出结果的控制更加灵活。但时,只有当被引用的内容频繁地改变时,或者在对主页面的请求没有出现之前,被引用的页面无法确定时,使用include动作才合算。
2.4 在部署描述器中设置只读属性

实体Bean的部署描述器允许把所有get方法设置成“只读”。当某个事务单元的工作只包含执行读取操作的方法时,设置只读属性有利于提高性能,因为容器不必再执行存储操作。

2.5 缓冲对EJB Home的访问

EJB Home接口通过JNDI名称查找获得。这个操作需要相当可观的开销。JNDI查找最好放入Servlet的init()方法里面。如果应用中多处频繁地出现EJB访问,最好创建一个EJBHomeCache类。EJBHomeCache类一般应该作为singleton实现。

2.6 为EJB实现本地接口

本地接口是EJB 2.0规范新增的内容,它使得Bean能够避免远程调用的开销。请考虑下面的代码。


PayBeanHome home = (PayBeanHome)
javax.rmi.PortableRemoteObject.narrow
(ctx.lookup ("PayBeanHome"), PayBeanHome.class);
PayBean bean = (PayBean)
javax.rmi.PortableRemoteObject.narrow
(home.create(), PayBean.class);




第一个语句表示我们要寻找Bean的Home接口。这个查找通过JNDI进行,它是一个RMI调用。然后,我们定位远程对象,返回代理引用,这也是一个RMI调用。第二个语句示范了如何创建一个实例,涉及了创建IIOP请求并在网络上传输请求的stub程序,它也是一个RMI调用。

要实现本地接口,我们必须作如下修改:


方法不能再抛出java.rmi.RemoteException异常,包括从RemoteException派生的异常,比如TransactionRequiredException、TransactionRolledBackException和NoSuchObjectException。EJB提供了等价的本地异常,如TransactionRequiredLocalException、TransactionRolledBackLocalException和NoSuchObjectLocalException。
所有数据和返回值都通过引用的方式传递,而不是传递值。
本地接口必须在EJB部署的机器上使用。简而言之,客户程序和提供服务的组件必须在同一个JVM上运行。
如果Bean实现了本地接口,则其引用不可串行化。
请参见《用本地引用提高EJB访问效率》。

2.7 生成主键

在EJB之内生成主键有许多途径,下面分析了几种常见的办法以及它们的特点。

利用数据库内建的标识机制(SQL Server的IDENTITY或Oracle的SEQUENCE)。这种方法的缺点是EJB可移植性差。

由实体Bean自己计算主键值(比如做增量操作)。它的缺点是要求事务可串行化,而且速度也较慢。

利用NTP之类的时钟服务。这要求有面向特定平台的本地代码,从而把Bean固定到了特定的OS之上。另外,它还导致了这样一种可能,即在多CPU的服务器上,同一个毫秒之内生成了两个主键。

借鉴Microsoft的思路,在Bean中创建一个GUID。然而,如果不求助于JNI,Java不能确定网卡的MAC地址;如果使用JNI,则程序就要依赖于特定的OS。

还有其他几种办法,但这些办法同样都有各自的局限。似乎只有一个答案比较理想:结合运用RMI和JNDI。先通过RMI注册把RMI远程对象绑定到JNDI树。客户程序通过JNDI进行查找。下面是一个例子:


public class keyGenerator extends UnicastRemoteObject implements Remote {
private static long KeyValue = System.currentTimeMillis();
public static synchronized long getKey() throws RemoteException { return KeyValue++; }




2.8 及时清除不再需要的会话

为了清除不再活动的会话,许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多会话时,如果内存容量不足,操作系统会把部分内存数据转移到磁盘,应用服务器也可能根据“最近最频繁使用”(Most Recently Used)算法把部分不活跃的会话转储到磁盘,甚至可能抛出“内存不足”异常。在大规模系统中,串行化会话的代价是很昂贵的。当会话不再需要时,应当及时调用HttpSession.invalidate()方法清除会话。HttpSession.invalidate()方法通常可以在应用的退出页面调用。

2.9 在JSP页面中关闭无用的会话

对于那些无需跟踪会话状态的页面,关闭自动创建的会话可以节省一些资源。使用如下page指令:


<%@ page session="false"%>




2.10 Servlet与内存使用

许多开发者随意地把大量信息保存到用户会话之中。一些时候,保存在会话中的对象没有及时地被垃圾回收机制回收。从性能上看,典型的症状是用户感到系统周期性地变慢,却又不能把原因归于任何一个具体的组件。如果监视JVM的堆空间,它的表现是内存占用不正常地大起大落。

解决这类内存问题主要有二种办法。第一种办法是,在所有作用范围为会话的Bean中实现HttpSessionBindingListener接口。这样,只要实现valueUnbound()方法,就可以显式地释放Bean使用的资源。

另外一种办法就是尽快地把会话作废。大多数应用服务器都有设置会话作废间隔时间的选项。另外,也可以用编程的方式调用会话的setMaxInactiveInterval()方法,该方法用来设定在作废会话之前,Servlet容器允许的客户请求的最大间隔时间,以秒计。

2.11 HTTP Keep-Alive

Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。市场上的大部分Web服务器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep-Alive功能对资源利用的影响尤其突出。

2.12 JDBC与Unicode

想必你已经了解一些使用JDBC时提高性能的措施,比如利用连接池、正确地选择存储过程和直接执行的SQL、从结果集删除多余的列、预先编译SQL语句,等等。

除了这些显而易见的选择之外,另一个提高性能的好选择可能就是把所有的字符数据都保存为Unicode(代码页13488)。Java以Unicode形式处理所有数据,因此,数据库驱动程序不必再执行转换过程。但应该记住:如果采用这种方式,数据库会变得更大,因为每个Unicode字符需要2个字节存储空间。另外,如果有其他非Unicode的程序访问数据库,性能问题仍旧会出现,因为这时数据库驱动程序仍旧必须执行转换过程。

2.13 JDBC与I/O

如果应用程序需要访问一个规模很大的数据集,则应当考虑使用块提取方式。默认情况下,JDBC每次提取32行数据。举例来说,假设我们要遍历一个5000行的记录集,JDBC必须调用数据库157次才能提取到全部数据。如果把块大小改成512,则调用数据库的次数将减少到10次。

在一些情形下这种技术无效。例如,如果使用可滚动的记录集,或者在查询中指定了FOR UPDATE,则块操作方式不再有效。

1.14 内存数据库

许多应用需要以用户为单位在会话对象中保存相当数量的数据,典型的应用如购物篮和目录等。由于这类数据可以按照行/列的形式组织,因此,许多应用创建了庞大的Vector或HashMap。在会话中保存这类数据极大地限制了应用的可伸缩性,因为服务器拥有的内存至少必须达到每个会话占用的内存数量乘以并发用户最大数量,它不仅使服务器价格昂贵,而且垃圾收集的时间间隔也可能延长到难以忍受的程度。

一些人把购物篮/目录功能转移到数据库层,在一定程度上提高了可伸缩性。然而,把这部分功能放到数据库层也存在问题,且问题的根源与大多数关系数据库系统的体系结构有关。对于关系数据库来说,运行时的重要原则之一是确保所有的写入操作稳定、可靠,因而,所有的性能问题都与物理上把数据写入磁盘的能力有关。关系数据库力图减少I/O操作,特别是对于读操作,但实现该目标的主要途径只是执行一套实现缓冲机制的复杂算法,而这正是数据库层第一号性能瓶颈通常总是CPU的主要原因。

一种替代传统关系数据库的方案是,使用在内存中运行的数据库(In-memory Database),例如TimesTen。内存数据库的出发点是允许数据临时地写入,但这些数据不必永久地保存到磁盘上,所有的操作都在内存中进行。这样,内存数据库不需要复杂的算法来减少I/O操作,而且可以采用比较简单的加锁机制,因而速度很快。

k3s cpu load 和 cpu 使用率很高处理 在这期间还执行过缩减 sqlite3 数据库操作,不知道是哪个操作起了作用,亦或者两个操作有影响,删除 ns 促进了数据库缩减的执行(没删除之前数据库缩减不成功,db文件大小未减小,但不确定是不是执行完 VACUUM 之后需要时间 db 文件才会减小,或者是因为删除了 ns 才导致其减小),再或者是两个操作都起了作用。kubectl get ns 发现有很多卡在删除状态的 ns。k3s 官网关于这个问题的谈论。执行如下脚本删除掉这些 ns。有人详细说过这个问题。 阅读详情

相关推荐

Unity内存优化:从崩溃到流畅的终极指南

Emscripten 为 WebAssembly 设定的内存布局(Static、Stack 和 Heap)为开发者提供了一个清晰的内存管理框架。理解这些内存区域的特性和用途,有助于开发者在 WebGL 项目中更有效地管理内存,优化性能,减少内存使用峰值。在 Unity WebGL 中,Dynamic Memory 是 UnityHeap 的主要组成部分,负责存储游戏运行时所需的各种数据。Dynamic Memory 主要分为两类:Managed Memory 和 Native Memory。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 334

Java性能优化技巧集锦

Java性能优化技巧集锦 摘要: =================================== 可供程序利用的资源(内存、CPU时间、网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。本文讨论的主要是如何提高代码的效率。 =================================== 提纲: =

My urban life 1490

MPICH2安装及MPI简介

MPICH2安装及MPI简介

10条网站易用性技巧

1. 给你的logo添加替代文本 这样有两个好处:屏幕阅读器能识别logo图片代表的含义,图片未加载到时,也能告诉非视障用户那里是你的logo。 几种方法: 1 <img src="logo.png" alt="前端界"> 或者,你用背景图来实现logo的话,也可以添加title属性来实现: 1 2 ...

weixin_30855099的博客 3160

[转载] Java 性能优化技巧集锦 (6)

http://tech.ccidnet.com/pub/article/c1077_a199225_p6.html5. 延迟重画操作对于图形用户界面的应用来说,性能低下的主要原因往往可以归结为重画屏幕的效率低下。当用户改变窗口大小或者滚动一个窗口时,这一点通常可以很明显地观察到。改变窗口大小或者滚动屏幕之类的操作导致重画屏幕事件大量地、快速地生成,甚至超过了相关代码的执行速度。对付这个问题最好的办

云雀的理想 1086

java实现大文件下载(http方式)

https://my.oschina.net/zmf/blog/336961

zhaoyang10的专栏 2万+

如何把笔记本变成显示器_显示器选购心得:细节篇

我买过、用过不少显示器了,当然也踩过很多的坑。这一次我想总结一下经验教训,写一写自己的一些心得。这一篇主要聊一聊不太容易注意到,但是我会非常留意的细节。内置电源还是外置电源所谓外置电源,就是显示器有一个单独的电源适配器(如下图);相应的,内置电源就是电源适配器坐在了显示器主体的内部,只要插一根交流电线就可以了。电源适配器买之前区分的方法也很简单,最直接的方法就是看“包装清单”中是否有“电源适配器”...

weixin_32968239的博客 2373

ubuntu显示器分辨率不对_苹果这款显示器到底是给谁用的?

众所周知,在苹果前几天的发布会上,除了最新的Mac Pro以外,还发布了一款号称XDR的显示器。虽然还没拿到真正的实体机,但很多人已经在思考,这款XDR显示器会对工作流程带来什么改变?干过项目的都知道,没什么比客户说:“为什么我屏幕上看到的画面,和在你那里看到的不一样”更让人怀疑人生了!显示设备颜色不一致问题,可能是现代电子科技行业最大的Bug了。然而,XDR显示器的出现,对于很多客户来说,也许会...

weixin_40001275的博客 304

揭秘各个显示器尺寸

  现在随着社会的发展,各种移动设备层出不穷,大大小小的浏览器眼花缭乱。这让我们这些专门写代码兼容各个浏览器大小的码农们无比郁闷。下面为大家介绍一下各个设备的显示器尺寸。   普屏液晶显示器专用壁纸大小:   1280×1024、1600×1200、1920×1440   16:10宽屏液晶专用壁纸:   1280×800、1440×900、1680×1050、1920×1200、2560...

jishublog 2637

【显示器闪烁】为什么显示器Fliker dB值越大,闪烁程度越轻?

本文介绍了显示器闪烁现象的产生原理和测量方法。TFT-LCD显示器通过电压变化控制液晶分子排列,当参考电压偏移时会导致30Hz以下的亮度波动,引发人眼可感知的闪烁。测量方法主要有两种:FMA法通过计算亮度波动交流/直流成分比值;JEITA法则分析频率成分并考虑人眼响应特性。JEITA法采用对数计算,数值越大(如-80dB)表示闪烁越轻。文章还解释了点反转式面板显示棋盘图案时更容易出现闪烁的原因,并提供了相关计算公式和测量流程说明。最终指出显示器闪烁值反映的是亮度波动程度,数值越大表示闪烁现象越轻微。

工业电子技术研读及分享 4558

win10一按右键就闪屏_电脑显示器经常出现闪屏怎么办

可能还有些网友对于电脑显示器经常出现闪屏的情况不太了解,、你们介绍电脑显示器经常出现闪屏的解决方法吧,希望能帮到大家哦! 电脑显示器经常出现闪屏的解决方法一:  1、如果大家是在玩游戏的时候,经常出现显示器闪屏,那么可能与游戏或者电脑配置有关,比如配置过低,无法满足游戏需求,大家不妨退出游戏看看是否会闪屏消失,如果不玩游戏不闪屏,那么基本可以说是游戏问题,您可以考虑下升级显卡驱动或者不玩...

weixin_35723435的博客 3万+

显示器分辨率

普屏液晶显示器专用壁纸: 1280×1024 壁纸 1600×1200 壁纸 1920×1440 壁纸 16:10宽屏液晶专用壁纸: 1280×800 宽屏壁纸 1440×900 宽屏壁纸 1680×1050 宽屏壁纸 1920×1200 宽屏壁纸 2560×1600 宽屏壁纸 16:9液晶和宽屏本本壁纸: 1280×720 宽屏壁纸 1366×768 宽屏壁纸 ...

iteye_13088的博客 753

如何选择液晶显示器

原文出处:老梁的博客     做程序员的天天都要盯着显示器,经常一看就是10几个小时。很显然,显示器质量的好坏对保护程序员的眼睛健康,具有非常重要的意义。那么怎样挑选显示器呢?我认为主要在于三点:背光技术、面板、显示控制电路。     背光技术     现在大多数的显示器厂商,往往片面的追求显示器亮度和对比度的提高,并不断的压缩成本。随之而来是显示器对用户眼睛健康的负面影响越来越大。以现

Cambridge 1167

电脑显示器常见故障解决方法

显示器用的时间长了,各种小毛病就会接踵而来。有时要解决这些小毛病办法也较为简单,用一对眼睛就可以看出故障的所在。    【画面抖动】   现象:电脑刚开机时显示器的画面抖动得很厉害,有时甚至连图标和文字也看不清,但过一两分钟之后就会回复正常。   应对:这种现象多发生在潮湿的天气,是显示器内部受潮的缘故。要彻底解决此问题,可使用食品包装中的防潮砂用棉线串起来,然后打开显示器的后盖,将防潮砂

u013053077的专栏 637

显示器参数内卷的时代,我为何会选择明基rd280u来编码?

给大家分享下明基RD280U显示器的使用体验。作为推荐算法方向的研究者,需要长时间处理代码、论文和数据,因此选择了这款针对程序员优化的28英寸显示器。RD280U的亮点包括:2K分辨率与分屏功能提升多任务效率、专业编程色彩模式增强文本清晰度、护眼技术(低蓝光+自动调光)缓解疲劳,以及Type-C一线连简化桌面布线。他认为这款显示器从实际场景出发,精准解决了程序员对高效显示与舒适度的需求,为细分领域设备设计提供了新思路。尽管价格偏高,但其针对性功能值得推荐。

克克克克业业的学习记录 1175

将低端文石电子书设备改造为电脑显示器的几次尝试

转念一想,我手上的有一台最近购入的文石book notex墨水屏电子书(2550购入,最近618期间降到了2380,悲)。但是,众所周知,文石使用的是开放的安卓系统。原理上,这需要平板将自己模拟为一个显示器设备,然后走typec的显示功能。另一个方案是,电脑hdmi输出,接hdmi采集卡转typec输出,模拟为usb摄像机。我的使用环境中,墨水屏和电脑在同一局域网内。从原理上分析,有线连接最好的情况,当然是typec接typec,将平板作为显示器。应用也不行,将电脑和平板上设为同一分辨率,居然会导致黑边。

weixin_43844408的博客 2192

电脑故障速排方法 - 显卡篇 - 显示器篇

 五、显卡         常见故障一:开机无显示   此类故障一般是因为显卡与主板接触不良或主板插槽有问题造成。对于一些集成显卡的主板,如果显存共用主内存,则需注意内存条的位置,一般在第一个内存条插槽上应插有内存条。由于显卡原因造成的开机无显示故障,开机后一般会发出一长两短的蜂鸣声(对于AWARD BIOS显卡而言)。         常见故障二:显示花屏,看不清字迹   此类故障一般是由于显示

依然行走 1634

实用小程序——C# 关闭显示器

平时工作时,有时候需要用纸笔来验算,或者看书什么的,这时候开着显示器,QQ一闪一闪的,总是分心。 于是我会关闭显示器,按下电源按钮,可我有2个显示器,每次都要关闭2个,比较麻烦,于是我就查找API,希望能一键关闭所有显示器。 原理很简单,就是掉一些Windows api而已,不过并不是没有技术难度的就没有意义,我这样一键关闭显示器,提高了我的效率,而且也省电,省事,很方便。 我这人不喜欢研究...

weixin_30333885的博客 257

显示器“刷新率”的通俗理解

本文以生动的“翻书动画”比喻,通俗解释了显示器刷新率(Hz)的本质及其与帧率(FPS)的区别。文章深入剖析了刷新率如何影响日常办公、游戏电竞、内容创作等不同场景下的视觉体验与操作跟手性,并提供了检查与设置刷新率的实用指南,帮助读者根据自身需求选择合适设备。

dropout6artist的博客 535

C#关闭显示器

windows为我们提供了一个API。可以实现即时关闭监视器。 此API在平台调用中,如下签名: [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, uint wPara...

weixin_30273501的博客 131
下一篇: struts+spring+hibernate快速入门
kernel_engine
博客等级 码龄21年 6粉丝 16原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值