前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[Gecko 渲染引擎]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
转载文章
...见即所得编辑器,由 Gecko 提供支持,Mozilla Firefox 中包含相同的渲染引擎。它是现在已经停止更新的 HTML 编辑器 Nvu 的衍生品,支持 HTML5 以及 CSS 的现代组件。 BlueGriffon 可用于大多数主要平台,包括 Windows 7、8 和 10,OS X >= 10.8,Ubuntu 16.04 32 位和64 位,支持简体中文。软件开源,用户使用手册是收费的。 开源协议:GPLv2 3、Firebug Firebug 是 Firefox 下的一款开发类插件,现属于 Firefox 的五星级强力推荐插件之一。它集 HTML 查看和编辑、Javascript 控制台、网络状况监视器于一体,是开发 JavaScript、CSS、HTML 和 Ajax 的得力助手。 Firebug 从各个不同的角度剖析 Web 页面内部的细节层面,给 Web 开发者带来很大的便利。 开源协议:BSD 4、Adobe Brackets Brackets 是 Adobe 的开源 HTML/CSS/JavaScript 集成开发环境。Brackets 当前为 Mac、Windows 以及 Linux (Debian/Ubuntu) 提供最新稳定版的二进制发布。 Brackets 是一个轻量级,但功能强大的文本编辑器。 它将可视化工具集成到编辑器中,以便在不影响创作过程的情况下获得所需的帮助。 开源协议:MIT 本文转自:https://www.oschina.net/ 更多内容请点击查看原文 本篇文章为转载内容。原文链接:https://blog.csdn.net/cocacola456/article/details/53432970。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-02-12 17:23:46
136
转载
c++
...,在高性能计算、游戏引擎开发等领域,函数模板结合模板元编程被广泛应用于优化代码执行效率,通过编译期计算生成针对性强、执行速度快的代码。近期一篇发表于《ACM通讯》的研究文章深入探讨了函数模板在实时渲染引擎中的实践应用,展示了如何利用模板特化实现对不同数据类型的高效处理,从而显著提升图形渲染性能。 此外,函数模板在泛型编程库如STL(Standard Template Library)的设计和使用中更是不可或缺,新版C++标准库也不断优化和新增模板类与函数以适应更多复杂场景的需求。因此,对于热衷于提升代码质量、追求极致性能以及探索现代C++编程技巧的开发者来说,持续关注函数模板及其相关领域的最新研究进展具有极高的价值和时效性。
2023-09-27 10:22:50
552
半夏微凉_t
转载文章
...,如增强的高性能图形渲染引擎、对高清屏幕的支持以及与Java 17 LTS版本的紧密集成。同时,开源社区也在积极研发各种UI框架,以适应跨平台和云原生环境的需求,例如JPro和GluonHQ推出的解决方案,它们不仅支持桌面应用,还扩展到了移动设备和Web端。 对于Swing爱好者和遗留系统维护者来说,尽管Swing的主流地位已被JavaFX逐渐取代,但其在特定场景下仍有不可替代的价值。IBM Developer网站上的一篇技术文章就详细讨论了如何在现代化环境中优化Swing应用,包括性能调优、与JavaFX组件的混合使用策略以及利用最新JVM特性进行兼容性升级。 此外,随着现代IDE如IntelliJ IDEA功能的不断丰富和完善,GUI设计工具链也在持续迭代,使得开发者能够更加便捷高效地设计和实现复杂用户界面。例如,JetBrains官方博客中关于使用IntelliJ IDEA GUI Designer设计Swing和JavaFX应用程序的文章,提供了大量实用技巧和最佳实践,值得开发者深入阅读和学习。 最后,针对ScrcpyController这一具体应用场景,可以关注其背后的开源项目Scrcpy的发展动态。Scrcpy作为一款流行的Android设备无线控制工具,已通过众多开发者为其开发GUI前端来提升用户体验,这其中就涉及到了Swing和JavaFX等技术的实际运用,而这些实践经验和代码示例无疑为Java GUI开发者提供了宝贵的学习资源。
2023-05-01 10:38:51
437
转载
CSS
...也就是Safari的渲染引擎。在WebKit中,有一个名为-webkit-overflow-scrolling的样式属性,可以用来改变滚动条的行为。 这个属性的取值有三种:touch、auto和momentum。这其中呢,"touch"这个选项意味着你要通过手指触摸滚动条来让它滚动起来,就像滑手机屏幕那样。"auto"这个模式就比较智能了,它让系统自动判断并决定滚动条啥时候该出现、啥时候该滚动,一切都交给系统自己做主。而"momentum"这个设定就更有意思啦,就像是滚动条有了自己的“冲劲儿”,一旦滚动起来就会保持一定的速度滑动下去,有点像物理中的惯性滚动效果~ 所以,如果我们想要在iOS设备上正常显示overflow-x:auto的滚动条,就需要同时满足两个条件: 1. 设置overflow-x:auto 2. 使用-webkit-overflow-scrolling:touch样式属性 三、代码示例 接下来,我们就来看几个具体的例子,分别演示如何在不同的情况下使用这两个属性。 首先是不设置-webkit-overflow-scrolling:touch的情况: html 1 2 3 4 5 6 7 8 9 10 11 12 这段代码会在一个200px宽的div中创建一个表格,表格的每列都有四个单元格,这样当表格内容超出宽度时,就会出现滚动条。 然后是只设置了-webkit-overflow-scrolling:touch的情况: html 1 2 3 4 5 6 7 8 9 10 11 12 这段代码与上面的例子基本相同,只是多了一个-webkit-overflow-scrolling:touch样式属性。 最后是同时设置了overflow-x:auto和-webkit-overflow-scrolling:touch的情况: html 1 2 3 4 5
2023-09-29 12:02:28
520
心灵驿站_t
转载文章
...望进一步探索现代图形渲染技术的最新进展和实践,以下是一些值得深入阅读的延伸内容: 近期,随着硬件性能的提升,实时渲染领域出现了许多创新。例如,DirectX 12 Ultimate引入了可变速率着色(Variable Rate Shading, VRS)技术,它允许GPU根据不同场景区域的重要性分配不同的着色率,从而提高渲染效率并优化性能表现。这项技术对游戏开发者来说具有重要意义,因为它能够在不牺牲画质的前提下实现更流畅的游戏体验。 同时,光线追踪作为近年来图形学领域的重大突破,已被纳入DirectX API中,并在NVIDIA RTX系列显卡上得到广泛应用。通过模拟真实世界的光线行为,光线追踪能够生成更为逼真细腻的光影效果,极大地提升了三维场景的真实感。 此外,针对三维建模与动画制作软件,Blender项目持续进行功能更新,支持多种坐标系统并整合了基于物理的渲染引擎Cycles。用户不仅可以在其中创建复杂的三维模型,还能利用内置的高级着色器进行法线贴图、置换贴图等复杂纹理处理,以及实现PBR材质以满足更高标准的视觉需求。 在理论研究方面,学者们正在深入探讨四元数在图形旋转、插值运算等方面的优化算法,力图挖掘其在实时渲染、虚拟现实和增强现实环境中的潜在价值。一些前沿研究甚至将四元数应用于机器学习与人工智能驱动的动画系统中,以实现更加自然、连贯的动作捕捉与运动预测。 综上所述,无论是实时渲染技术的发展、硬件特性的革新,还是三维设计工具的进步,都在不断推动三维坐标系与几何学在计算机图形学中的实际应用向着更高效、更真实的方向发展。关注这些领域的最新动态和技术成果,无疑将有助于您更好地掌握三维图形编程的未来趋势及其实现方法。
2023-10-24 12:49:42
271
转载
转载文章
...7 内容简介 《游戏引擎架构》同时涵盖游戏引擎软件开发的理论及实践,并对多方面的题目进行探讨。本书讨论到的概念及技巧实际应用于现实中的游戏工作室,如艺电及顽皮狗。虽然书中采用的例子通常依据一些专门的技术,但是讨论范围远超于某个引擎或API。文中的参考及引用也非常有用,可让读者继续深入游戏开发过程的任何特定方向。 《游戏引擎架构》为一个大学程度的游戏编程课程而编写,但也适合软件工程师、业余爱好者、自学游戏程序员,以及游戏产业的从业人员。通过阅读《游戏引擎架构》,资历较浅的游戏工程师可以巩固他们所学的游戏技术及引擎架构的知识,专注某一领域的资深程序员也能从本书更为全面的介绍中获益。 內容包括: 游戏开发中的大规模C++软件架构 游戏编程所需的数学 供调试、源代码控制及性能剖析的游戏开发工具 引擎基础系统、渲染、碰撞、物理、角色动画、游戏世界对象模型等引擎子系统 多平台游戏引擎 多处理器环境下的游戏编程 工作管道及游戏资产数据库 作者/译者简介 作者介绍:Jason Gregory在1994年开始任职专业软件工程师,自1999年3月开始在游戏产业中任职软件工程师。在圣迭哥Midway Home Entertainment公司开始游戏编程的他,为《疯狂飞行员(Freaky Flyers)》及《Crank the Weasel》开发PlayStation 2/Xbox上的动画系统。在2003年,他转到洛杉矶艺电,为《荣誉勋章:血战太平洋(Medal of Honor: Pacific Assault)》开发游戏引擎及游戏性技术,并在《荣誉勋章:空降神兵(Medal of Honor: Airborne)》中担任首席工程师。他现时是顽皮狗公司的通才程序员,为《神秘海域:德雷克船长的宝藏(Uncharted: Drake's Fortune)》及《神秘海域:纵横四海(Uncharted: Among Thieves)》开发引擎及游戏性软件。他也在南加州大学教授游戏技术的课程。 译者简介:叶劲峰(Milo Yip)从小自习编程,并爱好计算机图形学。上中学时兼职开发策略RPG《王子传奇》,该游戏在1995年于台湾发行。其后他获取了香港大学认知科学学士、香港中文大学系统工程及工程管理哲学硕士。毕业后在香港理工大学设计学院从事游戏引擎及相关技术的研发,职至项目主任。除发表学术文章外,也曾合著《DirectX9游戏编程实务》。2008年往上海育碧担任引擎工程师开发《美食从天而降(Cloudy with a Chance of Meatballs)》Xbox360/PS3/Wii/PC,2009年起于麻辣马开发《爱丽丝:疯狂回归(Alice: Madness Returns)》Xbox360/PS3/PC,2011年加入腾讯互动娱乐引擎技术中心担任专家工程师,所研发的技术已用于《斗战神》、《天涯明月刀》、《众神争霸》等项目中。 推荐序1 最初拿到《Game Engine Architecture》一书的英文版,是编辑侠少邮寄给我的打印版。他建议我接下翻译此书的合同。当时我正在杭州带领一个团队开发3D游戏引擎,我和我的同事都对这本书的内容颇有兴趣,两大本打印的英文书立刻在同事间传开。可惜那段时间个人精力顾及不来,把近千页的英文读物精读而后翻译成中文对个人的业余时间是个极大的挑战,不能担此翻译任务颇为遗憾。 不久以后听说Milo Yip(叶劲峰)已开始着手翻译,甚为欣喜。翻译此巨著,他一定是比我更合适的人选。我和Milo虽未曾蒙面,但神交已久。在网络上读过一些他的成长经历,和我颇为相似,心有戚戚。他对游戏3D实时渲染技术研究精深为我所不及,我们曾通过Google Talk讨论过许多技术问题,他都有独到的见解。翻译工作开始后,Milo是香港人,英文技术术语在香港的中文译法和大陆的有许多不同。但此书由大陆出版社出版,考虑到面对的读者主要是大陆程序员,Milo希望能更符合大陆程序员的用词习惯,所以在翻译一开始就通过Google Docs创建了协作页面,邀请大家共同探讨书中技术名词的中译名。从中我们可以一窥他作为译者的慎重。 三年之后,有幸在出版之前就拿到了完整的译本。这是一本用LaTeX精心排版的800页的电子书,我只花了一周时间,几乎是一口气读完。流畅的阅读享受,绝对不仅仅是因为原著精彩的内容,精美的版面和翔实的译注也加了不少分。 在阅读本书的过程中,我不只一次地获得共鸣。例如在第5章的内存管理系统的介绍中,作者介绍的几种游戏特有的内存管理方法我都曾在项目中用过,而这是第一次有书籍专门将这些方法详尽记录;又如第11章动画系统的介绍,我们也同样在3D引擎开发过程中改进原有动画片段混合方法的经历。虽然书中介绍的每个技术点,都可能可以在某篇论文,某本其他的书的章节,某篇网络blog上见过,但之前却无一本书可以把这些东西放在一起相互参照。对于从事游戏引擎开发的程序员来说,了解各种引擎在处理每个具体问题时的方案是相当重要的。而每种方案又各有利弊,即使不做引擎开发工作而是在某一特定游戏引擎上做游戏开发,从中也可以理解引擎的局限性以及可能的改进方法。尤其是第14章介绍的对游戏性相关系统的设计,各个开发人员几乎都是凭经验设计,很少见有书籍对这些做总结。对于基于渲染引擎做开发的游戏程序员,这是必须面对的工作,这一章会有很大的借鉴意义。 本书作者是业内资深的游戏引擎开发人,他所参于的《神秘海域》和《最后生还者》都是我的个人最爱。在玩游戏的过程中,作为游戏程序员的天性,自然会不断地猜想各个技术点是如何实现的,背后需要怎样的工具支持。能在书中一一得到印证是件特别开心的事情。作者反复强调代码实践的重要性,在书中遍布着C++代码。我不认为这些代码有直接取来使用的价值,但它们极大地帮助了读者理解书中的技术点。书中列出的顽皮狗工作室用lisp方言作为游戏配置脚本的范例也给我很大的启发,有了这些具体的代码示例以及作者本身的一线工程师背景,也让我确信书中那些关于主机游戏开发相关等,我所没有接触过的内容都也绝非泛泛而谈。 国内的游戏开发社区的壮大,主要是随最近十年的MMO风潮而生。而就在大型网络游戏在中国有些畸形发展,让这类游戏偏离电子游戏游戏性的趋势时,我们有幸迎来了为移动设备开发游戏的大潮。游戏开发的重心重新回到游戏性本身。我们更需要去借鉴单机游戏是如何为玩家带来更纯粹的游戏体验,我相信书中记录的各种技术点会变的更有帮助。 资深游戏开发及创业者 云风 @简悦云风 推荐序2 在我认识的许多游戏业开发同仁中,只有少数香港同胞,Milo Yip(叶劲峰)却正是这样一位给我印象非常深刻的优秀香港游戏开发者。我俩认识,是在Milo加入腾讯互动娱乐研发部引擎技术中心后,说来到现在也只是两年多时间。其间,他为人的谦逊务实,对待技术问题的严谨求真态度,对算法设计和性能优化的娴熟技术,都为人所称道。Milo一丝不苟的工作风格,甚至表现在对待技术文档排版这类事情上(Milo常执著地用LaTeX将技术文档排到完美),我想这一定是他在香港读大学、硕士及在香港理工大学的多媒体创新中心从事研究员,一贯沿袭至今的好作风。 我很高兴腾讯游戏有实力吸引到这样优秀的技术专家;即使在其已从上海迁回香港家中,依然选择到深圳腾讯互动娱乐总部工作。叶兄从此工作日每天早晚过关,来往香港和深圳两地,虽有舟车劳顿,但是兼顾了对家庭的照顾和在游戏引擎方面的专业研究,希望这样的状况是令他满意的。 认识叶兄当时,我便知道他在进行Jason Gregory所著《游戏引擎架构》一书的中译工作。因为自己从前也有业余翻译游戏开发有关书籍的经历,所以我能理解其中的辛苦和责任重大,对叶兄也更多一分钦佩。我以为,本书以及本书的中文读者最大的幸运便是,遇到叶兄这位对游戏有着如同对家对国般强烈责任感,犹如“游戏科学工作者”般的专业译者! 现在(2013年年末)无疑是游戏史上对独立游戏制作者最友好的年代。开发设备方便获得(相对过往仅由主机厂商授权才能获得专利开发设备,现在有一台智能手机和一台个人电脑就可以开发)、技术工具友好、调试过程简单方便,且互联网上有丰富的例程和开源代码参考,也有网上社区便于交流。很多爱好者能够很快地制作出可运行的游戏原型,其中一些也能发布到应用商店。 但是不全面掌握各方面知识,尤其是游戏引擎架构知识,往往只能停留在勉强修改、凑合重用别人提供的资源的应用程度上,难以做极限的性能改进,更妄谈革命式的架构创新。这样的程度是很难在成千上万的游戏中脱颖而出的。我们所认可的真正的游戏大作,必定是在某方面大幅超越用户期待的产品。为了打造这样的产品,游戏内容创作者(策划、美术等)需要“戴着镣铐跳舞”(在当前的机能下争取更多的创作自由度),而引擎架构合理的游戏可以经得起──也值得进行──反复优化,最终可以提供更多的自由度,这是大作出现的技术前提。 书的作者、译者、出版社的编者,加上读者,大家是因书而结缘的有缘人。因叶兄这本《游戏引擎架构》译著而在线上线下相识的读者们,你们是不是因“了解游戏引擎架构,从而制作/优化好游戏”这样的理想而结了缘呢? 亲爱的读者,愿你的游戏有一天因谜题巧妙绝伦、趣味超凡、虚拟世界气势磅礴、视觉效果逼真精美等专业因素取得业界褒奖,并得到玩家真诚的赞美。希望届时曾读叶兄这本《游戏引擎架构》译作的你,也可以回馈社会,回馈游戏开发的学习社区,帮助新人。希望你也可以建立微信公众号、博客等,或翻译游戏开发书籍,造福外语不好的读者,所以如果你的外语(英语、日语、韩语之于游戏行业比较重要)水平仍需精进,现在也可以同步加油了! 腾讯《天天爱消除》游戏团队Leader 沙鹰 @也是沙鹰 译序 数千年以来,艺术家们通过文学、绘画、雕塑、建筑、音乐、舞蹈、戏剧等传统艺术形式充实人类的精神层面。自20世纪中叶,计算机的普及派生出另一种艺术形式──电子游戏。游戏结合了上述传统艺术以及近代科技派生的其他艺术(如摄影、电影、动画),并且完全脱离了艺术欣赏这种单向传递的方式──游戏必然是互动的,“玩家”并不是“读者”、“观众”或“听众”,而是进入游戏世界、感知并对世界做出反应的参与者。 基于游戏的互动本质,游戏的制作通常比其他大众艺术复杂。商业游戏的制作通常需要各种人才的参与,而他们则需要依赖各种工具及科技。游戏引擎便是专门为游戏而设计的工具及科技集成。之所以称为引擎,如同交通工具中的引擎,提供了最核心的技术部分。因为复杂,研发成本高,人们不希望制作每款游戏(或车款)时都重新设计引擎,重用性是游戏引擎的一个重要设计目标。 然而,各游戏本身的性质以及平台的差异,使研发完全通用的游戏引擎变得极困难,甚至不可能。市面上出售的游戏引擎,有一些虽然已经达到很高的技术水平,但在商业应用中,很多时候还是需要因应个别游戏项目对引擎改造、整合、扩展及优化。因此,即使能使用市面上最好的商用引擎或自研引擎,我们仍需要理解当中的架构、各种机制和技术,并且分析及解决在制作中遇到的问题。这些也是译者曾任于上海两家工作室时的主要工作范畴。 选择翻译此著作,主要原因是在阅读中得到共鸣,并且能知悉一些知名游戏作品实际上所采用的方案。有感坊间大部分游戏开发书籍并不是由业内人士执笔,内容只足够应付一些最简单的游戏开发,欠缺宏观比较各种方案,技术与当今实际情况也有很大差距。而一些Gems类丛书虽然偶有好文章,但受形式所限欠缺系统性、全面性。难得本书原作者身为世界一流游戏工作室的资深游戏开发者(注1),在繁重的游戏开发工作外,还在大学教授游戏开发课程以至编写本著作。此外,从与内地同事的交流中,了解到许多从业者不愿意阅读外文书籍。为了普及知识及反馈业界社会,希望能尽绵力。 或许有些人以为本著作是针对单机/游戏机游戏的,并不适合国内以网游为主的环境。但译者认为这是一种误解,许多游戏本身所涉及的技术是具通用性的。例如游戏性相关的游戏性系统、场景管理、人工智能、物理模拟等部分,许多时候也会同时用于网游的前台和后台。现时,一些动作为主、非MMO的国内端游甚至会直接在后台运行传统意义上的游戏引擎。至于前台相关的技术,单机和端游的区别更少。此外,随着近年移动终端的兴起,其硬件性能已超越传统掌上游戏机,开发手游所需的技术与传统掌上游戏机并无太大差异。还可预料,现时单机/游戏机的一些较高级的架构及技术,将在不远的未来着陆移动终端平台。 译者认为,本书涵括游戏开发技术的方方面面,同时适合入门及经验丰富的游戏程序员。书名中的架构二字,并不单是给出一个系统结构图,而是描述每个子系统的需求、相关技术及与其他子系统的关系。对译者本人而言,本书的第11章(动画系统)及第14章(运行时游戏性基础系统)是本书特別精彩之处,含有许多少见于其他书籍的内容。而第10章(渲染引擎)由于是游戏引擎中的一个极大的部分,有限的篇幅可能未能覆盖广度及深度,推荐读者参考[1](注2),人工智能方面也需参考其他专著。 本译作采用LaTeX排版(注3),以Inkscape编译矢量图片。为了令阅读更流畅,内文中的网址都统一改以脚注标示。另外,由于现时游戏开发相关的文献以英文为主,而且游戏开发涉及的知识面很广,本译作尽量以括号形式保留英文术语。为了方便读者查找内容,在附录中增设中英文双向索引(索引条目与原著的不同)。 本人在香港成长学习及工作,至2008年才赴内地游戏工作室工作,不黯内地的中文写作及用字习惯,翻译中曾遇到不少困难。有幸得到出版社人员以及良师益友的帮助,才能完成本译作。特别感谢周筠老师支持本作的提案,并耐心地给予协助及鼓励。编辑张春雨老师和卢鸫翔老师,以及好友余晟给予了大量翻译上的知识及指导。也感谢游戏业界专家云风、大宝和Dave给予了许多宝贵意见。此书的翻译及排版工作比预期更花时间,感谢妻子及儿女们的体谅。此次翻译工作历时三年半,因工作及家庭事宜导致严重延误,唯有在翻译及排版工作上更尽心尽力,希望求得等待此译作的读者们谅解。无论是批评或建议,诚希阁下通过电邮miloyip@gmail.com、新浪微博、豆瓣等渠道不吝赐教。 叶劲峰(Milo Yip) 2013年10月 原作者是顽皮狗(Naughty Dog)《神秘海域(Uncharted)》系列的通才程序员、《最后生还者(The Last of Us)》的首席程序员,之前还曾在EA和Midway工作。 中括号表示引用附录中的参考文献。一些参考条目加入了其中译本的信息。 具体是使用CTEX套装,它是在MiKTeX的基础上增加中文的支持。 前言 最早的电子游戏完全由硬件构成,但微处理器(microprocessor)的高速发展完全改变了游戏的面貌。现在的游戏是在多用途的PC和专门的电子游戏主机(video game console)上玩的,凭借软件带来绝妙的游戏体验。从最初的游戏诞生至今已有半个世纪,但很多人仍然认为游戏是一个未成熟的产业。即使游戏可能是个年轻的产业,若仔细观察,也会发现它正在高速发展。 现时游戏已成为一个上百亿美元的产业,覆盖不同年龄、性别的广泛受众。 千变万化的游戏,可以分为从纸牌游戏到大型多人在线游戏(massively multiplayer online game,MMOG)等多个种类(category)和“类型(genre)”(注1),也可以运行在任何装有微芯片(microchip)的设备上 。你现在可以在PC、手机及多种特别为游戏而设计的手持/电视游戏主机上玩游戏。家用电视游戏通常代表最尖端的游戏科技,又由于它们是周期性地推出新版本,因此有游戏机“世代”(generation)的说法。最新一代(注2)的游戏机包括微软的Xbox 360和索尼的PlayStation 3,但一定不可忽视长盛不衰的PC,以及最近非常流行的任天堂Wii。 最近,剧增的下载式休闲游戏,使这个多样化的商业游戏世界变得更复杂。虽然如此,大型游戏仍然是一门大生意。今天的游戏平台非常复杂,有难以置信的运算能力,这使软件的复杂度得以进一步提升。所有这些先进的软件都需要由人创造出来,这导致团队人数增加,开发成本上涨。随着产业变得成熟,开发团队要寻求更好、更高效的方式去制作产品,可复用软件(reusable software)和中间件(middleware)便应运而生,以补偿软件复杂度的提升。 由于有这么多风格迥异的游戏及多种游戏平台,因此不可能存在单一理想的软件方案。然而,业界已经发展出一些模式 ,也有大量的潜在方案可供选择。现今的问题是如何找到一个合适的方案去迎合某个项目的需要。再进一步,开发团队必须考虑项目的方方面面,以及如何把各方面集成。对于一个崭新的游戏设计,鲜有可能找到一个完美搭配游戏设计各方面的软件包。 现时业界内的老手,入行时都是“开荒牛”。我们这代人很少是计算机科学专业出身(Matt的专业是航空工程、Jason的专业是系统设计工程),但现时很多学院已设有游戏开发的课程和学位。时至今日,为了获取有用的游戏开发信息,学生和开发者必须找到好的途径。对于高端的图形技术,从研究到实践都有大量高质量的信息。可是,这些信息经常不能直接应用到游戏的生产环境,或者没有一个生产级质量的实现。对于图形以外的游戏开发技术,市面上有一些所谓的入门书籍,没提及参考文献就描述很多内容细节,像自己发明的一样。这种做法根本没有用处,甚至经常带有不准确的内容。另一方面,市场上有一些高端的专门领域书籍,例如物理、碰撞、人工智能等。可是,这类书或者啰嗦到让你难以忍受,或者高深到让部分读者无法理解,又或者内容过于零散而难于融会贯通。有一些甚至会直接和某项技术挂钩,软硬件一旦改动,其内容就会迅速过时。 此外,互联网也是收集相关知识的绝佳工具。可是,除非你确实知道要找些什么,否则断链、不准确的资料、质量差的内容也会成为学习障碍。 好在,我们有Jason Gregory,他是一位拥有在顽皮狗(Naughty Dog)工作经验的业界老手,而顽皮狗是全球高度瞩目的游戏工作室之一。Jason在南加州大学教授游戏编程课程时,找不到概括游戏架构的教科书。值得庆幸的是,他承担了这个任务,填补了这个空白。 Jason把应用到实际发行游戏的生产级别知识,以及整个游戏开发的大局编集于本书。他凭经验,不仅融汇了游戏开发的概念和技巧,还用实际的代码示例及实现例子去说明怎样贯通知识来制作游戏。本书的引用及参考文献可以让读者更深入探索游戏开发过程的各方面。虽然例子经常是基于某些技术的,但是概念和技巧是用来实际创作游戏的,它们可以超越个别引擎或API的束缚。 本书是一本我们入行做游戏时想要的书。我们认为本书能让入门者增长知识,也能为有经验者开拓更大的视野。 Jeff Lander(注3) Matthew Whiting(注4) 译注:Genre一词在文学中为体裁。电影和游戏里通常译作类型。不同的游戏类型可见1.2节。 译注:按一般说法,2005年至今属于第7个游戏机世代。这3款游戏机的发行年份为Xbox 360(2005)、PlayStation 3(2006)、Wii(2006)。有关游戏机世代可参考维基百科。 译注:Jeff Lander现时为Darwin 3D公司的首席技术总监、Game Tech公司创始人,曾为艺电首席程序员、Luxoflux公司游戏性及动画技术程序员。 译注:Matthew Whiting现时为Wholesale Algorithms公司程序员,曾为Luxoflux公司首席软件工程师、Insomniac Games公司程序员。 序言 欢迎来到《游戏引擎架构》世界。本书旨在全面探讨典型商业游戏引擎的主要组件。游戏编程是一个庞大的主题,有许多内容需要讨论。不过相信你会发现,我们讨论的深度将足以使你充分理解本书所涵盖的工程理论及常用实践的方方面面。话虽如此,令人着迷的漫长游戏编程之旅其实才刚刚启程。与此相关的每项技术都包含丰富内容,本书将为你打下基础,并引领你进入更广阔的学习空间。 本书焦点在于游戏引擎的技术及架构。我们会探讨商业游戏引擎中,各个子系统的相关理论,以及实现这些理论所需要的典型数据结构、算法和软件接口。游戏引擎与游戏的界限颇为模糊。我们将把注意力集中在引擎本身,包括多个低阶基础系统(low-level foundation system)、渲染引擎(rendering engine)、碰撞系统(collision system)、物理模拟(physics simulation)、人物动画(character animation),及一个我称为游戏性基础层(gameplay foundation layer)的深入讨论。此层包括游戏对象模型(game object model)、世界编辑器(world editor)、事件系统(event system)及脚本系统(scripting system)。我们也将会接触游戏性编程(gameplay programming)的多个方面,包括玩家机制(player mechanics)、摄像机(camera)及人工智能(artificial intelligence,AI)。然而,这类讨论会被限制在游戏性系统和引擎接口范围。 本书可以作为大学中等级游戏程序设计中两到三门课程的教材。当然,本书也适合软件工程师、业余爱好者、自学的游戏程序员,以及游戏行业从业人员。通过阅读本书,资历较浅的游戏程序员可以巩固他们所学的游戏数学、引擎架构及游戏科技方面的知识。专注某一领域的资深程序员也能从本书更为全面的介绍中获益。 为了更好地学习本书内容,你需要掌握基本的面向对象编程概念并至少拥有一些C++编程经验。尽管游戏行业已经开始尝试使用一些新的、令人兴奋的编程语言,然而工业级的3D游戏引擎仍然是用C或C++编写的,任何认真的游戏程序员都应该掌握C++。我们将在第3章重温一些面向对象编程的基本原则,毫无疑问,你还会从本书学到一些C++的小技巧,不过C++的基础最好还是通过阅读[39]、[31]及[32]来获得。如果你对C++已经有点生疏,建议你在阅读本书的同时,最好能重温这几本或者类似书籍。如果你完全没有C++经验,在看本书之前,可以考虑先阅读[39]的前几章,或者尝试学习一些C++的在线教程。 学习编程技能最好的方法就是写代码。在阅读本书时,强烈建议你选择一些特别感兴趣的主题付诸实践。举例来说,如果你觉得人物动画很有趣,那么可以首先安装OGRE,并测试一下它的蒙皮动画示范。接着还可以尝试用OGRE实现本书谈及的一些动画混合技巧。下一步你可能会打算用游戏手柄控制人物在平面上行走。等你能玩转一些简单的东西了,就应该以此为基础,继续前进!之后可以转移到另一个游戏技术范畴,周而复始。这些项目是什么并不重要,重要的是你在实践游戏编程的艺术,而不是纸上谈兵。 游戏科技是一个活生生、会呼吸的家伙 ,永远不可能将之束缚于书本之上 。因此,附加的资源、勘误、更新、示例代码、项目构思等已经发到本书的网站。 目录 推荐序1 iii推荐序2 v译序 vii序言 xvii前言 xix致谢 xxi第一部分 基础 1第1章 导论 31.1 典型游戏团队的结构 41.2 游戏是什么 71.3 游戏引擎是什么 101.4 不同游戏类型中的引擎差异 111.5 游戏引擎概观 221.6 运行时引擎架构 271.7 工具及资产管道 46第2章 专业工具 532.1 版本控制 532.2 微软Visual Studio 612.3 剖析工具 782.4 内存泄漏和损坏检测 792.5 其他工具 80第3章 游戏软件工程基础 833.1 重温C++及最佳实践 833.2 C/C++的数据、代码及内存 903.3 捕捉及处理错误 118第4章 游戏所需的三维数学 1254.1 在二维中解决三维问题 1254.2 点和矢量 1254.3 矩阵 1394.4 四元数 1564.5 比较各种旋转表达方式 1644.6 其他数学对象 1684.7 硬件加速的SIMD运算 1734.8 产生随机数 180第二部分 低阶引擎系统 183第5章 游戏支持系统 1855.1 子系统的启动和终止 1855.2 内存管理 1935.3 容器 2085.4 字符串 2255.5 引擎配置 234第6章 资源及文件系统 2416.1 文件系统 2416.2 资源管理器 251第7章 游戏循环及实时模拟 2777.1 渲染循环 2777.2 游戏循环 2787.3 游戏循环的架构风格 2807.4 抽象时间线 2837.5 测量及处理时间 2857.6 多处理器的游戏循环 2967.7 网络多人游戏循环 304第8章 人体学接口设备(HID) 3098.1 各种人体学接口设备 3098.2 人体学接口设备的接口技术 3118.3 输入类型 3128.4 输出类型 3168.5 游戏引擎的人体学接口设备系统 3188.6 人体学接口设备使用实践 332第9章 调试及开发工具 3339.1 日志及跟踪 3339.2 调试用的绘图功能 3379.3 游戏内置菜单 3449.4 游戏内置主控台 3479.5 调试用摄像机和游戏暂停 3489.6 作弊 3489.7 屏幕截图及录像 3499.8 游戏内置性能剖析 3499.9 游戏内置的内存统计和泄漏检测 356第三部分 图形及动画 359第10章 渲染引擎 36110.1 采用深度缓冲的三角形光栅化基础 36110.2 渲染管道 40410.3 高级光照及全局光照 42610.4 视觉效果和覆盖层 43810.5 延伸阅读 446第11章 动画系统 44711.1 角色动画的类型 44711.2 骨骼 45211.3 姿势 45411.4 动画片段 45911.5 蒙皮及生成矩阵调色板 47111.6 动画混合 47611.7 后期处理 49311.8 压缩技术 49611.9 动画系统架构 50111.10 动画管道 50211.11 动作状态机 51511.12 动画控制器 535第12章 碰撞及刚体动力学 53712.1 你想在游戏中加入物理吗 53712.2 碰撞/物理中间件 54212.3 碰撞检测系统 54412.4 刚体动力学 56912.5 整合物理引擎至游戏 60112.6 展望:高级物理功能 616第四部分 游戏性 617第13章 游戏性系统简介 61913.1 剖析游戏世界 61913.2 实现动态元素:游戏对象 62313.3 数据驱动游戏引擎 62613.4 游戏世界编辑器 627第14章 运行时游戏性基础系统 63714.1 游戏性基础系统的组件 63714.2 各种运行时对象模型架构 64014.3 世界组块的数据格式 65714.4 游戏世界的加载和串流 66314.5 对象引用与世界查询 67014.6 实时更新游戏对象 67614.7 事件与消息泵 69014.8 脚本 70714.9 高层次的游戏流程 726第五部分 总结 727第15章 还有更多内容吗 72915.1 一些未谈及的引擎系统 72915.2 游戏性系统 730参考文献 733中文索引 737英文索引 755 参考文献 Tomas Akenine-Moller, Eric Haines, and Naty Hoffman. Real-Time Rendering (3rd Edition). Wellesley, MA: A K Peters, 2008. 中译本:《实时计算机图形学(第2版)》,普建涛译,北京大学出版社,2004. Andrei Alexandrescu. Modern C++ Design: Generic Programming and Design Patterns Applied. Resding, MA: Addison-Wesley, 2001. 中译本:《C++设计新思维:泛型编程与设计模式之应用》,侯捷/於春景译,华中科技大学出版社,2003. Grenville Armitage, Mark Claypool and Philip Branch. Networking and Online Games: Understanding and Engineering Multiplayer Internet Games. New York, NY: John Wiley and Sons, 2006. James Arvo (editor). Graphics Gems II. San Diego, CA: Academic Press, 1991. Grady Booch, Robert A. Maksimchuk, Michael W. Engel, Bobbi J. Young, Jim Conallen, and Kelli A. Houston. Object-Oriented Analysis and Design with Applications (3rd Edition). Reading, MA: Addison-Wesley, 2007. 中译本:《面向对象分析与设计(第3版)》,王海鹏/潘加宇译,电子工业出版社,2012. Mark DeLoura (editor). Game Programming Gems. Hingham, MA: Charles River Media, 2000. 中译本:《游戏编程精粹 1》, 王淑礼译,人民邮电出版社,2004. Mark DeLoura (editor). Game Programming Gems 2. Hingham, MA: Charles River Media, 2001. 中译本:《游戏编程精粹 2》,袁国忠译,人民邮电出版社,2003. Philip Dutré, Kavita Bala and Philippe Bekaert. Advanced Global Illumination (2nd Edition). Wellesley, MA: A K Peters, 2006. David H. Eberly. 3D Game Engine Design: A Practical Approach to Real-Time Computer Graphics. San Francisco, CA: Morgan Kaufmann, 2001. 国内英文版:《3D游戏引擎设计:实时计算机图形学的应用方法(第2版)》,人民邮电出版社,2009. David H. Eberly. 3D Game Engine Architecture: Engineering Real-Time Applications with Wild Magic. San Francisco, CA: Morgan Kaufmann, 2005. David H. Eberly. Game Physics. San Francisco, CA: Morgan Kaufmann, 2003. Christer Ericson. Real-Time Collision Detection. San Francisco, CA: Morgan Kaufmann, 2005. 中译本:《实时碰撞检测算法技术》,刘天慧译,清华大学出版社,2010. Randima Fernando (editor). GPU Gems: Programming Techniques, Tips and Tricks for Real-Time Graphics. Reading, MA: Addison-Wesley, 2004. 中译本:《GPU精粹:实时图形编程的技术、技巧和技艺》,姚勇译,人民邮电出版社,2006. James D. Foley, Andries van Dam, Steven K. Feiner, and John F. Hughes. Computer Graphics: Principles and Practice in C (2nd Edition). Reading, MA: Addison-Wesley, 1995. 中译本:《计算机图形学原理及实践──C语言描述》,唐泽圣/董士海/李华/吴恩华/汪国平译,机械工业出版社,2004. Grant R. Fowles and George L. Cassiday. Analytical Mechanics (7th Edition). Pacific Grove, CA: Brooks Cole, 2005. John David Funge. AI for Games and Animation: A Cognitive Modeling Approach. Wellesley, MA: A K Peters, 1999. Erich Gamma, Richard Helm, Ralph Johnson, and John M. Vlissiddes. Design Patterns: Elements of Reusable Object-Oriented Software. Reading, MA: Addison-Wesley, 1994. 中译本:《设计模式:可复用面向对象软件的基础》,李英军/马晓星/蔡敏/刘建中译,机械工业出版社,2005. Andrew S. Glassner (editor). Graphics Gems I. San Francisco, CA: Morgan Kaufmann, 1990. Paul S. Heckbert (editor). Graphics Gems IV. San Diego, CA: Academic Press, 1994. Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming. San Francisco, CA: Morgan Kaufmann, 2008. 中译本:《多处理器编程的艺术》,金海/胡侃译,机械工业出版社,2009. Roberto Ierusalimschy, Luiz Henrique de Figueiredo and Waldemar Celes. Lua 5.1 Reference Manual. Lua.org, 2006. Roberto Ierusalimschy. Programming in Lua, 2nd Edition. Lua.org, 2006. 中译本:《Lua程序设计(第2版)》,周惟迪译,电子工业出版社,2008. Isaac Victor Kerlow. The Art of 3-D Computer Animation and Imaging (2nd Edition). New York, NY: John Wiley and Sons, 2000. David Kirk (editor). Graphics Gems III. San Francisco, CA: Morgan Kaufmann, 1994. Danny Kodicek. Mathematics and Physics for Game Programmers. Hingham, MA: Charles River Media, 2005. Raph Koster. A Theory of Fun for Game Design. Phoenix, AZ: Paraglyph, 2004. 中译本:《快乐之道:游戏设计的黄金法则》,姜文斌等译,百家出版社,2005. John Lakos. Large-Scale C++ Software Design. Reading, MA: Addison-Wesley, 1995. 中译本:《大规模C++程序设计》,李师贤/明仲/曾新红/刘显明译,中国电力出版社,2003. Eric Lengyel. Mathematics for 3D Game Programming and Computer Graphics (2nd Edition). Hingham, MA: Charles River Media, 2003. Tuoc V. Luong, James S. H. Lok, David J. Taylor and Kevin Driscoll. Internationalization: Developing Software for Global Markets. New York, NY: John Wiley & Sons, 1995. Steve Maguire. Writing Solid Code: Microsoft's Techniques for Developing Bug Free C Programs. Bellevue, WA: Microsoft Press, 1993. 国内英文版:《编程精粹:编写高质量C语言代码》,人民邮电出版社,2009. Scott Meyers. Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition). Reading, MA: Addison-Wesley, 2005. 中译本:《Effective C++:改善程序与设计的55个具体做法(第3版)》,侯捷译,电子工业出版社,2011. Scott Meyers. More Effective C++: 35 New Ways to Improve Your Programs and Designs. Reading, MA: Addison-Wesley, 1996. 中译本:《More Effective C++:35个改善编程与设计的有效方法(中文版)》,侯捷译,电子工业出版社,2011. Scott Meyers. Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library. Reading, MA: Addison-Wesley, 2001. 中译本:《Effective STL:50条有效使用STL的经验》,潘爱民/陈铭/邹开红译,电子工业出版社,2013. Ian Millington. Game Physics Engine Development. San Francisco, CA: Morgan Kaufmann, 2007. Hubert Nguyen (editor). GPU Gems 3. Reading, MA: Addison-Wesley, 2007. 中译本:《GPU精粹3》,杨柏林/陈根浪/王聪译,清华大学出版社,2010. Alan W. Paeth (editor). Graphics Gems V. San Francisco, CA: Morgan Kaufmann, 1995. C. Michael Pilato, Ben Collins-Sussman, and Brian W. Fitzpatrick. Version Control with Subversion (2nd Edition). Sebastopol , CA: O'Reilly Media, 2008. (常被称作“The Subversion Book”,线上版本.) 国内英文版:《使用Subversion进行版本控制》,开明出版社,2009. Matt Pharr (editor). GPU Gems 2: Programming Techniques for High-Performance Graphics and General-Purpose Computation. Reading, MA: Addison-Wesley, 2005. 中译本:《GPU精粹2:高性能图形芯片和通用计算编程技巧》,龚敏敏译,清华大学出版社,2007. Bjarne Stroustrup. The C++ Programming Language, Special Edition (3rd Edition). Reading, MA: Addison-Wesley, 2000. 中译本《C++程序设计语言(特别版)》,裘宗燕译,机械工业出版社,2010. Dante Treglia (editor). Game Programming Gems 3. Hingham, MA: Charles River Media, 2002. 中译本:《游戏编程精粹3》,张磊译,人民邮电出版社,2003. Gino van den Bergen. Collision Detection in Interactive 3D Environments. San Francisco, CA: Morgan Kaufmann, 2003. Alan Watt. 3D Computer Graphics (3rd Edition). Reading, MA: Addison Wesley, 1999. James Whitehead II, Bryan McLemore and Matthew Orlando. World of Warcraft Programming: A Guide and Reference for Creating WoW Addons. New York, NY: John Wiley & Sons, 2008. 中译本:《魔兽世界编程宝典:World of Warcraft Addons完全参考手册》,杨柏林/张卫星/王聪译,清华大学出版社,2010. Richard Williams. The Animator's Survival Kit. London, England: Faber & Faber, 2002. 中译本:《原动画基础教程:动画人的生存手册》,邓晓娥译,中国青年出版社,2006. 勘误 第1次印册(2014年2月) P.xviii: 译注中 Wholesale Algoithms -> Wholesale Algorithms P.10: 最后一段第一行 微软的媒体播放器 -> 微软的Windows Media Player (多谢读者OpenGPU来函指正) P.15: 1.4.3节第三点 按妞 -> 按钮 (多谢读者一个小小凡人来函指正) P.40: 正文最后一行 按扭 -> 按钮 P.50: 1.7.8节第二节第一行 同是 -> 同时 (多谢读者czfdd来函指正) P.98: 代码 writeExampleStruct(Example& ex, Stream& ex) 中 Stream& ex -> Stream& stream (多谢读者Snow来函指正) P.106: 第一段中有六处 BBS -> BSS,最后一段代码的注释也有同样错误 (多谢读者trout来函指正) P.119: 译注中 软体工程 -> 软件工程 (多谢读者Snow来函指正) P.214: 正文第一段有两处 虚内存 -> 虚拟内存 (多谢读者Snow来函指正) P.216: 脚注24应标明为译注 (多谢读者Snow来函指正) P.221: 第一段代码的第二个断言应为 ASSERT(link.m_pPrev != NULL); (多谢读者Snow来函指正) P.230: 5.4.4.1节 第二段 软体 -> 软件 P.286: 脚注4应标明为译注 (多谢读者Snow来函指正) P.322: 第二段 按扭事件字 -> 按钮事件 P.349: 9.8节第二段第二行两处 部析器 -> 剖析器 (多谢读者Snow来函指正) P.738-572: 双数页页眉 参考文献 -> 中文索引 P.755-772: 双数页页眉 参考文献 -> 英文索引 P.755: kd tree项应归入K而不是Symbols 以上的错误已于第2次印册中修正。 第2次印册及之前 P.11: 第四行 细致程度 -> 层次细节 (这是level-of-detail/LOD的内地通译,多谢读者OpenGPU来函指正) P.12: 正文第一段及图1.2标题 使命之唤 -> 使命召唤 (多谢读者OpenGPU来函指正) P.12: 正文第一段 战栗时空 -> 半条命 (多谢读者OpenGPU来函指正) P.16: 第一点 表面下散射 -> 次表面散射 (多谢读者OpenGPU来函指正) P.17: 1.4.4节第五行 次文化 -> 亚文化 (此译法在内地更常用。多谢读者OpenGPU来函提示) P.22: 战栗时空 -> 半条命 P.24: 战栗时空2 -> 半条命2 P.34: 1.6.8.2节第一行 提呈 -> 提交 (这术语在本书其他地方都写作提交。多谢读者OpenGPU来函提示) P.35: 第七行 提呈 -> 提交 (这术语在本书其他地方都写作提交。多谢读者OpenGPU来函提示) P.50: 战栗时空2 -> 半条命2 P.365: 第四段第二行: 细致程度 -> 层次细节 P.441: 10.4.3.2节第三行 细致程度 -> 层次细节 P.494: sinusiod -> sinusoid (多谢读者OpenGPU来函指正) P.511: 11.10.4节第一行 谈入 -> 淡入 (多谢读者Snow来函指正) P.541: 战栗时空2 -> 半条命2 P.627: 战栗时空2 -> 半条命2 P.654: 第二行 建康值 -> 血量 (原来是改正错别字,但译者发现应改作前后统一使用的“血量”。多谢读者Snow来函指正) P.692: 第二行 内部分式 -> 内部方式 (多谢读者Snow来函指正) P.696: 14.7.6节第四行 不设实际 -> 不切实际 (多谢读者Snow来函指正) 以上的错误已于第3次印册中修正。 其他意见 P.220: 正文第一段 m_root.m_pElement 和 P.218 第一段代码中的 m_pElem 不统一。原文有此问题,但因为它们是不同的struct,暂不列作错误。 (多谢读者Snow来函提示) P.331: 8.5.8节第二段中 “反覆”较常见的写法为“反复”,但前者也是正确的,暂不列作错误。 (多谢读者Snow来函提示) P.390: 10.1.3.3节静态光照第二段中“取而代之,我们会使用一张光照纹理贴到所有受光源影响范围内的物体上。这样做能令动态物体经过光源时得到正确的光照。” 后面的一句与前句好像难以一起理解。译者认为,作者应该是指,使用同一静态光源去为静态物件生成光照纹理,以及用于动态对象的光照,能使两者的效果维持一致性。译者会考虑对译文作出改善或加入译注解译。(多谢读者店残来函查询) P.689: 第五行 并行处理世代 -> 并行处理时代 是对era较准确的翻译。 (多谢读者Snow来函提示) 本篇文章为转载内容。原文链接:https://blog.csdn.net/mypongo/article/details/38388381。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-02-12 23:04:05
327
转载
JQuery插件下载
...ee.js的强大3D渲染能力与TweenMax(GSAP)的高效动画引擎,旨在打造独一无二、视觉冲击力极强的动态效果。这款插件的核心优势在于其对3D空间的精细控制以及对用户交互的灵敏响应。通过整合Three.js,开发者能够构建出复杂且真实的三维场景,无论是产品展示、游戏元素还是艺术作品,都能以沉浸式的方式呈现给用户。而TweenMax(GSAP)的加入,则为这些场景提供了流畅、细腻的动画过渡,使得每一次鼠标移动或点击都成为一场视觉盛宴。该插件支持多种类型的交互事件,如鼠标悬停、点击、拖拽等,可以针对不同的元素触发特定的动画效果。例如,当用户将鼠标悬停在某个3D模型上时,模型可以旋转、放大或改变颜色,从而提供更加互动和个性化的用户体验。此外,基于Three.js的交互动画特效插件还提供了高度的自定义选项,允许开发者根据自己的需求调整动画速度、效果和触发条件。这种灵活性使得它适用于各种网站和应用,从商业展示到教育平台,甚至是艺术项目,都能够展现出独特的魅力。总之,这款插件不仅极大地丰富了网页的交互性,还提升了内容的观赏性和吸引力,是现代Web开发中不可或缺的工具之一。通过结合Three.js的3D渲染能力和TweenMax的动画功能,它为开发者和设计师提供了一个创造无限可能的平台,让在线体验变得更加生动和有趣。 点我下载 文件大小:12.61 KB 您将下载一个JQuery插件资源包,该资源包内部文件的目录结构如下: 本网站提供JQuery插件下载功能,旨在帮助广大用户在工作学习中提升效率、节约时间。 本网站的下载内容来自于互联网。如您发现任何侵犯您权益的内容,请立即告知我们,我们将迅速响应并删除相关内容。 免责声明:站内所有资源仅供个人学习研究及参考之用,严禁将这些资源应用于商业场景。 若擅自商用导致的一切后果,由使用者承担责任。
2024-08-25 10:45:36
119
本站
Java
...,有的是来自各大搜索引擎的爬虫,比如百度爬虫、谷歌爬虫、bing爬虫(bing即微软的必应搜索引擎)等等,这些搜索引擎的爬虫可以为我们的网站带来可能得收录。还有的可能是我们不期待的爬虫。 这里,这里要还要简单说明的是,搜索引擎的爬虫来爬取不等于收录,收录的还需要很多必备条件,比如网站质量、是否原创、是否重复、用户体验、外链建设等等,不在这里展开介绍了。 2. 举个例子 比如Google的爬虫,每次来访的时候,都会带着它独有的user-agent,如下: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.224 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) 从这个user-agent可以看到出,来访者会告知自己身份是Googlebot,即来自谷歌搜索引擎的爬虫。 关于爬虫身份的识别,zac老师整理过一篇非常权威的列表,大家可参考: https://www.seozac.com/course/spider-user-agent-list/ 3.java代码示例 3.1 身份标识枚举类 识别了爬虫身份后,这里封装了一个身份枚举类,作为简单说明和java方法返回值。每个枚举项目后面的注释里都标注着对应爬虫的关键词,可以用来做字符串contains操作。 public static enum UserAgentRole { BAIDU_SPIDER, // Baiduspider/2.0或Baiduspider-render/2.0 GOOGLE_SPIDER, // Googlebot/2.1或Googlebot-Image/1.0 BING_SPIDER, //bingbot/2.0 SOUGOU_SPIDER, // Sogou web spider/4.0或Sogou wap spider/4.0 _360_SPIDER, // 360Spider SHENMA_SPIDER, // YisouSpider/5.0 YANDEX_SPIDER, // YandexBot/3.0 HUAWEI_SPIDER, // PetalBot AMAZON_SPIDER, // Amazonbot/0.1 OTHER_SPIDER, // 未知spider NATURAL_USER, // 非spider的自然用户 UNKNOWN // 没有user-agent头 } 3.2 HttpServletRequest中取得User-Agent HttpServletRequest request = ... String userAgent = request.getHeader("User-Agent"); 3.3 通过userAgent返回UserAgentRole private static UserAgentRole checkUserAgentRole(String userAgent) { if (StringUtils.isEmpty(userAgent)) { return UserAgentRole.UNKNOWN; } userAgent = userAgent.toLowerCase(); if (userAgent.contains("bot") || userAgent.contains("spider")) { if (userAgent.contains("baidu")) { return UserAgentRole.BAIDU_SPIDER; } else if (userAgent.contains("google")) { return UserAgentRole.GOOGLE_SPIDER; } else if (userAgent.contains("bing")) { return UserAgentRole.BING_SPIDER; } else if (userAgent.contains("sougou")) { return UserAgentRole.SOUGOU_SPIDER; } else if (userAgent.contains("360")) { return UserAgentRole._360_SPIDER; } else if (userAgent.contains("yisou")) { return UserAgentRole.SHENMA_SPIDER; } else if (userAgent.contains("yandex")) { return UserAgentRole.YANDEX_SPIDER; } else if (userAgent.contains("petal")) { return UserAgentRole.HUAWEI_SPIDER; } else if (userAgent.contains("amazon")) { return UserAgentRole.AMAZON_SPIDER; } else { return UserAgentRole.OTHER_SPIDER; } } return UserAgentRole.NATURAL_USER; } 4. 不带User-Agent的搜索引擎的爬虫 多说一句,有时候即使是正经搜索引擎的爬虫,也不会带着User-Agent来正经标识自己的爬虫身份。 这是因为,为了在seo里为了避免下面这种情况: 某站长作弊,对普通用户返回一套页面,对搜索引擎,返回一套页面。 对搜索引擎返回的页面是做过特殊优化的,其实是有作弊嫌疑的。 那搜索引擎为了判断是否有作弊嫌疑,就会用正经带有爬虫标识的User-Agent请求一次,再在不定期的时候用普通身份请求一次。
2024-01-26 16:45:09
426
admin-tim
Docker
...是一种开源的应用容器引擎,它通过容器化技术将应用程序及其依赖环境打包在一起,形成一个可移植、轻量级的运行时环境。在本文语境中,开发者使用Docker来扩展屏幕功能,意味着他们尝试在Docker容器内部署图形化应用,并实现多显示器支持或更大的显示区域。 VirtualGL客户端 , VirtualGL是一个开源软件,用于在Linux环境下高效地将3D图形应用程序的OpenGL渲染输出从高性能计算集群中的服务器节点传输到客户端工作站的本地显示器上。在本文中,当开发者在Docker环境中需要进行图形界面的扩展屏幕操作时,会借助VirtualGL客户端工具以实现在容器内运行的图形应用能够正确显示在宿主机的屏幕上。 xorg.conf文件 , xorg.conf是X Window System(X11)的主要配置文件,它定义了X服务器的硬件设备、输入设备、显示设备、监视器等信息。在本文上下文中,开发者需要对VirtualGL客户端中的xorg.conf文件进行调整或替换为宿主机的xorg.conf文件,以确保X服务器能正确识别和配置显卡驱动以及相关显示设备,从而解决在使用Docker扩展屏幕时出现的黑屏问题。 Xorg , Xorg是开源的X Window System的实现,作为Linux及类Unix系统的核心组件之一,负责管理图形显示和输入设备。在本文中,安装Xorg并创建相应的OpenGL配置文件是解决Docker扩展屏幕黑屏问题的关键步骤之一,目的是为了使容器内的图形应用能够在宿主机上正常渲染并显示出来。
2023-09-04 23:41:28
583
电脑达人
VUE
...于业务逻辑的实现。 引擎模板(Template Engine)是另一个重要的前端技术。它允许开发者应用一种相似 HTML 的句法来规定页面和组件的结构和样式,同时引入数据绑定等特点,使得开发效率得到提高。 <template> <div class="card"> <span v-text="title"></span> <img :src="imageSrc" /> <p v-text="description"></p> </div> </template> 上述代码展示了一个 Vue 组件的示例,它应用引擎模板来规定了一个卡片组件的 HTML 结构和数据渲染方式。其中,v-text 和 :src 都是 Vue 的数据绑定句法,它们可以将组件中的数据和界面中的元素进行联系。 引擎模板和 Vue 结构有许多相似之处,二者都供给了数据绑定、模板渲染、组件化等功能,使得我们写出更加简洁明了和易于维护的前端代码。对于开发者而言,挑选哪种技术主要取决于自己的编程习惯和需求。不过,无论是哪种技术,它们都在构建出我们所看到、体验到的各种 Web 应用和网站中起到了至关重要的作用。
2023-09-13 19:46:37
59
数据库专家
JQuery
...JavaScript引擎性能的不断提升以及新特性的不断引入,如ES6中的Array.from()方法和扩展运算符,开发者在处理数组转换时拥有了更多选择。 近期一篇来自Mozilla Developer Network(MDN)的技术文章《利用现代JavaScript特性高效处理数组》指出,Array.from()方法不仅能够将类数组对象转换为真正的数组,还可以用于实现类似jQuery.toArray()的功能。此外,该文还探讨了如何结合Map、Set、flatMap等新API提升数组操作的效率和代码可读性。 与此同时,React和Vue等主流前端框架在处理数据更新与渲染时,对原生数组操作有着深度优化。例如,在Vue3中,通过响应式系统对数组变化进行追踪,开发者可以更自然地操作数组,而无需显式调用特定的转换方法。 另外,对于那些依然广泛使用jQuery库但寻求性能优化方案的项目,有专家建议适时评估并逐步替换部分jQuery功能,转而采用原生JavaScript或者轻量级的替代品,以减少冗余代码并提高页面加载速度。这方面的案例分析和实战教程可以在许多技术博客和社区论坛上找到,如“重构:从jQuery到原生JavaScript的最佳实践”一文,提供了详细的步骤指导和性能对比测试。 总之,在当今快速发展的Web开发领域中,理解和掌握不同场景下最优的数组操作方式至关重要,无论是原生JavaScript还是第三方库提供的工具,都需要紧跟技术潮流,以便于构建高性能且易于维护的Web应用。
2023-03-19 10:40:17
88
代码侠
转载文章
...理解Smarty模板引擎的内置函数capture用法之后,我们可以进一步探索现代Web开发中模板引擎技术的最新进展和实际应用案例。例如,Vue.js等前端框架引入了Render函数与Slot插槽的概念,它们同样可以实现类似内容捕获与复用的功能,通过组件化的方式将UI逻辑解耦,提升代码的可维护性和复用性。 另外,PHP社区近期推出了Twig模板引擎的新版本,它在内容捕获与变量处理上也有所创新。例如,Twig中的“set”标签和“block”标签能够实现与Smarty capture类似的特性,甚至提供了更灵活的块级内容捕获与继承机制,这对于构建复杂、动态的网页布局具有显著优势。 同时,随着Serverless架构的发展,无服务器环境下的模板渲染方式也在不断演进。如AWS Lambda结合其云服务的API Gateway使用Velocity模板语言进行响应体的动态构建,这种场景下如何高效利用模板捕获功能来组装数据并返回给客户端,是值得开发者关注的技术实践。 此外,对于 Smarty 用户来说,除了掌握基本的内置函数外,了解 Smarty 3.x 到 Smarty 4 的新特性与迁移策略也至关重要。Smarty 4 提供了更多现代化的语法糖以及对 PHP 新特性的支持,有助于提高模板编写效率和运行性能。 总之,在持续发展的Web开发领域,无论是传统的Smarty模板引擎,还是新兴的前端框架与云服务模板技术,深入了解并掌握各种内容捕获与输出管理的方法,都是提升项目质量与开发体验的关键所在。
2023-12-03 17:52:39
79
转载
CSS
...”的方法,以确保快速渲染初始视口内容。 近期一项研究显示,将关键CSS直接内嵌在HTML文档头部可以显著提升页面交互性,尤其对于移动端用户而言,这种做法能够有效减少“首次输入延迟”(First Input Delay, FID),从而提高用户体验评分。同时,针对非关键或者按需加载的CSS资源,则可通过异步加载方式,在不影响首屏内容展示的情况下完成样式更新。 然而,将CSS置于底部并非一劳永逸的解决方案,它可能导致“无样式内容闪烁”(Flash of Unstyled Content, FOUC)的问题,影响用户体验。因此,更现代的做法是结合最新的前端性能优化工具和技术,如Webpack、Parcel等进行代码分割与智能加载,并利用浏览器缓存机制进一步加快重复访问时的页面加载速度。 此外,值得深入探究的是如何在保证页面加载速度的同时,兼顾SEO优化及无障碍阅读的需求。一些最佳实践指出,合理布局CSS并遵循语义化HTML标准,既能改善搜索引擎抓取效率,也能增强辅助技术对网站内容的理解和呈现,最终实现多维度的网页性能优化目标。
2023-12-20 17:00:57
449
软件工程师
CSS
...,更是用户体验和搜索引擎排名的重要因素。近期,Google在其搜索算法更新中进一步强调了页面加载速度及移动设备适应性的重要性,而图片优化正是提升这两方面性能的关键手段之一。 例如,2023年5月,Google推出了Web Vitals项目,其中LCP(最大内容渲染时间)指标即考察了首屏大图或关键元素如头部背景的加载速度,建议开发者采用现代格式如WebP或AVIF以减小图片大小,同时结合CSS的background-size属性确保图片不失真且快速加载。 此外,响应式设计的理念也不断深化,设计师们开始探索如何通过CSS Grid、Flexbox等布局方式以及更精细的图片尺寸调整策略(如使用max-width配合媒体查询),确保图标、广告横幅等各种图片元素在不同屏幕尺寸下均能保持良好的比例和视觉效果。 深入解读方面,研究者指出,随着无障碍设计要求的提高,图片的alt属性设置也成为评价网页质量的重要考量。利用CSS进行图片降级处理,结合语义化HTML标签为用户提供替代文本信息,将有效提升视障用户和其他辅助技术用户的访问体验。 综上所述,紧跟行业趋势和技术发展,持续深入研究并实践CSS在模板网站图片设计中的应用,不仅可以打造美观、高效的网页界面,更能实现搜索引擎友好和用户体验升级的双重目标。
2023-08-24 23:36:58
468
编程狂人
MySQL
...e.js结合现代模板引擎如Pug、Handlebars等提供了更为便捷高效的数据库数据到HTML转换方案。 例如,Next.js框架结合Apollo GraphQL能够实现实时从MySQL或其他数据库获取数据,并无缝渲染至前端界面。开发者可以利用GraphQL的强大查询能力,精确选择需要的数据字段,减少网络传输量,同时提高页面加载速度。 此外,针对大数据处理场景,Apache Superset等开源BI工具也支持直接连接MySQL数据库并生成丰富的交互式HTML报表,满足企业级数据分析和展示需求。 不仅如此,对于数据库内容的安全性和隐私保护,开发者应关注最新的GDPR等相关法规,确保在数据导出过程中遵循数据最小化原则,对敏感信息进行合理脱敏处理,避免在生成的HTML文件中泄露用户隐私。 综上所述,在实际项目中,根据具体业务需求和技术栈选择合适的数据库数据导出及前端展现策略,不仅限于上述提及的技术,更应持续关注领域内的新技术发展和最佳实践,以期达到高效、安全、易用的目标。
2023-12-22 18:05:58
58
编程狂人
HTML
...移动网页的快速加载与渲染,极大提升了用户体验。 此外,语义化HTML5标签如 、 、 等的应用日益广泛,不仅有利于搜索引擎优化,更使得网页内容更具可读性和易于理解。W3C组织也在不断更新和完善HTML5规范,比如对无障碍访问(Accessibility)属性的强化,确保更多用户能够无障碍地浏览网页内容。 近期,GitHub上开源的静态网站生成器(如Hugo、Jekyll)也越来越多地采用HTML5作为基础模板语言,结合Markdown等轻量级标记语言,简化了内容创作和发布流程,凸显出HTML5在现代Web开发中的基石作用。 同时,响应式设计和PWA(Progressive Web App)的普及,让HTML5开发者需要进一步掌握CSS Grid布局、Flexbox以及Service Worker等相关技术,以打造流畅且接近原生应用体验的网页产品。 综上所述,对于HTML5的学习不应仅限于基本语法和元素的理解,还应关注行业前沿动态,紧跟Web开发的标准更新和技术发展趋势,以适应不断变化的互联网环境需求。
2023-11-14 23:39:03
529
算法侠
HTML
...;等无法被识别和正确渲染。通过引入HTML5 Shiv库,可以模拟实现对这些新元素的基本支持,使得即使在不支持HTML5的老旧浏览器中也能正确构建DOM树,并允许开发者针对这些元素应用CSS样式。 Modernizr , Modernizr是一个开源的JavaScript库,用于检测用户浏览器对于HTML5和CSS3特性的支持情况。它提供了丰富的API,可以帮助开发者根据浏览器的不同特性提供不同的代码路径或资源,从而实现网页在不同浏览器下的兼容性优化。例如,如果浏览器不支持HTML5视频标签,Modernizr可以检测到这一点并触发一个回退方案,如使用Flash播放器来替代。 语义化标签 , 语义化标签是HTML5中的一个重要概念,指的是HTML标签具有明确的语义含义,能够清晰地表达出其所包含内容的意义和结构。比如<section>表示页面的一个独立区块,<article>用来定义文章内容,<header>代表页面或区域的头部信息等。通过合理使用语义化标签,不仅有助于搜索引擎优化(SEO),提升网页的可访问性和可读性,也有利于开发者更好地组织和维护代码,以及为未来可能的辅助技术提供更好的支持。
2023-10-08 13:53:02
408
算法侠
VUE
...屏幕阅读器识别和搜索引擎抓取。而在实际项目中,为了提高用户体验,还可以引入懒加载技术,比如Intersection Observer API,来实现在滚动到图片视口时再进行加载,既节省流量又提升页面渲染速度。 深入探究,在处理高清大图时,除了尺寸控制,还应注意资源优化,如使用WebP格式替代JPEG或PNG以减小文件体积,或者利用CDN加速图片加载。另外,针对移动设备特性,可参考苹果推出的“适配视网膜显示屏”的最佳实践,采用2x甚至3x的图片源,确保在高DPI屏幕上也能清晰展示。 总之,无论是从技术实现还是用户体验角度,实现全屏图片展示的同时避免压缩变形都是现代Web开发的重要考量之一,而Vue.js及其生态提供了丰富的解决方案和最佳实践供开发者借鉴和学习。
2023-04-27 22:56:48
119
码农
CSS
...者直接操作底层CSS引擎,为自定义布局、动画以及其他高级功能提供了可能。这意味着未来我们可能会看到更多创新的方式来实现诸如数字在正方形内动态展示的效果,甚至创造出更丰富多样的交互体验。 此外,对于网页性能优化,合理运用Flexbox布局还能有效减少冗余代码,提高页面渲染速度。鉴于浏览器对于Flexbox的良好支持度,掌握并灵活应用此技术无疑将大大提升前端开发者的实战能力,并有助于打造高质量的用户体验。 综上所述,从基础的正方形数字布局到前沿的CSS技术和设计理念,不断跟进学习和实践,是每一位前端开发者保持与时俱进的关键所在。
2023-06-14 12:07:04
426
软件工程师
Docker
...是一种开源的应用容器引擎,它通过容器技术为软件提供了一种标准化、轻量级的封装方式。在本文语境下,Docker允许开发者打包应用及其所有依赖项到一个可移植的容器中,并可以在任何安装了Docker环境的操作系统上运行,无需关心底层基础设施差异。默认情况下,Docker容器仅使用宿主机的CPU资源,但可以通过配置支持GPU资源。 Nvidia Docker , Nvidia Docker是针对Nvidia显卡优化的Docker插件,它是官方支持的工具,旨在使Docker容器能够访问和利用宿主机上的Nvidia GPU硬件资源。在容器内部署深度学习、高性能计算等需要GPU加速的应用时,Nvidia Docker提供了一种便捷的方式,使得容器内的应用程序可以直接调用GPU进行计算,从而实现高效的并行处理和计算性能提升。 CUDA , CUDA(Compute Unified Device Architecture)是NVIDIA公司推出的一种编程模型和计算平台,用于利用Nvidia GPU进行并行计算。在本文中,提及的Docker镜像包含了CUDA运行时环境,这意味着在Docker容器内可以编写和执行基于CUDA的应用程序,利用GPU强大的并行计算能力来提高应用程序性能。 NVIDIA GPU , NVIDIA GPU(Graphics Processing Unit)是NVIDIA公司生产的专业图形处理器,除了用于图像渲染外,还广泛应用于深度学习、科学计算、大数据分析等领域,提供比传统CPU更强大的并行计算能力。在Docker环境下,通过Nvidia Docker或其他GPU支持的Docker运行时,可以让容器中的应用程序直接访问和利用这些高性能GPU资源。
2023-03-21 08:01:33
543
程序媛
转载文章
...了一项关于其最新版本引擎中对多线程优化和AI决策树强化学习功能的升级公告,使得开发者能够更加高效地创建具有智能行为的角色和更流畅的游戏体验。这与上述火柴人游戏中红色老女人随机移动并实现碰撞检测的机制不谋而合,体现出现代游戏开发中AI技术和并发处理的重要性。 同时,针对控制台游戏界面设计与用户体验的研究也在不断深入。有文章指出,即便是在简单的字符画风游戏中,通过精巧的图形渲染和交互设计也能营造出沉浸式的游戏氛围,正如该火柴人游戏中利用方向键操控角色移动,简洁直观的用户输入方式大大增强了游戏的可玩性。 此外,对于想深入了解游戏编程的读者,推荐参考《游戏编程精粹》系列丛书,其中详尽介绍了包括物理模拟、图形渲染、AI设计等多种关键技术,并结合实际案例解析如何将这些技术融入到游戏开发中。通过研读此类专业书籍,可以更好地理解并借鉴文中火柴人游戏的设计思路,为独立开发或者职业游戏编程打下坚实基础。 总之,从简单的火柴人游戏出发,我们能窥见游戏开发世界的一角,无论是实时系统、人工智能还是图形用户界面设计,都是构建丰富有趣游戏世界的基石,值得广大编程爱好者及专业人士深入探究。
2023-07-20 23:02:16
133
转载
VUE
...EJS是一款浏览器端渲染的模板引擎,而Vue.js是一款前端架构,可以实现浏览器端渲染和服务端渲染。Vue.js架构提供了一套MVVM模式的数据双向绑定、模块化、虚拟DOM等实施方案。 <template> <div> { { message } } </div> </template> <script> export default { data () { return { message: 'Hello Vue!' } } } </script> 由上面的示例代码可以看出,Vue.js拥有十分清晰简洁的编程格式与句法,而EJS模板则需要编写类似HTML注释的句法来实现条件判断,从而造成了代码阅读难度大的局面。 <% if (user) { %> <h2><%= user.name %></h2> <% } %> 其次,Vue.js在模块化方面的优势更加明显。在EJS模板中,一个页面不可避免地需要分割为不同的HTML片段进行引用,而在Vue.js中,页面全部都可以分割为组件进行开发,使得项目的保养和代码重构变得更加容易。另外,应用Vue.js架构还可以很容易地进行模板自定义和功能扩展。 综上所述,Vue.js凭借着其易用优美的语言特性,以及强大的模块化开发能力,在前端开发中愈来愈受到人们的喜爱。而EJS模板缺少这些特点,逐渐被新兴的前端架构所替代。相信,在未来的前端开发中,Vue.js将会成为更具前途的开发架构。
2023-01-13 16:30:26
121
代码侠
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
unxz file.xz
- 解压缩xz格式的文件。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"