変更
次のSEを置き換えればよい.
Engine/Content/EditorSounds/Notifications
この調子だとほとんどのエディタリソースを置き換える必要がありそうです.
次のSEを置き換えればよい.
Engine/Content/EditorSounds/Notifications
この調子だとほとんどのエディタリソースを置き換える必要がありそうです.
CI/CD環境の構築が属人化するなら, もう私が扱いやすい環境があればいいのではないか?, ということで脱Jenkinsを行い, ConcourseでどうしてもUE4のビルドを自動化したいです. WSLやWSL上のDockerの構築については省略します.
Jenkinsではだめなのかというと, 扱い辛いからです. よく属人化すると言われますが, その理由を説明した資料を私は知りません. 私のまわりでは次の理由だと思います.
WSLである理由は環境移行が楽かもしれないということです. 今日の企業ではレンタルPCで社員の環境を作ることが多く, ビルドマシンも同じくレンタルPCが多いです. それほど頻繁ではないですが, レンタル期間終了とともに環境移行を強いられます. 以前にWindows上のVM環境にビルド環境を構築して移行を楽にしようと頑張りましたが失敗しました. 原因はファイルシステムのアクセスです. VMからはともかく, CI/CDツール越しではうまくいきませんでした. WSLならもう少し楽になるのでは?
Windows向けビルドしか試していませんが, RunUAT.batが呼び出せれば大体解決しそうです.
まず, コンコースのサーバ・クライアント・ユーティリティを兼ねたバイナリを取得します. このバイナリさえあればDockerは必要ないのですが, DBの構築も面倒なので, このバイナリは鍵生成だけに使います.
$curl -OL https://github.com/concourse/concourse/releases/download/vX.X.X/concou$rse-X.X.X-linux-amd64.tgz
$tar zxvf concourse-X.X.X-linux-amd64.tgz
バイナリを取得できたら鍵を生成します. ポイントはワーカの公開鍵を別名でコピーしている部分です.
$mkdir -p keys/web keys/worker
$./concourse/bin/concourse generate-key -t ssh -f ./tsa_host_key
$./concourse/bin/concourse generate-key -t ssh -f ./worker_key
$cp ./worker_key.pub ./keys/web/authorized_worker_keys
$mv ./tsa_host_key ./keys/web/
$mv ./worker_key ./keys/worker/
$mv ./tsa_host_key.pub ./keys/worker/
$mv ./worker_key.pub ./keys/web/
docker-compose.ymlを作成します.
version: '3'
services:
concourse-db:
image: postgres
container_name: concourse-db
environment:
POSTGRES_DB: concourse
POSTGRES_PASSWORD: concourse_pass
POSTGRES_USER: concourse_user
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./db/postgres:/var/lib/postgresql/data
- ./db/logs:/var/log
concourse:
image: concourse/concourse
container_name: concourse
restart: unless-stopped
command: web
privileged: true
depends_on: [concourse-db]
ports: ["8000:8080", "2222:2222"]
volumes: ["./keys/web:/concourse-keys"]
environment:
CONCOURSE_POSTGRES_HOST: concourse-db
CONCOURSE_POSTGRES_USER: concourse_user
CONCOURSE_POSTGRES_PASSWORD: concourse_pass
CONCOURSE_POSTGRES_DATABASE: concourse
CONCOURSE_EXTERNAL_URL: http://localhost:8000
CONCOURSE_ADD_LOCAL_USER: admin:admin
CONCOURSE_MAIN_TEAM_LOCAL_USER: admin
CONCOURSE_WORKER_BAGGAGECLAIM_DRIVER: overlay
concourse-worker:
image: concourse/concourse
privileged: true
links: [concourse]
depends_on: [concourse]
command: worker
volumes: ["./keys/worker:/concourse-keys"]
environment:
CONCOURSE_TSA_HOST: concourse:2222
これが重要です. WSL上のシェルからなんとかできるかと試行錯誤しましたが, 妥協してWindows上でワーカを動かす方が楽でした. Windows用のconcourseバイナリを取得して起動するだけです.
concourse worker --work-dir ./work --tsa-host localhost:2222 --tsa-public-key ./keys/worker/tsa_host_key.pub --tsa-worker-private-key ./keys/worker/worker_key
targetはサーバに対応します. 1サーバで複数プロジェクトを管理するなら, チームを使用します.
fly -t server_name set-team --team-name project_name --local-user user_name
ログインは, -nでチーム名を指定します.
fly -t server_name login -n project_name -u user_name -p user_pass
最も単純なビルド設定は次のようになります. 結局, バッチファイルに行きついていますが, バッチファイルの引数である程度柔軟にできると思います.
jobs:
- name: build_quickstart
plan:
- task: build
config:
platform: windows
run:
path: cmd.exe
args: ["/c", "chcp 65001 & cd /d ((PROJECT_ROOT)) & call build.bat"]
パラメータ((PROJECT_ROOT))は別のファイルenvironment.ymlで定義しています.
PROJECT_ROOT: "X:/Path to Unreal Project"
パイプライン設定時に-lオプションでパラメータ設定を指定します.
$ fly -t main sp -p build -c build.yml -l environment.yml
build.batも一応書いておきます, environment.batはRunUAT.batのパスを設定しているだけです.
call environment.bat
%UNREAL_RUNUAT% BuildCookRun -project=%~dp0/project.uproject -build -cook -stage -allmap -pak -nop4 -partialgc -platform=Win64 -clientconfig=Development
DockerがiptablesでNATの設定をしようとするが, Debianは別のソフトウェアでNATを設定しているので失敗する, でいいのでしょうか.
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
数年前は使うこともあったのですが, 現代にはふさわしくないと思い使わなくなりました.
他人に強制するつもりはありませんが, 意味のないイディオムだと思います.
プログラムから, テクスチャ圧縮がしたいです. BC1, BC3, BC6h BC7についてはispc texture compressionを使おうと思っていましたが, BC5がないのです.
ガイドに仕様がちゃんと書いてあります. 簡単そうなので作ってしまいます.
4x4のブロックごとに圧縮するブロック圧縮です. BC4はRだけの1チャネル, BC5はRGの2チャネルを扱います. 4x4x2 = 32 bytesを次の tablex2 = 16 bytesに圧縮します. BC5_UNORMとBC5_SNORMの2バリエーションです. 2つはシェーダでサンプルした場合, [0 1]の浮動小数点数になるか, [-1 1]の浮動小数点になるかが違います.
テーブルは, 4x4の最小値と最大値が先頭に2バイト, 次に3bits x 16のテーブルへのインデックスが並びます.
/* MSB LSB | red_0 | 1 byte minimum color | red_1 | 1 byte maximum color | red_h | red_g | red_f | red_e | red_d | red_c | red_b | red_a | 3 bits x 8 | red_p | red_o | red_n | red_m | red_l | red_k | red_j | red_i | 3 bits x 8 */
テーブルは明示的に持たず最大値, 最小値から計算します. UNORMとSNORMで1箇所異なりますが, 圧縮するだけならばどちらでも同じなので統一します.
static constexpr u32 Shift = 20;
void createTable(s32 colors[8], s32 block[16])
{
colors[0] = block[0];
colors[1] = block[0];
for(u32 i = 1; i < 16; ++i) {
colors[0] = minimum(colors[0], block[i]);
colors[1] = maximum(colors[1], block[i]);
}
colors[0] <<= Shift;
colors[1] <<= Shift;
if(colors[1] < colors[0]) {
// 6 interpolated color values
colors[2] = (6 * colors[0] + 1 * colors[1]) / 7; // bit code 010
colors[3] = (5 * colors[0] + 2 * colors[1]) / 7; // bit code 011
colors[4] = (4 * colors[0] + 3 * colors[1]) / 7; // bit code 100
colors[5] = (3 * colors[0] + 4 * colors[1]) / 7; // bit code 101
colors[6] = (2 * colors[0] + 5 * colors[1]) / 7; // bit code 110
colors[7] = (1 * colors[0] + 6 * colors[1]) / 7; // bit code 111
} else {
// 4 interpolated color values
colors[2] = (4 * colors[0] + 1 * colors[1]) / 5; // bit code 010
colors[3] = (3 * colors[0] + 2 * colors[1]) / 5; // bit code 011
colors[4] = (2 * colors[0] + 3 * colors[1]) / 5; // bit code 100
colors[5] = (1 * colors[0] + 4 * colors[1]) / 5; // bit code 101
colors[6] = 0; // bit code 110
colors[7] = 255<<Shift; // bit code 111
}
}
ピクセル値に最も近いテーブルインデックスを検索して, 符号化します.
u64 findNearest(s32 colors[8], s32 x)
{
u32 index = 0;
s32 mind = absolute(colors[0] - x);
for(u32 i = 1; i < 8; ++i) {
s32 d = absolute(colors[i] - x);
if(d < mind) {
mind = d;
index = i;
}
}
return index;
}
GPUOpen Compressonatorと結果が異なるため, もっといい方法がありそうです.
GCC 11.0から, LLVM 12.0から, -marchオプションにx86-64用のCPU命令世代指定が追加された.
-march=x86-64-v[234]のように, 命令セットを対象に, ある程度の範囲で絞った世代に分割して指定することができる.
これまで, -march=nativeとしてコンパイルしたCPUに合わせるか, -march=skylakeなどのCPUを固定する方法しかなかった.
CPUベンダとしては, 新CPUごとに新しい命令を追加してアピールしたい. 開発者としては, ある程度古いCPUもサポートしながら, 新しい命令も使いたい. このふたつの間を埋める機能といえます. 開発者が, ある命令セットがどのCPUからサポートしているのか, 把握して管理することは手間がかかります.
| オプション | 有効になる命令 | CPU世代 |
|---|---|---|
| x86-64 | CMOV, CMPXCHG8B, FPU, FXSR, MMX, FXSR, SCE, SSE, SSE2 | Pentium 4 |
| x86-64-v2 | CMPXCHG16B, LAHF-SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3 | Nehalem |
| x86-64-v3 | AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, XSAVE | Haswell |
| x86-64-v4 | AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL | Skylake Xeon |