InsideUE4 – Unreal C++ 基础、 GamePlay 架构。 手摇虚幻引擎 – 拆解 Unreal 引擎源代码,分享一些骚操作。 剖析虚幻渲染体系 – Unreal 渲染体系、渲染管线、多线程。 C# and Shader Tutorials for the Unity Engine – Unity C# 及 着色器 系统教程。 GAMES 系列课程 – 图形学、模型重建、物理引擎直到游戏引擎。
分类: Computer
引擎: UE4.26.2 构建版本 StaticMesh 简称 SM ,表示引擎中的 静态网格体 ,在新版本的引擎中, SM 也被允许在运行时构建,渲染一个 SM 需要 SMC 的支持, SMC 使用 静态/动态渲染路径 ,在允许的情况下优先使用 静态渲染路径 ,会缓存所有渲染命令。 类图 UStaticMesh 类图 classDiagram IInterface_AssetUserData <|.. UStaticMesh Interface_CollisionDataProvider
引擎: UE4.26.2 构建版本 ProceduralMeshComponent 简称 PMC ,提供一个程序化网格组件,可以通过自定义的三角形制作可渲染网格,使用动态渲染路径,在每帧收集渲染数据,没有任何数据缓存。 类结构 游戏 类图 classDiagram Interface_CollisionDataProvider <|.. UProceduralMeshComponent FPrimitiveSceneProxy <|– FProceduralMeshScenePro
众所周知 UE4 把 RTTI 给禁止了,这导致 dynamic_cast 的支持是不完全的,也就是说不支持从基类转换到子类,但是在阅读 TSoftObjectPtr (SoftObjectPtr.h) 代码时却看到: /** * Dereference the soft pointer. * * @return nullptr if this object is gone or the lazy pointer was null, otherwise a valid UObject point
开始记录状态到文件 stat startfile 停止记录状态到文件 stat stopfile 便捷作用域计时器 可以直接使用 QUICK_SCOPE_CYCLE_COUNTER(STAT_ClassName_FunctionName); 声明状态组 DECLARE_STATS_GROUP(TEXT("Group Name"), STATGROUP_GroupName, STATCAT_Advanced); 声明计数器 DECLARE_DWORD_ACCUMULATOR_S
成果 引擎版本 4.26.2 实现一个 UTexture2DArray 包裹器。 支持在 Runtime 的纹理数组创建与修改。 支持纹理数组 MipMap (官方实现只有第0层Mip)。 效果图 此纹理数组共5个元素,5个 Mip 层级。 其中,横向为元素,纵向为 Mip 层级。 代码 Texture2DArrayWrapper.h #pragma once #include "CoreMinimal.h" #include "UObject/Object.h&q
N 北 X+ S 南 X- E 东 Y+ W 西 Y- T 上 Z+ B 下 Z-
表现 Assertion failed: !FPaths::IsRelative(Dir) [File:/Engine/Source/Runtime/Projects/Private/ProjectDescriptor.cpp] [Line: 337] ../../../UGCExample/../RemappedPlugins/ is not an absolute path 解决方案 将 ProjectDescriptor.cpp 第 143 行处修改: // If this is a pa
为了防止 ICP 信息硬编码,试图修改主题 PHP 代码时发现,主题自带一个底部社交菜单,但是社交菜单会把菜单项换成图片,此操作是完全通过 CSS 代码进行的,所以只需要在自定义 CSS 中加入下面的 CSS 代码,即可覆盖。此代码通过重置社交区域的 li a 标签设置使其恢复文本显示。 .social-menu li a { all: revert; all: unset; } .social-menu { display: -webkit-box; display: -ms-flexbox;
洛谷P4781 题解公式 inline int FastPow(int x, int y) { if (y == 1) return x; if (!y) return 1; int tmp = FastPow(x, y >> 1) % mod; return tmp * tmp % mod * (y & 1 ? x : 1) % mod; } inline void Lagrange() { go(i, 1, n, 1) { up = down = 1; go(j, 1,
洛谷P3834 教程视频 #pragma once #include<algorithm> #include<bitset> #include<cmath> #include<cstring> #include<cstdlib> #include<cstdio> #include<complex> #include<fstream> #include<iostream> #include&
void AsyncTask(ENamedThreads::Type Thread, TUniqueFunction<void()> Function); 一般任务线程: ENamedThreads::AnyHiPriThreadNormalTask 一般回调线程: ENamedThreads::GameThread
PRAGMA_DISABLE_OPTIMIZATION // Code PRAGMA_ENABLE_OPTIMIZATION
原文传送门 FRunnable & FRunnableThread FRunnable提供了最为原始的线程支持,类似std::Thread,虽然没那么优雅,但是功能略多于std::Thread FRunnable—-承载业务逻辑 +[f] Init : 初始化,可以失败 +[f] Run : 线程运行函数,返回退出代码 +[f] Stop : 提前终止这个线程 +[f] Exit : 进行退出前的清理 +[f] GetSingleThreadInterface : 平台不支持
原生插件 Adblock Plus – 通用广告拦截器 Adblock for Youtube™ – Youtube 广告拦截器 Dark Reader – 自适应暗色主题 Proxy SwitchyOmega – 网络代理智能控制 Tampermonkey – 油猴插件支持 User-Agent Switcher and Manager – 伪造客户端信息 Violentmonkey – 油猴插件支持 YouT
lli fac[maxn]; // 阶乘 lli inv[maxn]; // 逆元 lli invf[maxn]; // 逆元的阶乘 inline void init() { fac[0] = 1; for (lli i = 1; i < maxn; ++i) fac[i] = fac[i – 1] * i % mod; inv[1] = 1; for (lli i = 2; i < maxn; ++i) inv[i] = inv[mod % i] * (mod – mod / i)
struct fenwick_tree_t { lli n; vector<lli> tre; fenwick_tree_t(lli n) : n(n), tre(n + 1, 0) { } lli lowbit(lli x) { return x & -x; } void build(lli* arr) { for (lli i = 1; i <= n; ++i) upd(i, arr[i]); } void upd(lli i, lli x) { for (; i
lli gcd(lli x, lli y) { return y ? gcd(y, x % y) : x; }
std::chrono::system_clock::time_point bt = std::chrono::system_clock::now(); std::chrono::system_clock::time_point et = std::chrono::system_clock::now(); std::chrono::nanoseconds dt = std::chrono::duration_cast<std::chrono::nanoseconds>(et – bt
[ 络谷 ] lli dsu[maxn]; lli dis[maxn]; lli num[maxn]; void init_dsu() { for (lli i = 0; i < maxn; ++i) dsu[i] = i; for (lli i = 0; i < maxn; ++i) dis[i] = 0; for (lli i = 0; i < maxn; ++i) num[i] = 1; } lli find_dsu(lli x) { if (dsu[x] == x) r
约定存边方式为从左部到右部的有向边,左右部点编号相同 匈牙利算法 lli mch[maxn]; lli vis[maxn]; bool dfs_hun(lli u, lli dfn) { if (vis[u] == dfn) return false; vis[u] = dfn; for (lli i = head[u]; ~i; i = edge[i].nxt) { lli v = edge[i].v; if (mch[v] == 0 || dfs_hun(mch[v], dfn)) { mc
倍增思想 由 倍增 LCA 改的 lli mw[32][maxn]; lli fa[32][maxn]; lli dep[maxn]; void dfs_mw(lli u) { dep[u] = dep[fa[0][u]] + 1; for (lli i = 1; (1 << i) <= dep[u]; ++i) fa[i][u] = fa[i – 1][fa[i – 1][u]]; for (lli i = 1; (1 << i) <= dep[u]; ++
lli n; lli arr[maxn]; lli lg[maxn]; lli st[maxn][32]; inline lli flg(lli x) { if (lg[x]) return lg[x]; lli tmp = x; lli res = 0; while (tmp) tmp >>= 1, ++res; return lg[x] = res – 1; } inline void init_st() { for (lli i = 1; i <= n; ++i) st[
题目传送门 性质 删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心;2.树中所有节点到重心的距离之和最小,如果有两个重心,那么他们距离之和相等; 两个树通过一条边合并,新的重心在原树两个重心的路径上; 树删除或添加一个叶子节点,重心最多只移动一条边; 一棵树最多有两个重心,且相邻。 思路 如果找到只有一个重心,那么直接删一个重心的直连边然后加回去就好了。 如果找到两个重心,那么在其中一个重心上找到一个直连点不是另一个重心,删除连另外一个就好了。 如何求树的重心? 先任选一
原理 https://blog.csdn.net/alexfaker/article/details/90199074 模板 https://www.cnblogs.com/iloveori/p/12526461.html#%E8%A7%82%E5%89%8D%E6%8F%90%E7%A4%BA%EF%BC%9A%E8%AF%B7%E4%B8%8D%E8%A6%81%E5%9C%A8%E8%B4%9F%E6%9D%83%E5%9B%BE%E4%B8%AD%E7%86%9F%E7%BB%83%E7
原题链接 https://codeforces.com/contest/1406/problem/D 思路 样例中a=2,-1,7,3; 差分为-3,8,-4; 设(b[1]=x)+(c[1]=y)=a[1]; ∵b[1]=c[2]>=…>=c[n] x+(y-3)=(x-1)+(y-2)=(x+1)+(y-4)=…=a[2] ∴b[2]=x c[2]=y-3为最优解 其他的解都会导致b[n]或者c[1]变大 使最后答案不是最小 即:差分>0时,将差分的
络谷 P1962 斐波那契数列
硬获取 UObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(UUserDefinedStruct::StaticClass(), false, GIsEditor); ObjectLibrary->LoadAssetDataFromPath(TEXT("/Game")); TArray<FAssetData> AssetDatas; ObjectLibrary->GetAssetD
络谷 P3379 [模板] 最近公共祖先 LCA 欧拉序+线段树 int cnt; int dep[maxn]; int eoo[maxn]; int ooe[maxn << 1]; void dfs_ooe(int u, int f) { dep[u] = dep[f] + 1; ooe[++cnt] = u; eoo[u] = cnt; for (int i = head[u]; ~i; i = edge[i].nxt) { int v = edge[i].v; if (f ==
题解 [该代码需要配合线段树] int cnt; int fa[maxn]; int dep[maxn]; int siz[maxn]; int son[maxn]; int rk[maxn]; int top[maxn]; int id[maxn]; inline void init_tree() { cnt = 0; } void dfs_ss(int u) { int ms = -1; int mss = 0; siz[u] = 1; for (int i = head[u]; ~i; i
#ifdef __cpp_if_constexpr template <typename T, typename… Args> void read(T& x, Args&… r) { if constexpr (is_integral_v<T> && !is_same_v<decay_t<T>, char>) { x = 0; lli f = 1; char ch = getchar(); while (!i
r.VolumetricFog.GridPixelSize 体积雾像素大小 r.VolumetricFog.GridSizeZ 体积雾Z深度 r.VolumetricFog.TemporalReprojection 时间效果累加 r.VolumetricFog.HistoryWeight 时间效果累加长度[帧] r.VolumetricFog.Jitter 抖动累计
我见到你所说的那位玩家了。 (玩家姓名)? 是的。小心。他现在已达到了更高的境界。他能阅读我们的思想。 没关系。他认为我们是游戏的一部分。 我喜欢这个玩家。他玩得很好。他没有放弃。 他以屏幕上出现的文字的形式阅读着我们的思想。 在他深陷游戏的梦境时,他总以这种方式想象出各种各样的事物。 文字营造出了一种美妙的界面。非常灵活。而且比起凝视屏幕后的现实来说,不会让人那么恐惧。 他们也曾经听到过声音。在玩家能够阅读之前。那些不在玩的人们称呼玩家为女巫、术士。而玩家们梦见他们自己乘坐在被恶魔施加了力量的
条款 01:视 C++ 为一个语言联邦 C++分为:C部分、对象C++部分、模板C++部分、STL部分。 条款 02:尽量以 const、enum、inline 替换 #define const: 表示修饰的内容不可更改。 enum: 本质是 int 类型。 inline: 在 class 内时,如果函数允许,他被自动启用。 条款 03:尽可能使用 const 这有利于编译器更好的优化程序,并且让客户减少误操作。 在函数传值时,对于自定义类型,最好使用 const 引用。 用 mutable 修
放在代码的最前面,感受性能加速吧!
#include <cstdio> #include <cstring> using namespace std; const int MOD = 1e4; const int MAXN = 12; struct Mat { long long mat[MAXN][MAXN]; int n, m; Mat operator * (const Mat &b) const { Mat a = *this; Mat ans; ans.n = a.n; ans.m = b
dfs(数的最后若干位,各种限制条件,当前第几位) if 最后一位 return 各种限制条件下的返回值 局部变量 ct=当前位的数字 局部变量 sum=0; for i=0 to ct-1 sum+=当前位取i时一定无无限制的合法状态数 sum+=当前位取i时满足当前限制的合法状态数 根据ct更新限制条件 不再满足则return sum return sum+dfs(当前位后的若干位,更新后的限制条件,下一位) slv(当前数) if(只有一位) return 对应的贡献 局部变量 ct; f
仅供学习,不要违规使用,IP及账号被封禁后果自负!!! DDos.java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.io.IOException; import java.io.InputStream; import java.io.BufferedInputStream; import java.net.URL; import java.net
此问题主要影响忘记密码时的找回密码功能及新用户注册时,系统给新用户发送的密码设置功能。可通过以下两个步骤解决此问题:
原型 typedef struct _D3DPRESENT_PARAMETERS_ { UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BO
准备 下载源码 下载地址:http://www.wxwidgets.org/downloads/ 选择 Source Code > Windows 7z 下载 解压源码 解压 wxWidgets 编译源码 用 V S打开 wxWidgets-X.X.X\build\msw\wx_vc15.sln 分别选择Debug、DLL Debug、DLL Release、Release 然后点击 生成 > 生成解决方案 等待编译完成即可 样例 准备 新建一个空项目,建立 Main.cpp,复制官