starry

深入理解Three.js中正交摄像机OrthographicCamera

只愿长相守 提交于 2021-01-05 10:25:43
前言 在 深入理解Three.js中透视投影照相机PerspectiveCamera 那篇文章中讲解了透视投影摄像机的工作原理以及对应一些参数的解答,那篇文章中也说了会单独讲解 Three.js 中另一种常用的摄像机正交摄像机 OrthographicCamera ,这篇文章将会详细的讲解正交摄像机的工作原理和其对应参数的用法,当然,为了能够让读者更加直观的理解正交摄像机,我会制作一个与正交摄像机相关的 demo 来直观的让读者感受正交摄像机的魅力。 原理说明 深入理解Three.js中透视投影照相机PerspectiveCamera 文章中提到过正交摄像机和透视投影摄像机最大的区别是投影到的物体大小不受距离的影响,说直白点就是透视投影摄像机投影物体是通过点(下图a),相当于我们的眼睛,距离越远,能够看到的部分也就越小。正交摄像机投影物体是通过平面(下图b),无论距离有多远,投射到二维平面的线始终的是平行的,所以看上去就会感觉物体的大小没有受到任何影响。 正交摄像机参数说明 实现一个简单正交摄像机的代码如下: 1 var camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 ); 2 scene.add( camera ); new THREE

JVM垃圾回收详解

落花浮王杯 提交于 2020-12-17 06:47:31
通常,我们在写java程序的时候,似乎很少关注内存分配和垃圾回收的问题。因为,这部分工作,JVM已经帮我们自动实现了。 这样看起来,好像很美好,但是任何事情都有两面性。虽然JVM会自动的进行垃圾回收,但是,如果遇到有些问题,JVM自己也处理不了呢? 因此,我们需要了解一下JVM垃圾回收是怎样运作的,这样才能在遇到问题的时候,有的放矢。所以,今天就来聊一聊JVM的垃圾回收吧。 首先,思考一下,为什么需要进行垃圾回收? 我们知道,在创建对象的时候,Java会把对象的内容放到堆中。随着时间的推移,堆中的对象肯定会越来越多,但是,堆的大小是有限制的。如果,我们不进行垃圾回收,也就是把无用的对象进行清除和回收,那么JVM将不堪重负,最终导致内存泄漏。 既然我们需要进行垃圾回收,那么,首先得知道什么是垃圾。 在垃圾收集器对堆内存进行回收前,会先判断哪些对象还在“存活”,哪些对象已经“死去”(即不可能再被任何途径使用的对象),这些“死去”的对象,就是我们需要进行回收的垃圾。 那么,通过什么方式去判定是否为垃圾呢?(即判定对象是否存活) 引用计数算法(已淘汰) 引用计数算法,是指给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1,当引用失效时,计数器的值就减1。当计数器值为0时,该对象就会被回收。 可以说,引用计数算法的实现非常简单,判定效率也很高。但是,我们忽略了一个问题

Clarke Award for Imagination in Service to Society刘慈欣演讲

拥有回忆 提交于 2020-11-13 09:13:08
刘慈欣不无批评地写道( http://cn.chinadaily.com.cn/2018-11/12/content_37243853.htm ): 科幻的想象力由克拉克的广阔和深远,变成赛博朋克的狭窄和内向。 This reality is also reflected in science fiction. Arthur Clarke’s magnificent imagination about space has gradually faded away. People stopped looking at starry skies. In the sci-fi works today, there are more imagination about how we live in cyber utopia or dystopia. Writers focus more on various problems we encounter in reality. The imagination of science fiction is abandoning the vastness and profoundness that Arthur Clarke once opened up, instead people are now embracing the

正舵者两项存储应用取得好成绩受邀参加Filecoin官方线上应用生态展示

点点圈 提交于 2020-10-30 16:20:34
正舵者两项存储应用取得好成绩受邀参加 Filecoin官方线上应用生态展示2020年10月29日, Filecoin太空竞赛 slingshot赛段第一阶段结束庆典正式开启,正舵者技术团队受邀参Fi| econ官方线上应用生态展示。同时由正舵者技术团队提供技术支持的 Starry sky in Yunnan和Filecoin-Craw两项存储应用分别取得第十,第十五的好成绩。 Starry sky in Yunnan(云南星空)则是中国第一个天文数据入驻 Filelcoin网络,这批天气数据包括了图表、分析数据及图片等。所有气象天文数据由用户上传,只有数据所有者和数据所有者授权的用户才可以查看数据。为研究机构、大学院校、学生以及天文兴趣爱好者提供了Web3.0新的体验。Filecoin- Crawl的用户可以下载各种高质量的爬网数据、用户可以学习如何使用这些数据、新的高质量爬网薮据不断上传供用户使用及用户可以通过捐款的形式支持该项目的发展等。在接下来第二阶段的比赛中,正舵者将继续为建设Fⅰlectin生态做出自己的贡献。 来源: oschina 链接: https://my.oschina.net/u/4661461/blog/4696287

现在卖网课的都已经这么浮躁了吗?

为君一笑 提交于 2020-05-05 14:11:50
昨天,发生了一件非常有意思的事情。事情经过是这样的。。。 微信上有一个好友申请,备注是免费送学习资料的。对送资料我是不感冒的(因为我收藏的资料,我有信心比他的多)。但是,对于他是怎么获得我的微信这件事,我还是挺感兴趣的。 本着好奇的心态,我就同意了好友请求。我想搞清楚,这位是怎么知道我的联系方式的。 加了好友之后,对面主动说话了,问我是不是要学习资料的,我就客气的说了是的。然后,他给我发了一个网址,我一看腾讯课堂的,是一系列免费网课。 当即,我就明白过来是怎么回事了,这就是来卖网课的啊。别问我为什么知道。因为,我遇到类似的事情(套路)太多了。 像微信公众号或其他各种平台下边留一个二维码,让添加之后免费领取学习资料啥的。很多,都是套路。打着免费的旗号,实则是先吸引你,然后就开始给你安利他们的付费课。(哪有像我这么耿直的 boy 一样,是真正的免费送资料呢。咳咳。) 还有的套路更骚,先给你一些网上烂大街的资料。然后视频,就只有一点,比如 XX系列,就给个 XX(1),XX(2),后边的视频都没有了。如果,你不仔细看的话,这资料还真的挺像那么一回事。然后,你可能就会默默地让它躺在你的网盘里(反正是免费的嘛,不要白不要啊,我收藏先)。 我之前就遇到过这种,真的特别的烦人。你要么就免费给全套系列的,要么你就提前说明白了,这是付费课。别总是打着免费的旗号,送一些需要付费的课程。真的

Java类加载器和双亲委派机制

廉价感情. 提交于 2020-04-27 06:34:02
前言 之前详细介绍了Java类的整个加载过程( 类加载机制详解 )。虽然,篇幅较长,但是也不要被内容吓到了,其实每个阶段都可以用一句话来概括。 1)加载:查找并加载类的二进制字节流数据。 2)验证:保证被加载的类的正确性。 3)准备:为类的静态变量分配内存,并设置默认初始值。 4)解析:把类中的符号引用转换为直接引用。 5)初始化:为类的静态变量赋予正确的初始值。 当然,要想掌握类加载机制,还是需要去深入研究的。(好吧,说了一句正确的废话)因为其中,有很多知识点也是面试中常问的。比如,我之前去面试的时候,面试官就问到了一个和类初始化相关的问题。就是给一段代码,有父子类关系,父子类中包含静态代码块、构造代码块、普通代码块、构造函数等,然后让判断代码最终的执行顺序。(可自行思考一下,具体内容细节暂时不做扩展) 类加载器 终于来到了本文的主题 —— 类加载器和双亲委派机制。 在《深入理解Java虚拟机》中,对于类加载器的定义是这样的: 虚拟机设计团队把类加载阶段中的“通过一个类的权限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。 简单来说,类加载器的作用就是去加载class类的二进制字节流的。 类加载器有以下三种: 1)启动类加载器(Bootstrap ClassLoader)

为什么大家都说Java中只有值传递?

北慕城南 提交于 2020-04-18 10:01:51
最近跟Java中的值传递和引用传递杠上了,一度怀疑人生。查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递。也搞明白了,为什么大家都说Java只有值传递,没有引用传递。原来,我一直以来的认知都是错误的。。。 首先,需要了解一些概念性的东西。 形参与实参: 形参,是指在定义函数时使用的参数,目的是用于接收调用该函数时传入的参数。简单理解,就是所有函数(即方法)的参数都是形参。 实参,是指调用函数时,传递给函数的参数。 public static void main(String[] args) { int num = 3; printVal(num); //这里num是实参 } private static void printVal(int num) { num = 5; //这里num就是形参 } 值传递和引用传递 值传递:是指在调用函数时,将实际参数复制一份传递给函数,这样在函数中修改参数时,不会影响到实际参数。其实,就是在说值传递时,只会改变形参,不会改变实参。 引用传递:是指在调用函数时,将实际参数的地址传递给函数,这样在函数中对参数的修改,将影响到实际参数。 这里,需要特别强调的是,千万不要以为传递的参数是值就是值传递,传递的是引用就是引用传递。也不要以为传递的参数是基本数据类型就是值传递,传递的是对象就是引用传递。 这是大错特错的。以前的我

java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类

杀马特。学长 韩版系。学妹 提交于 2020-03-01 13:12:51
RamUsageEstimator,maven坐标: <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>4.0.0</version> </dependency> RamUsageEstimator就是根据java对象在堆内存中的存储格式, 通过计算Java对象头、实例数据、引用等的大小,相加而得,如果有引用,还能递归计算引用对象的大小。 RamUsageEstimator的源码并不多,几百行,清晰可读。这里不进行一一解读了。 它在初始化的时候会根据当前JVM运行环境、CPU架构、运行参数、是否开启指针压缩、JDK版本等综合计算对象头的大小,而实例数据部分则按照java基础数据类型的标准大小进行计算。 思路简单,同时也在一定程度上反映出了Java对象格式的奥秘! import java.util.List; import java.util.concurrent.atomic.AtomicLong; import lombok.extern.slf4j.Slf4j; import org.apache.lucene.util.RamUsageEstimator; import reactor.fn.tuple.Tuple2; import