首页 文章 精选 留言 我的

精选列表

搜索[unreal engine],共6016篇文章
优秀的个人博客,低调大师

虚幻引擎 (Unreal Engine) 5 发布抢先体验版

虚幻引擎 5 的抢先体验版现已推出! 发布公告称:“此版本尚未达到生产标准,但你可以通过它首次接触到一些在去年的公布演示中令你兴奋万分的技术——更不用说它还将包含一些你从未见过的技术。” 下面总结了如今已经可以公开测试的重要新功能。 Nanite Nanite是一个虚拟化微多边形几何体系统,你可以通过它创作具有海量几何体细节的游戏,省去将细节烘焙到法线贴图或手动编辑LOD等费时费力的工作。 想象一下,直接导入由数以百万计的多边形组成的电影级美术资源——从ZBrush雕刻到摄影测绘扫描的任何资源——将它们布置数百万次之多,而且自始至终保持实时帧率,没有任何明显的保真度损失。觉得这不可能吗?时代变了! Lumen 接下来是Lumen,一种全动态全局光照解决方案。有了Lumen,你就可以创建动态、逼真的场景,其中的间接光照能够实时适应直接光照或几何体的变化——例如根据天时改变太阳的角度,打开手电筒或打开房门。 有了Lumen,你再也不需要编辑光照贴图UV,等待光照贴图烘焙或放置反射捕捉;你只需要在虚幻编辑器中创建和编辑光源,然后就能看到游戏在主机上运行时的最终光照效果。 开放世界场景 我们始终致力于让各种规模的团队都能更方便、更快捷、更协作地创建开放世界场景。如今你可以试用一些将让我们实现这个目标的步骤。 首先是新的世界分区系统,它能够自动将世界场景划分为网格,并在需要时流送所需网格。然后是新的每Actor一文件系统,它将使协作变得更方便——你和你的团队成员现在可以同时处理同一个世界场景的同一个区域,而不会相互干扰。 最后是数据分层,它让你能够创建同一个世界场景的不同变体——例如日间和夜间版本,或者通过游戏玩法启用的特定数据集——作为同一空间中的分层。 动画 如果你总是需要转到虚幻引擎之外来创建或编辑动画,不仅费时而痛苦,也妨碍了迭代。这就是为什么我们在虚幻引擎5中扩展和增强了我们的动画工具集,让你能够直接在情境中创作异常精美的角色。 控制绑定等对美术师友好的工具可以让你快速创建骨架绑定,并在多个角色之间共享;你可以在Sequencer中摆好他们的姿势,并使用新的姿势浏览器将这些姿势作为资源保存和运用;还可以使用新的全身IK解算器轻松创作自然的动作。与此同时,运动扭曲可以让你动态调节角色的根动作来适应不同目标——例如用一个动画就做出跃过不同高度的墙壁的动作。 MetaSounds 你可曾梦想过,在创作音频体验时拥有和外观开发一样多的控制能力和灵活性?我们在UE5中将推出一种制作音频的全新方法。MetaSounds是一个高性能的系统,可以让你全面控制音源的音频DSP图表生成,管理音频渲染的各个方面,推动实现次世代的程序化音频体验。 MetaSounds好比一条完全可程控的材质和渲染管线,将材质编辑器为着色器实现的所有程序化内容创建的优点都带到了音频领域:动态的数据驱动资源,将游戏参数映射到声音播放的功能,工作流程的大幅改进,等等。 增强的编辑器UI和工作流程 改头换面的时候到了!在UE5中,虚幻编辑器将获得新颖的外观、精简的工作流程和对屏幕空间的优化利用,使它用起来更方便、更快捷、更赏心悦目。 这个抢先体验版中的新功能包括:轻松调出和隐藏内容浏览器,将任何编辑器选项卡驻停到可折叠侧边栏,以腾出更多空间用于视口交互;一个新的收藏系统,用于快速访问“细节”面板中的常用属性;主工具栏上新增的“创建”按钮,方便将Actor放入场景;还有经过简化的新建项目流程。 有关所有新功能的详细信息,请参见版本说明。 获取虚幻引擎5抢先体验版 如果你已经是虚幻引擎用户,可以从Epic Games启动程序获取UE5抢先体验版和“遗迹峡谷”示例项目。如果你还是新手上路,可先从下方的按钮开始。同时我们也建议你先了解一下虚幻引擎4.26。 获取UE5抢先体验版 从UE 4.26开始

优秀的个人博客,低调大师

Peeking into Apache Flink's Engine Room

Join Processing in Apache Flink In this blog post, we cut through Apache Flink’s layered architecture and take a look at its internals with a focus on how it handles joins. Specifically, I will show how easy it is to join data sets using Flink’s fluent APIs, discuss basic distributed join strategies, Flink’s join implementations, and its memory management, talk about Flink’s optimizer that automatically chooses join strategies, show some performance numbers for joining data sets of different sizes, and finally briefly discuss joining of co-located and pre-sorted data sets 这篇blog会从flink内部详细看看是如何处理join的,尤其, 如何用Flink API,简单的实现join 讨论基本的join策略,flink join的实现和内存管理 讨论flink的优化器,如何自动选择join策略 显示不同数据size上的性能数据, 最后简单讨论一下co-located和预排序的数据集的join问题 How do I join with Flink? Flink provides fluent APIs in Java and Scala to write data flow programs. // define your data types case class PageVisit(url: String, ip: String, userId: Long) case class User(id: Long, name: String, email: String, country: String) // get your data from somewhere val visits: DataSet[PageVisit] = ... val users: DataSet[User] = ... // filter the users data set val germanUsers = users.filter((u) => u.country.equals("de")) // join data sets val germanVisits: DataSet[(PageVisit, User)] = // equi-join condition (PageVisit.userId = User.id) visits.join(germanUsers).where("userId").equalTo("id") 可以看到用flink api实现join还是比较简单的 How does Flink join my data? Flink如何做join,分两个阶段, Ship Strategy Local Strategy Ship Strategy 对于分布式数据,数据是散落在各个partition中的,要做join,首先要把相同join key的数据放到一起,这个过程称为Ship Strategy Flink的Ship Strategy有两种, Repartition-Repartitionstrategy (RR) The Repartition-Repartition strategy partitions both inputs, R and S, on their join key attributes using the same partitioning function. 比如,R,S做join,我们就用一个相同partition函数,按join key,把R,S的所有分区,shuffle到3个local join上 这样做需要把full shuffle of both data sets over the network Broadcast-Forwardstrategy (BF) The Broadcast-Forward strategy sends one complete data set (R) to each parallel instance that holds a partition of the other data set (S) S不动,把R广播到所有的join实例上;显然如果R足够小,这样做是很有效的 Flink’s Memory Management 对join的场景,很容易想到,在ship阶段,需要shuffle大量的数据,内存是否会OutOfMemoryException,或是否会发生full gc Flink handles this challenge by actively managing its memory. When a worker node (TaskManager) is started, it allocates a fixed portion (70% by default) of the JVM’s heap memory that is available after initialization as 32KB byte arrays. This design has several nice properties. First, the number of data objects on the JVM heap is much lower resulting in less garbage collection pressure. Second, objects on the heap have a certain space overhead and the binary representation is more compact. Especially data sets of many small elements benefit from that. Third, an algorithm knows exactly when the input data exceeds its working memory and can react by writing some of its filled byte arrays to the worker’s local filesystem. After the content of a byte array is written to disk, it can be reused to process more data. Reading data back into memory is as simple as reading the binary data from the local filesystem. The following figure illustrates Flink’s memory management. Flink是主动管理JVM的heap内存的,会申请一组32KB的memory segments,给各种算法用 好处就是,这样减少GC的压力;而且数据是序列化成binary后存储,overhead很小;自己管理内存,内存不够的时候,可以知道并写磁盘文件 Local Strategies After the data has been distributed across all parallel join instances using either a Repartition-Repartition or Broadcast-Forward ship strategy, each instance runs a local join algorithm to join the elements of its local partition. Flink’s runtime features two common join strategies to perform these local joins: theSort-Merge-Joinstrategy (SM) and theHybrid-Hash-Joinstrategy (HH). 在ship strategy,我们已经把相同join key的数据,放到同一个local partition上,现在要做的只是run一个local join算法 Flink有两种local join算法, TheSort-Merge-Joinworks by first sorting both input data sets on their join key attributes (Sort Phase) and merging the sorted data sets as a second step (Merge Phase). The sort is done in-memory if the local partition of a data set is small enough. Otherwise, an external merge-sort is done by collecting data until the working memory is filled, sorting it, writing the sorted data to the local filesystem, and starting over by filling the working memory again with more incoming data. After all input data has been received, sorted, and written as sorted runs to the local file system, a fully sorted stream can be obtained. This is done by reading the partially sorted runs from the local filesystem and sort-merging the records on the fly. Once the sorted streams of both inputs are available, both streams are sequentially read and merge-joined in a zig-zag fashion by comparing the sorted join key attributes, building join element pairs for matching keys, and advancing the sorted stream with the lower join key. The figure below shows how the Sort-Merge-Join strategy works. 这个算法,如其名,两个过程,sort,merge 首先是,sort,如果数据足够小,在内存中直接sort,这个比较简单 如果数据比较大,需要用到外排算法,比如内存可以排序1G数据,而我有3G数据,那就每次只读1G,排序,存入一个文件,这样最终会产生3个已局部排序的文件,如图 读的时候,同时打开3个文件,边读边merge就可以产生一个全局有序的stream 然后是,merge,对于两个已排序的inputs,做join很简单 TheHybrid-Hash-Joindistinguishes its inputs as build-side and probe-side input and works in two phases, a build phase followed by a probe phase. In the build phase, the algorithm reads the build-side input and inserts all data elements into an in-memory hash table indexed by their join key attributes. If the hash table outgrows the algorithm’s working memory, parts of the hash table (ranges of hash indexes) are written to the local filesystem. The build phase ends after the build-side input has been fully consumed. In the probe phase, the algorithm reads the probe-side input and probes the hash table for each element using its join key attribute. If the element falls into a hash index range that was spilled to disk, the element is also written to disk. Otherwise, the element is immediately joined with all matching elements from the hash table. If the hash table completely fits into the working memory, the join is finished after the probe-side input has been fully consumed. Otherwise, the current hash table is dropped and a new hash table is built using spilled parts of the build-side input. This hash table is probed by the corresponding parts of the spilled probe-side input. Eventually, all data is joined. Hybrid-Hash-Joins perform best if the hash table completely fits into the working memory because an arbitrarily large the probe-side input can be processed on-the-fly without materializing it. However even if build-side input does not fit into memory, the the Hybrid-Hash-Join has very nice properties. In this case, in-memory processing is partially preserved and only a fraction of the build-side and probe-side data needs to be written to and read from the local filesystem. The next figure illustrates how the Hybrid-Hash-Join works. 这个算法会把两个input,分成bulid input和probe input 其中build input会用于以join key来build一个hash table,如果这个hash table足够小,那么很简单 当build完hash table后,我们只需要遍历probe input,如果落在hash table中,就做join 这个方法,如果build input足够小,会非常高效,因为我们不需要在内存中存probe input,只需要读一条处理一条即可 但如果build input比较大,内存放不下整个hash table怎么办? 也很简单,内存不够的时候,把部分hash table,以hash index range,存入磁盘 这样当遍历probe input的时候,如果对应的hash table在磁盘,那么暂时把这部分probe input也存入磁盘 最后,当遍历完probe input后,内存中的hash table已经完成join,删掉,载入磁盘中的hash table完成最后的join How does Flink choose join strategies? Ship and local strategies do not depend on each other and can be independently chosen. Therefore, Flink can execute a join of two data sets R and S in nine different ways by combining any of the three ship strategies (RR, BF with R being broadcasted, BF with S being broadcasted) with any of the three local strategies (SM, HH with R being build-side, HH with S being build-side). Flink features a cost-based optimizer which automatically chooses the execution strategies for all operators including joins. Without going into the details of cost-based optimization, this is done by computing cost estimates for execution plans with different strategies and picking the plan with the least estimated costs. Thereby, the optimizer estimates the amount of data which is shipped over the the network and written to disk. If no reliable size estimates for the input data can be obtained, the optimizer falls back to robust default choices. A key feature of the optimizer is to reason about existing data properties. For example, if the data of one input is already partitioned in a suitable way, the generated candidate plans will not repartition this input. Hence, the choice of a RR ship strategy becomes more likely. The same applies for previously sorted data and the Sort-Merge-Join strategy. Flink programs can help the optimizer to reason about existing data properties by providing semantic information about user-defined functions[4]. While the optimizer is a killer feature of Flink, it can happen that a user knows better than the optimizer how to execute a specific join. Similar to relational database systems, Flink offers optimizer hints to tell the optimizer which join strategies to pick[5]. 总的来说,Ship和local的策略可以分开选择; Flink的optimizer会自动选择策略,根据就是,optimizer会对每个策略进行cost estimates,选择cost相对较小的策略

优秀的个人博客,低调大师

Vectorized Execution Engine in MaxCompute 2.0简介

文章转自ruanxi 前言 在《 数据库系统中的Code Generation技术介绍》一文中,我们阐述了代码的CPU执行效率对于大规模分布式OLAP系统的重要性。现在简单总结如下: OLAP系统中查询往往比较复杂,比如多表Join, 各种聚合函数以及窗口函数,其中涉及大量的Hash计算(比如采用Hash Join, Hash Aggregation),排序(比如采用Merge-Sort Join)操作,CPU开销比较大。 SSD等高性能存储硬件的使用,以及内存计算的普及(比如Spark中利用RDD来Cache部分数据)大大提高了I/O性能,使得CPU日益成为计算的瓶颈。 在大规模分布式OLAP系统中(比如MaxCompute),因为需要实现分布式Join,聚合以及窗口函数,一个作业可能会由多级Task组成,Task与Task之间可

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册