メインコンテンツまでスキップ

[1.17] Minecraftサーバー最適化ガイド

snake
管理者

このガイドはYouHaveTrouble/minecraft-optimizationの日本語訳です。日本語訳は適当であるため、適時原文を確認することを推奨します。

本ガイドによって生じたあらゆる問題について責任を負いません。


Vanilla、Fabric、Spigot(またはPaperより下流のバージョン)をお使いの方は、server.propertiesを開き、sync-chunk-writesfalseに変更してください。このオプションはPaperとそのforkでは強制的に無効化されますが、それ以前のサーバー実装では、手動でこのオプションをオフにする必要があります。これにより、サーバーはメインスレッドからチャンクを保存し、メインtickの負荷を軽減することができます。

このガイドは、バージョン1.17のガイドです。一部の項目のみ1.15~1.16にも適用されます。

このガイドと他の情報源に基づいています(これらの情報源は、関連する場合、ガイド全体にリンクされています)。

導入

完璧な結果を得る事のできるガイドは存在しません。それぞれのサーバーには独自のニーズが存在しており、どれだけの犠牲を払うことができるのか、あるいは払うことができるかには限界があります。オプションを変更することで、サーバーのニーズを合わせて微調整することが、全てです。このガイドは、どのオプションがパフォーマンスに影響を与えているのか、何を変更しているのかを理解することを目的としています。

準備

サーバーJar

サーバーソフトウェアの選択によっては、パフォーマンスとAPIの可能性に大きな違いが現れます。現在、複数の有力なサーバーJARがありますが、様々な理由により使用を控えたほうが良いものもいくつかあります。

おすすめのサーバーJar:

Paper  - ゲームプレイやメカニックの不整合を修正しながら、パフォーマンス向上を目的とした最も人気のあるサーバーソフトウェアです。

Airplane - サーバーのパフォーマンスをさらに向上させることを目的とした Paper forkです。

Purpur - 機能とカスタマイズの自由に焦点を当てたAirplane forkです。

推奨されないサーバーJar:

Yatopia - "Paper forkの総力を結集し、最大限の不安定さとメンテナンス性を実現!" - KennyTV's list of shame これ以上何も言うことはありません。(このプロジェクトは中止されています)

Sugarcane - Yatopia 2.0

Mohist - "Mohistは悪意があり、ゲームを壊し、非常に不安定であるようにプログラムされています" - 使うべきではない理由

非同期を謳った有料サーバーjar - 99.99%の確率で詐欺です。

Bukkit/CraftBukkit/Spigot - 利用できる他のサーバーソフトウェアと比較して、パフォーマンスの点で非常に時代遅れです。

AirplaneやPurpurよりもさらに下流にある多くのforkでは、不安定さやその他の問題が発生します。より多くのパフォーマンス向上を求めるのであれば、サーバーを最適化するか、個人的なプライベートforkに時間を投資してください。

ワールドの事前生成

ワールドの事前生成は、低予算のサーバーを改善するために、最も重要なステップの1つです。共有CPUやシングルコアのノードでホストされているサーバーでは、非同期のチャンク読み込みを十分に活用できないため、この方法が最も友好です。Chunkyなどのプラグインを使うことで、ワールドを事前に生成することができます。プレイヤーが新しいチャンクを生成しないように必ずワールドの境界線を設定してください。プラグインで自動生成をする場合、設定した範囲によっては数時間かかる場合があるので注意してください。

オーバーワールド、ネザー、エンドにはそれぞれ別のワールドの境界線を設定する必要があります。ネザーのディメンションはオーバーワールドの8倍小さいので(データパックで変更されていない場合)、サイズ設定を間違えるとプレイヤーがワールドの境界線の外へと出てしまうかもしれません。

宝の地図の探索範囲のような一部の機能がラグの原因となる為、必ずバニラのワールドの境界線を設定してください。(/worldborder set [距離]

設定

ネットワーク

server.propaties

network-compression-threshold

値: 256

この値により、サーバーが圧縮を試みる前のパケットサイズの上限を設定できます。この値を高く設定すると、帯域幅を犠牲にしてCPUを節約することができ、-1に設定するとこの機能が無効になります。この値を高く設定すると、ネットワーク接続の遅いクライアントに悪影響を及ぼす可能性があります。サーバーがプロキシのネットワーク上に存在する場合や、同じコンピュータ上に存在する場合(Pingが2ms以下の場合)は、内部のネットワークの速度が通常、追加の非圧縮トラフィックを処理可能であるため、この機能を無効(-1)にすることができます。

purpur.yml

use-alternate-keepalive

値: true

Purpurのalternate keepaliveを有効にすることで,接続状態の悪いプレイヤーがタイムアウトになることが少なくなります。TCPShieldとの互換性はありません。

これを有効にすると、1秒に1回keepaliveパケットがプレイヤーに送信され、30秒以内にどれも応答されなかった場合のみタイムアウトになります。つまり、1つのパケットがどこかでドロップしたからといって、プレイヤーがキックされることはありません。

Purpur Documentation - Configuration

チャンク

spigot.yml

view-distance

値: 4

view-distanceは、プレイヤー周りのチャンクの距離です。基本的には、プレイヤーから何かが起こるまでの距離です。これには炉の精錬、作物や苗木の成長などが含まれます。この値は、server.propatiesの値を上書きし、ワールドごとに設定可能であるため、spigot.ymlで設定する必要があります。これはno-tick-view-distanceの存在を考慮して、意図的に低く設定したいオプションであるため、3~4あたりに設定します。no-tickは、プレイヤーがtickすることなく、より多くのチャンクをロードする事を可能にします。これにより、プレイヤーはパフォーマンスに影響を与えること無く、より遠くまで見ることができます。

paper.yml

no-tick-view-distance

値: 7

このオプションでは、プレイヤーが見ることのできる最大距離をチャンク単位で設定することができます。これによりview-distanceを短くしてもプレイヤーにより遠くのチャンクを表示することができます。view-distanceを超えるチャンクはチェックされませんが、ストレージから読み込まれるため、やりすぎないようにすることが重要です。基本的には10が最大値となります。今の所、チャンクはview-distanceの設定に関係なくクライアントに送信されるので、このオプションの値を高くすると、接続速度の遅いプレイヤーに問題が生じる可能性があります。

delay-chunk-unloads-by

値: 10

このオプションでは、プレイヤーがいなくなった後のチャンクがロードされ続ける時間を設定できます。これにより、プレイヤーが前後に移動しても、同じチャンクを常にロードしたりアンロードしたりしないようになります。値が高すぎると、一度に多くのチャンクがロードされてしまいます。頻繁にテレポートされてロードされるエリアでは、そのエリアを恒久的にロードすることを検討してください。常にチャンクをロードしたりアンロードしたりするよりも、サーバーの負担が軽くなります。

max-auto-save-chunks-per-tick

値: 8

ワールドセーブの増分を遅くし、タスクの時間を分散させることで、平均的なパフォーマンスを向上させることができます。20~30人以上のプレイヤーがいる場合は、この値を8よりも高く設定するとよいでしょう。増分保存が間に合わなかった場合、bukkitは自動的に残りのチャンクを一度に保存し、再度プロセスを開始します。

prevent-moving-into-unloaded-chunks

値: true

この機能を有効にすると、プレイヤーが読み込みされていないチャンクに入り込み、メインスレッドに負担をかけるような同期読み込みが発生し、ラグの発生を防ぎます。プレイヤーが読み込まれていないチャンクに遭遇する確率は、no-tick-view-distanceが低いほど高くなります。

entity-per-chunk-save-limit

値:

experience_orb: 16 arrow: 16 dragon_fireball: 3 egg: 8 ender_pearl: 8 eye_of_ender: 8 fireball: 8 small_fireball: 8 firework_rocket: 8 potion: 8 llama_spit: 3 shulker_bullet: 8 snowball: 8 spectral_arrow: 16 experience_bottle: 3 trident: 16 wither_skull: 4 area_effect_cloud: 8

この項目では、指定した種類のエンティティを保存できる数に制限を設けることができます。大量のエンてィィが保存され、それを読み込む際にサーバーがクラッシュするという問題を避けるために、少なくとも各エンティティに制限を設けるべきです。エンティティのIDはMinecraft wikiで確認できます。制限はお好みで調整してください。すべてのエンティティの推奨値は10前後です。IDで他のエンティティをこのリストに追加することもできます。この設定オプションは、プレイヤーが大規模なMobファームを作るのを防ぐためのものではありません。

seed-based-feature-search-loads-chunks

値: true

これをfalseに設定すると、treasure-maps-return-already-discoveredfalseになっている場合のパフォーマンスが向上しますが、構造物が実際にはマップ上でマークされた場所にないなど、予期しない動作が発生する可能性があります。問題がないようであれば、これを変更してください。

Mobs

bukkit.yml

spawn-limits

値:

monsters: 20 animals: 5 water-animals: 2 water-ambient: 2 water-underground-creature: 3 ambient: 1

Mobを制限する計算は、[プレイヤー数] * [制限]です。「プレイヤー数」はサーバー上の現在のプレイヤー数です。論理的には、数字が小さいほど、Mobの数は少なくなります。per-player-mob-spawnは、Mobがプレイヤー間で均等に分配されるように、これに追加の制限を加えます。これを減らすことは両刃の剣です。確かにサーバーの仕事は減りますが、ゲームモードによっては自然にスポーンするMobがゲームプレイの大きな部分を占めています。mob-spawn-rangeを適切に調整すれば、20以下にすることもできます。mob-spawn-rangeを低く設定すると、各プレイヤーの周りに多くのMobがいるようになります。Paperを使用している場合は、paper.ymlでワールドごとのMob制限を設定できます。

ticks-per

値:

monster-spawn: 10 animal-spawns: 400 water-spawns: 400 water-ambient-spawns: 400 water-underground-creature-spawns: 400 ambient-spawns: 400

このオプションは、サーバーが特定のMobをスポーンしようとする頻度(tick)を設定します。water/ambientは、通常そんなに早く殺されることはないので、1tickごとにスポーンする必要はありません。モンスターの場合、スポーン間の時間をわずかに長くしても、スポーン率に影響はありません。ほとんどの場合、このオプションのすべての値を1より高くする必要があります。この値を高くすることで、Mobのスポーンが無効になっているエリアにサーバーがうまく対応できるようになります。

Spigot.yml

mob-spawn-range

値: 2

プレイヤーの周りでMobがスポーンする範囲を(チャンク単位で)狭めることができます。サーバーのゲームモードやプレイヤー数によっては、bukkit.ymlのspawn-limitsと一緒にこの値を下げた方がいいかもしれません。この値を小さくすると、多くのモブがプレイヤーの周りにいるようになります。この値はview distanceと同じかそれ以下で、ハードデスポーン範囲/16より大きくしてはいけません。

entity-activation-range

値:

animals: 16 monsters: 24 raiders: 48 misc: 8 water: 8 villagers: 16 flying-monsters: 48

エンティティがtick(何かをする)のために、プレイヤーからどのくらいの距離が必要かを設定できます。この値を下げるとパフォーマンスが向上しますが、プレイヤーが近づかないと反応しないMobが出てきます。この値を下げすぎると、一部のトラップが壊れる可能性があります。

entity-tracking-range

値:

players: 48 animals: 48 monsters: 48 misc: 32 other: 64

これはエンティティが見えるようになるまでのブロック距離です。プレイヤーには送信されません。この値が低すぎると、プレイヤーの近くに突然Mobが現れることがあります。ほとんどの場合、この値はentity-activation-rangeよりも高く設定する必要があります。

tick-inactive-villagers

値: false

activation range外でも村人をtickするかどうかを制御できます。これにより村人は通常通り進行し、activation rangeを無視します。これを無効にすると、パフォーマンスが向上しますが、一部の状況ではプレイヤーが混乱する可能性があります。これにより鉄トラップや貿易の補充に問題が生じる可能性があります。

nerf-spawner-mobs

値: true

スポナーによってスポーンされたMobがAIを持たないようにできます。ナーフされたMobは何もしません。spawner-nerfed-mobs-should-jumppaper.ymltrueに変更することで、水の中でジャンプするようになります。

paper.yml

despawn-ranges

値:

soft: 30 hard: 56

エンティティのデスポーン範囲(ブロック単位)を調整できます。これらの値を低くすると、プレイヤーから遠くにいるMobをより早く消すことができます。softは30程度にして、hardはview-distanceより少し大きめに調整すると、チャンクが読み込まれているポイントをプレイヤーが超えたときに、Mobがすぐにデスポーンしないようになります(paper.ymldelay-chunk-unloads-byでうまくいきます)。Mobがhardから外れると、即座にデスポーンされます。softとhardの間にいるときは、ランダムな確率でデスポーンされます。hardはsoftよりも大きくする必要があります。view-distanceに応じて、(view-distance * 16) + 8で調整してください。これは、プレイヤーが訪れた後にまだアンロードされていないチャンクを部分的に考慮しています。

per-player-mob-spawns

値: true

このオプションは、プレイヤーの周りにいるMobの数をスポーンに考慮するかどうかを決定します。Mob制限全体を占めるトラップを作っているプレイヤーのせいで、Mobのスポーンが安定しないという問題を回避することができます。これにより、シングルプレイヤーのようなスポーンが可能になり、spawn-limitsを低く設定することができます。これを有効にすると、パフォーマンスにごくわずかな影響がありますが、その影響はspawn-limitsの改善によって相殺されます。

max-entity-collisions

値: 2

spigot.ymlの同名オプションを上書きします。1つのエンティティが一度に処理できる衝突の数を決定します。0を指定すると、プレイヤーを含む他のエンティティを押すことができなくなります。ほとんどの場合、2で十分です。ゲームルールのmaxEntityCrammingの値がこの設定オプションの値を超えている場合、この設定は無意味になることに注意してください。

update-pathfinding-on-block-update

値: false

これを無効にすると、経路探索の回数が減り、パフォーマンスが向上します。Mobは5tick(0.25秒)ごとにパスを更新します。

fix-climbing-bypassing-cramming-rule

値: true

これを有効にするとエンティティが登っているときにcrammingの影響を受けないように修正されます。これにより登っていても狭い場所に無茶苦茶な量のMobが積まれることがなくなります。

armor-stands-tick

値: true

ほとんどの場合、これはfalseにしておけば安全です。アーマースタンドやその動作を変更するプラグインを使用していて問題が発生した場合は、再度有効にしてください。これにより、アーマースタンドが水に押されたり、重力の影響を受けたりしなくなります。

armor-stands-do-collision-entity-lookups

値: false

ここではアーマースタンドの衝突を無効にすることができます。これは、アーマースタンドがたくさんあって、何かと衝突する必要がない場合に役立ちます。

tick-rates

値:

sensor: villager: secondarypoisensor: 80 nearestbedsensor: 80 villagerbabiessensor: 40 playersensor: 40 nearestlivingentitysensor: 40 behavior: villager: validatenearbypoi: 60 acquirepoi: 120

これは指定された行動やセンサーがどのくらいの頻度で実行されるかをtick単位で決定します。村人が道に迷うなどの問題がある場合は減らしてください。

airplane.yml

max-loads-per-projectile

値: 8

プロジェクタイルがそのライフタイム中に読み込みできるチャンクの最大量を指定します。減らすと、エンティティプロジェクタイルによるチャンクの読み込みが減りますが、トライデントやエンダーパールなどで問題が発生する可能性があります。

max-tick-freq

値: 20

このオプションはプレイヤーから最も遠い場所にあるエンティティがtickされる最も遅い時間を定義します。この値を大きくすると、視界から遠いエンティティのパフォーマンスが向上しますが、トラップが壊れたり、Mobの動作が大幅に遅くなる可能性があります。

activation-dist-mod

値: 7

Mobがtickされる際のグラデーションをコントロールします。DABはEARのようなハードカットオフではなく、グラデーションで動作します。DABは、近くのエンティティを完全にtickし、遠くのエンティティをほとんどtickしない代わりに、この計算結果に基づいてエンティティがtickされる量を減らします。これを減少させると、DABはプレイヤーの近くで起動し、DABのパフォーマンスが向上しますが、エンティティが周囲とどのように相互作用するかに影響し、トラップが壊れる可能性があります。

purpur.yml

dont-send-useless-entity-packets

値: true

このオプションを有効にすると、サーバーが空の位置変更パケットを送信するのを防ぐことで、帯域幅を節約できます(デフォルトでは、サーバーはエンティティが移動していなくても、各エンティティに対してこのパケットを送信します)。クライアント側のエンティティを使用するプラグインで問題が発生する可能性があります。

aggressive-towards-villager-when-lagging

値: false

これを有効にすると、サーバーがpurpur.ymllagging-thresholdで設定されたTPSのしきい値を下回った場合、ゾンビは村人をターゲットにしなくなります。

entities-can-use-portals

値: false

このオプションはプレイヤー以外のすべてのエンティティのポータル使用を無効にすることができます。これによりメインスレッドで処理されるワールドの変更によってエンティティがチャンクを読み込むことを防ぎます。これはエンティティがポータルを通過できなくなるという副作用があります。

villager.brain-ticks

値: 2

このオプションでは村人がどのくらいの頻度(tick)で処理するかを設定できます。3以上にすると、村人の動きが安定しなくなったり、バグったりすることが確認されています。

villager.lobotomize

値: true

ロボトミー化した村人はAIが剥奪され、たまにしか取引を補充しません。これを有効にすると、目的地までの経路探索ができない村人をロボトミー化します。解放するとロボトミー化が解除されます。

その他

spigot.yml

merge-radius

値:

item: 3.5 exp: 4.0

マージするアイテムとexpオーブの間の距離を決定し、地面に落ちるアイテムの量が減少します。これを高く設定しすぎると、アイテムやexpオーブが一緒にマージされると消えてしまうような錯覚につながります。この値を大きくしすぎると、一部のファームが破壊され、アイテムがブロックを介してテレポートできるようになります。アイテムが壁を通ってマージされないようにするためのチェックは行われません。exp は作成時にのみマージされます。

hopper-transfer

値: 8

ホッパーがアイテムが移動するのを待機する時間(tick)。これを増やすと、サーバー上にホッパーが多い場合はパフォーマンスが向上しますが、設定値が大きすぎると、ホッパーベースのクロックやアイテムソートシステムが壊れる可能性があります。

hopper-check

値: 8

ホッパーが上のアイテムや上のインベントリにあるアイテムをチェックするまでの時間(tick)です。この値を大きくすると、サーバーに多くのホッパーがある場合はパフォーマンスが向上しますが、ホッパーベースのクロックや水流に依存したアイテムソートシステムが壊れる可能性があります。

Paper.yml

alt-item-despawn-rate

値:

enabled: true items: COBBLESTONE: 300 NETHERRACK: 300 SAND: 300 RED_SAND: 300 GRAVEL: 300 DIRT: 300 GRASS: 300 PUMPKIN: 300 MELON_SLICE: 300 KELP: 300 BAMBOO: 300 SUGAR_CANE: 300 TWISTING_VINES: 300 WEEPING_VINES: 300 OAK_LEAVES: 300 SPRUCE_LEAVES: 300 BIRCH_LEAVES: 300 JUNGLE_LEAVES: 300 ACACIA_LEAVES: 300 DARK_OAK_LEAVES: 300 CACTUS: 300 DIORITE: 300 GRANITE: 300 ANDESITE: 300 SCAFFOLDING: 600

このリストでは、特定の落ちているアイテムのデスポーンにかかる時間(tick)を、デフォルトよりも速くまたは遅く設定できます。このオプションは、アイテム消去系のプラグインの代わりにmerge-radiusと一緒に使用すると、パフォーマンスが向上します。

use-faster-eigencraft-redstone

値: true

これを有効にすると、レッドストーンが冗長なブロック更新を減らす、より高速な代替バージョンに置き換えられ、サーバーの作業量が減少します。これを有効にすると、ゲームプレイの不整合を引き起こすことなく、パフォーマンスを大幅に向上させることができます。これを有効にすると、craftbukkitからのいくつかのレッドストーンの不整合も修正されます。

disable-move-event

値: false

InventoryMoveItemEventは、そのイベントをアクティブにリッスンしているプラグインがない限り、発火しません。つまり、そのようなプラグインがあり、そのプラグインがこのイベントに対応できなくても気にしない場合にのみ、これをtrueに設定する必要があります。保護プラグインなど、このイベントをリッスンするプラグインを使用したい場合は、trueに設定しないでください。

mob-spawner-tick-rate

値: 2

このオプションでは、スポナーがtickされる頻度を設定できます。高い値を設定すると、多くのスポナーがある場合にラグが少なくなりますが、(スポナーの遅延と比較して)高すぎる値を設定すると、Mobのスポーン率が低下します。

optimize-explosions

値: true

これをtrueに設定すると、バニラの爆発アルゴリズムがより高速なものに置き換えられますが、爆発ダメージを計算する際に若干の不正確さが生じます。これは通常は目立ちません。

enable-treasure-maps

値: false

宝の地図を生成するのは非常にコストがかかり、探し出そうとする構造物が事前に生成されたワールドの外にある場合、サーバーがハングアップする可能性があります。事前にワールドを生成し、バニラのワールドボーダーを設定している場合にのみ、この機能を有効にすることができます。

treasure-maps-return-already-discovered

値: true

このオプションのデフォルト値は、新しく生成されたマップに未探索の構造物を探させるもので、通常は事前に生成された地形の外にあります。このオプションを rueに設定すると、マップは以前に発見された構造物につながるようになります。このオプションをtrueに変更しないと、新しい宝の地図を生成するときにサーバーがハングアップしたり、クラッシュしたりすることがあります。

grass-spread-tick-rate

値: 4

サーバーが草や菌糸を広げようとするまでの時間(tick)です。これにより、広い範囲の土が草や菌糸に変わるまでに少し時間がかかるようになります。拡散率の低下を目立たせずに減らしたい場合は、4程度に設定するとうまくいきます。

container-update-tick-rate

値: 1

コンテナの更新間隔をtickで表した時間。これを増やす事でコンテナの更新で問題が発生した場合には助けになるかもしれませんが(滅多にありません)、プレイヤーがインベントリを操作したときにデシンクが発生しやすくなります。

non-player-arrow-despawn-rate

値: 20

Mobが放った矢が何かに当たった後に消えるまでの時間をtickで指定します。プレイヤーは矢を拾うことができないので、20(1秒)のように設定するとよいでしょう。

creative-arrow-despawn-rate

値: 20

クリエイティブモードでプレイヤーが放った矢が何かに当たった後に消えるまでの時間をtickで指定します。プレイヤーは矢を拾うことができないので、20(1秒)のように設定するとよいでしょう。

Purpur.yml

disable-treasure-searching

値: true

イルカが宝の地図のような構造検索をするのを防ぎます。

teleport-if-outside-border

値: true

プレイヤーがワールドボーダーの外にいた場合、ワールドスポーンにテレポートできるようにします。バニラのワールド・ボーダーは迂回可能で、プレイヤーに与えるダメージを軽減することができるので便利です。

ヘルパー

ani-xray

値: true

これを有効にすると、X-rayから鉱石を隠すことができます。この機能の詳細な設定については、Stonar96の推奨設定を参照してください。この機能を有効にすると、実際にはパフォーマンスが低下しますが、他のX線対策プラグインよりもはるかに効率的です。ほとんどの場合、パフォーマンスへの影響はごくわずかです。

remove-corrupt-tile-entities

値: true

タイルの実体に関するエラーがコンソールに押し寄せている場合、これをtrueに変更します。これにより、エラーの原因となっているタイルの実体が無視されずに削除されます。タイルエンティティに関する警告が頻繁に出る場合は、なぜ壊れているのかを調査してください。これは根本的な問題を解決するものではありません。

nether-ceiling-void-damage-height

値: 127

このオプションが0より大きい場合、設定されたyレベル以上のプレイヤーは、あたかも奈落にいるかのようなダメージを受けます。これによりプレイヤーはネザーの屋根を使えなくなります。バニラのネザーの高さは128ブロックなので、127に設定した方がいいでしょう。何らかの方法でネザーの高さを変更した場合は、[ネザーの高さ] - 1に設定してください。

Java スタートアップフラグ

バージョン1.17のバニラMinecraftとMinecraftサーバーソフトウェアは、Java 16以上が必要です。Oracleはライセンスを変更しており、もはやOracleからJavaを入手する説得力のある理由はありません。推奨されるベンダーはAmazon CorrettoAdoptiumです。OpenJ9やGraalVMなどの代替JVMも動作しますが、これらはPaper媒体ではサポートされておらず、問題が発生することが知られているため、現在は推奨されていません。

ガベージコレクタは、大きなガベージコレクタタスクによって引き起こされるラグスパイクを減らすように設定することができます。Minecraft サーバー用に最適化されたスタートアップフラグはSOGで見つけることができます。この推奨事項は他のjvmでは機能しないことに注意してください。

Linux CPU スケーリング

ホストによっては、「PowerSave」モードで動作するマシンを使用している場合があります。この場合、クロック速度が25%近く低下し、シングルスレッドのパフォーマンスが大幅に低下します。これは、CPUスケーリングをパフォーマンスモードに設定するよりも、はるかに悪いパフォーマンスにつながる可能性があります。VPSでは利用できない場合がありますのでご注意ください。

Debian / Ubuntuの場合

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor CPUのパフォーマンスプロファイルを表示します。

echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governorプロファイルを performance に設定します。

"Too good to be true "なプラグイン

地面に落ちてるアイテムを消すプラグイン

merge radiusやalt-item-despawn-rateで代用できますし、正直、基本的なサーバー設定よりも設定範囲が狭いので、絶対に不要です。アイテムを削除しないよりも、アイテムをスキャンして削除する方がリソースを消費する傾向があります。

モブスタッカープラグイン

使うことを正当化するのはとても難しいです。自然に発生したエンティティをスタックすると、サーバーが常により多くのmobを発生させようとするため、スタックしない場合よりもラグが発生します。唯一の「許容できる」使用例は、大量のスポナーがあるサーバーのスポナー用です。

プラグインによる他のプラグインの有効化/無効化

実行時にプラグインを有効にしたり無効にしたりするものは非常に危険です。そのようなプラグインを読み込むと、トラッキングデータに関する致命的なエラーが発生する可能性があり、プラグインを無効にすると、依存関係がなくなることによるエラーが発生する可能性があります。/reloadコマンドにも全く同じ問題があります。

何が遅れているのか?- 性能測定

mspt

Paperには/msptコマンドがあり、サーバーが最近のtickを計算するのにかかった時間を知ることができます。最初の値と2番目の値が50より小さければ、おめでとうございます。あなたのサーバーは遅れていません。3つ目の値が50を超えていれば、少なくとも1回は時間のかかったtickがあったことを意味します。これは全く普通のことで、時々起こることですので、慌てないでください。

timings

サーバーが遅延しているときに何が起こっているかを確認するには、Timingsが最適です。timingsは、どのタスクに最も時間がかかっているかを正確に把握するためのツールです。これは最も基本的なトラブルシューティングツールであり、ラグに関してヘルプを求めたら、ほとんどの場合にtimingsを求められるでしょう。

サーバーのtimingsを取得するには、/timings pasteコマンドを実行し、表示されたリンクをクリックするだけです。このリンクを他の人と共有すれば、助けてもらうことができます。また、何をしているのかわからないと、誤読してしまいがちです。読み方については、Aikar氏による詳細なビデオチュートリアルがあります。

Spark

Sparkは、サーバーのCPUやメモリの使用状況をプロファイリングすることができるプラグインです。使い方はwikiに載っています。また、ラグスパイクの原因を見つける方法については、こちらのガイドがあります。

2021年05月~2021年09月の変更点

snake
管理者

色々変更したり試行錯誤していたので、変更点を簡単にまとめます。

変更点にはかなり漏れがあります。

サイトデザイン

多分3回ぐらい大幅に変わりました。下記のデザインで一応落ち着いていますが、変わる可能性はあります。

変更の理由ですが、単純に見づらかったり日本語だと表示が分かりづらいなんてことがあったりしたためです。また、ウェブサイト上から他の記事への遷移することが非常に稀であるために、記事の中身がわかりやすく、読みやすいようなデザインに変更されています。

また、右上でダークテーマとライトテーマの入れ替えが可能になっています。活用してください。FirefoxのアドオンであるDark Readerを有効にした状態でも正常な見た目であることを確認しています。

タグを整理しました

タグが分かりづらいというか、ぐちゃぐちゃしそうだったので、一旦整理しました。今後細分化するとかする可能性はありますが、今のところはシンプルなタグ分けにしようかと思います。

タグ:

  • ブログ
  • ゲーム
  • 忘備録
  • pr

prタグについて

企業や団体などからの依頼に基づいて執筆された投稿類につけられています。可能な限り中立であることを目指しているものの、執筆に当たり金銭を含む何らかのやり取りが発生している場合があるのも事実です。そこを明確にするために、タグを付けています。

GitHubから自動デプロイ高速化

シンプルです。遅かったので早くなりました。

GitHubで新たなorganizationを作成

個人のリポジトリとして管理し続けてもいいのですが、分かりづらかったので組織として分離しました。様々なものが突っ込まれます。基本的にはサービスに関わるソースコードなどです。

viasnake.com

Discordサーバーの統合

直接的に関係はありませんが、Gravittoの解散の処理に伴い、GravittoのDiscordグループとMCPlayNetworkのDiscordグループの統合を進めています。

MCPlayNetworkの運営はviasnake個人であることになっていますが、個人だと管理が複雑化しそうなので、個人的なプロジェクトやら何やらは全て、MCPlayNetworkのDiscordグループに統合します。

MCPlayNetwork

自由に参加してください。

サイトメタの変更

Meta descriptionを変更しました。

新しいメタ: インターネットを彷徨っている蛇が、気になったことを色々書いたりしている自由気ままなブログ

embed系も全てこれに変更されています。

不要JavaScriptの削除

無駄に読み込んでいたJavaScriptがあったので削除しました。

より正確には必要ですが、全てのページで読み込む必要がなかったので、削除しました。今後必要なページのみで読み込むようにします。

投稿の画像

サムネイル画像のロード時間短縮を試みましたが、ストレージの容量との兼ね合いでこれまで通りunsplash.comから引っ張ってきてcropするようにします。一部投稿では、サーバーに保存された画像を読み込んでいますが、将来的にサーバーからは削除され、unsplash.comに置き換えます。

投稿内で使用している画像については、これまで通りサーバーに保存されています。しかしながら、こちらについても将来的にクラウドサーバーへ保存するように変更する予定です。

AlwaysFreeのGCEでCPUバーストによって請求が来た

snake
管理者

個人的に色々使う目的でGCPのGCEのインスタンスを一つ持っているのですが、f1-microでAlways Freeの範疇に収めているつもりが、今月に突然422円請求が来ました。

費用の内訳から、この422円の出どころを調べてみたら、どうやら「Micro Instance with burstable CPU running in Americas」が請求を発生させていました。この請求額は継続利用割引が適用された額であり、割引適用前は595円でした。

f1-micro程度のスペックで、この額の請求が毎月来たら非常にまずいという事で、「Micro Instance with burstable CPU running」が何者かについて軽く調べました。

GCEの共有コア マシンタイプには、バースト機能と呼ばれるものが存在しており、この機能を使用することでインスタンスが追加の物理CPUを短時間使用可能になります。この機能は追加料金なしで利用可能とはなっているのですが、f1-micro、g1-small、e2 shared-coreについては、追加料金が課せられる事となっています。課せられる追加料金については、下記のURLを確認してください。

VM instances pricing | Compute Engine: Virtual Machines (VMs)

問題はどのタイミングでこの機能を使っているのかということですが、バースト機能は任意で使用するものではなく、インスタンスが割り当てよりも多くの物理CPUを必要とした場合に、自動的に使用される物となっています。つまり非常に重い処理をしたら勝手に課金して処理をすぐに終わらせるようにするということです。

基本的にはバースト機能は一時的な利用を想定したものであり、常時バースト機能が動いている状況だと、マシンをアップグレードしたほうが安くなります。

バースト機能を無効化する方法についても、一応調べてみたのですが、少なくともGCP側からそのようなオプションは提供されていませんでした。CPUの利用率制限などをかけることで、バースト機能が発動前に止めることはできるとは思いますが、そこまで手間をかけたいとは個人的に思いません。


請求された422円ですが、一体どのタイミングでそんなに処理をしたのか心当たりがありません。というか、そもそも執筆時点で一ヶ月あたり$3.88になっています。今の米ドル/円で431.57円なので、ほぼ一ヶ月間CPUバーストつけっぱなしでぶん回していたことになります。全く心当たりが無いというか、ウェブパネル動かしていただけなので、そんなに処理が続くとも思えない。今回請求が来てしまったものはしょうがないとしても、早期に何らかの対策をしないとまずいですね。自宅にラズパイが余っているので、ラズパイに移行すればいいとは思うんですが、ARMでちゃんと動作してくれない問題があるので、なんとかしないと行けないですね...

obs-ndiインストール時に「unmet dependencies」が出る場合の対処法

snake
管理者

obs-ndiの.debパッケージをインストール時に、下記のようなエラーが発生する場合があります。

Unable to install obs-ndi:

The following packages have unmet dependencies:

Package created with checkinstall 1.6.2

この問題は、obs-ndiとobs-studioを削除し、PPAバージョンのobs-studioをインストールすることで解消可能です。

PPAバージョンのインストール方法は、OBSProject.comのwikiで解説されています。

Wiki - Install Instructions | OBS

以下は、Ubuntu/Mintへのインストール手順の適当な翻訳です。責任は負いません。

OBS StudioはChrome OS上では完全には動作せず、スクリーンキャプチャやウィンドウキャプチャなどの機能は動作しませんのでご注意ください。

フルスクリーンプロジェクターなど、OBSの特定機能で潜在的なパフォーマンス問題を回避するために、xserver-xorgバージョン1.18.4以降が推奨されます。

FFmpegが必要です。FFmpeg がインストールされていない場合(確信が持てない場合は、おそらく持っていないでしょう)、以下のコマンドで取得できます:

sudo apt install ffmpeg

仮想カメラをサポートするには、v4l2loopback-dkmsをインストールする必要があります。以下のコマンドでインストールできます:

sudo apt install v4l2loopback-dkms

Ubuntuソフトウェアセンターでmultiverseのリポジトリを有効にしたことを確認してください(注意:Ubuntuの新バージョンでは、リポジトリを追加すると自動的にaptアップデートが行われます)。その後、以下のコマンドでOBSをインストールします。

sudo add-apt-repository ppa:obsproject/obs-studio sudo apt update sudo apt install obs-studio

無料のパーティション管理ソフトウェア「MiniTool Partition Wizard」

snake
管理者

本投稿は、依頼に基づいて執筆を行っています。

MiniTool Software Ltd.(以下、MiniToolとします)という会社が開発・販売しているパーティション管理ソフトウェア「MiniTool Partition Wizard」の無料版について使ってみた感想です。

MiniTool Software Ltd.とは

北米のカナダとアジアの香港に拠点を構えるソフトウェア開発会社です。MiniTool Partition Wizard、MiniTool Power Data Recovery、MiniTool ShadowMaker、MiniTool MovieMakerといったソフトウェアを開発しています。

MiniToolソフトウェアソリューションについて

ちなみにマイクロソフトパートナーらしいです。

https://www.microsoft.com/en-us/solution-providers/partnerdetails/minitool-ltd_b81dcda7-eb09-475f-a95b-87853bf6336d/93fe3baf-1ed4-4cd1-8bda-1263ee71afbe

MiniTool Partition Wizardとは

MiniTool Software Ltd.社が開発・販売を行うパーティション管理ソフトウェアです。MiniTool Partition Wizardは、パーティションの操作(作成/削除/拡張/サイズ変更/結合/分割)がGUIから行えます。

エディションの比較

MiniTool Partition Wizardにはエディションが複数存在します。エディションの比較について下記にまとめます。この投稿では、無料版についてのみを扱っています。

本当はちゃんと全てを説明するのが良いのでしょうが、エディション数が結構あるので、簡単な説明に留めておきます。

エディションは、下記の8種類存在しています。

  • 無料版
  • プロ版
  • プロ・デラックス版
  • プロ・プラチナ版
  • プロ・アルティメット版
  • サーバー版
  • エンタープライズ版
  • テクニシャン版

下のエディションへ行くほどできることが増えていきます。

無料版

無料版は、名前の通り無料で利用できるエディションです。この投稿ではこのエディションについて扱います。

Windows PC(XP/Vista/7/8/10 全エンディション)で利用可能です。

下記は無料版で使える機能です。

  • ディスクベンチマーク
  • ディスク使用状況分析
  • パーティション作成/削除/フォーマット/移動/サイズ変更/拡張/結合/分割/
  • FATをNTFSに変換
  • パーティションをプライマリに設定
  • パーティションを論理に設定
  • 非OSパーティション・コピー
  • パーティション・アライメント
  • パーティション抹消
  • アクティブ/非アクティブに設定
  • ラベル付け
  • ドライブ文字変更
  • パーティション表示/非表示
  • ファイルシステム・チェック
  • サーフェステスト
  • ディスク・プロパティ
  • データディスクをMBR/GPTに変換
  • 非OSディスク・コピー
  • ディスク抹消
  • すべてのパーティションを削除
  • すべてのパーティションをアライメント
  • MBR再構築
  • 紛失/削除したパーティションをスキャン

プロ版

プロ版は、5,980円(税込6,578円)で利用できるエディションです。このエディションは1年間の無料アップグレードが可能です。また、プロ版以降はビジネス環境での仕様が可能となります。

ライセンスが、1ライセンスで1PCとなっています。

Windows PC(XP/Vista/7/8/10 全エンディション)で利用可能です。

無料版と比較して、下記の機能が使えるようになっています。

  • クラスタサイズの変更
  • NTFSをFATに変換
  • システムパーティション・コピー
  • パーティションType IDの変更
  • シリアル番号変更
  • OSディスクをMBR/GPTに変換
  • システムディスク・コピー
  • OSをSSD/HDDに移行
  • ボリューム作成/削除/フォーマット/コピー/移動/サイズ変更/抹消
  • ボリューム・プロパティ
  • ボリュームラベル変更
  • ボリュームクラスタサイズ変更
  • ダイナミックディスクをベーシックに変換
  • Win-PE環境のブータブルメディア作成機能

プロ・デラックス版

プロ・デラックス版は、11,200円(税込12,320円)で利用できるエディションです。このエディションは1年間の無料アップグレードが可能です。

ライセンスは、1ライセンスで1PCです。

Windows PC(XP/Vista/7/8/10 全エンディション)で利用可能です。

プロ版と比較して、以下の機能が使えるようになっています。

  • データ復元
  • 紛失/削除したパーティションを復元

プロ・プラチナ版

プロ・プラチナ版は、元値の13,699円から割引で11,470円(税込12,617円)で利用できるエディションです。このエディションは1年間の無料アップグレードが可能です。

ライセンスは、1ライセンスで3PCです。

Windows PC(XP/Vista/7/8/10 全エンディション)で利用可能です。

できることは、プロ・デラックス版と差はありません。

プロ・アルティメット版

プロ・プラチナ版は、元値の22,980円から割引で18,530円(税込20,383円)で利用できるエディションです。このエディションは永久に無料のアップグレードが可能です。

ライセンスは、1ライセンスで5PCです。

Windows PC(XP/Vista/7/8/10 全エンディション)で利用可能です。

できることは、プロ・デラックス版及びプロ・プラチナ版と差はありません。

サーバー版

サーバー版は、26,980円(税込29,678円)で利用できるエディションです。このエディションは永久に無料のアップグレードが可能です。

ライセンスは、1ライセンスで1PC/Serverです。

Windows PC(XP/Vista/7/8/10 全エンディション)の他に、Windows Server(2003/2008/2012/2016/2019 全エンディション)で利用可能です。

その他は、プロアルティメット版と差はありません。

エンタープライズ版

エンタープライズ版は、51,880円(税込57,068円)で利用できるエディションです。このエディションは、1年間の無料アップグレードが可能です。

ライセンスは、1ライセンスで99PC/Serverです。

Windows PC(XP/Vista/7/8/10 全エンディション)の他に、Windows Server(2003/2008/2012/2016/2019 全エンディション)で利用可能です。

その他は、サーバー版と差はありません。

テクニシャン版

テクニシャン版は、72,800円(税込80,080円)で利用できるエディションです。このエディションは、このエディションは永久に無料のアップグレードが可能です。

ライセンスは、1ライセンスで299PC/Serverです。なお、このエディションのみ、使用社数が無制限です。

Windows PC(XP/Vista/7/8/10 全エンディション)の他に、Windows Server(2003/2008/2012/2016/2019 全エンディション)で利用可能です。

その他は、エンタープライズ版と差はありません。

各エディションについては、公式ウェブサイトで詳細に説明されていますので、そちらをご確認ください。

ソフトウェア比較|MiniTool Partition Wizardエディション比較

パーティション分割

パーティション管理ソフトウェアを使う人は、それぞれが色々な目的と持っているかと思いますが、何かとパーティションの分割をする人が一番多いんじゃないかと思っています。

ソフトウェアなくても一応できるんですが、結構面倒くさい。でもGUIのソフト使えば直感的に数クリックで簡単にやってくれるんですね。

実際にMiniTool Partition Wizardでパーティション分割やってみます。

シンプルで見やすい画面ですね。今回はDドライブを分割するので、選択した上で左のパーティション分割を選択してみましょう。

そうするとこんなウィンドウが出てきます。ここで分割するときのパーティションサイズを選択します。数値入力にも対応していますが、クリックしながらバーを左右に動かすことでも分割する位置を決定できます。直感的ですね。正直パーティション管理ソフトなんか使ってこなかったんですが、こう簡単に操作できるのはかなり魅力的ですね。

ちなみにこれをソフト無しでやろうとすると、結構面倒です。WindowsであればGUI操作もできますが、一旦縮小した上で、新規パーティション作成という操作をそれぞれやる必要があります。コマンドなら更に面倒です。クリックで簡単に分割することも不可能です。

では今回は、画像の通り、725.64GBと205.87GBに分割してみます。

そうすると最初の画面に戻されますが、この段階では変更が適用されていません。プレビュー画面です。実際に適用されるのは左下の適用ボタンをクリックしてからです。

今回はこれで問題なさそうなので、適用を押します。もしもやり直したい場合、取り消すを押してください。変更がなかったことになります。

適用を押すとこんな感じで作業が始まります。終われば、分割が完了しています。

簡単ですね。難しいこと分からんって人でも、操作に従えば簡単にできる。これはGUIソフトウェアの良いところです。

今回分割しかしていませんが、結合、新規作成であっても、似たような手順を説明どおりに進んでいけば、終わります。

ファイルシステムのチェック

一連の機能を試している際に、エラーが発生することがありました。

エラーは多数あるとは思いますが私の場合、エラー内でファイルシステムチェックしてエラーを修正する旨のメッセージが表示されたので、実際にやってみようと思います。

やり方は、非常に簡単、対象のディスクを選択して、左メニューからファイルシステムチェックを選ぶ。

クリック後、出現したウィンドウに「チェックのみ(修正しない)」と「チェックして検出したエラーを修正する」の2つのオプションが表示されるので、後者の「チェックして検出したエラーを修正する」を選択して、開始をクリック。

修正をいきなりするのが不安な場合は、チェックのみで一度開始すると、エラー内容を確認できます。

開始後、放置しておくだけでエラー修正が行われます。1TBのHDDで50秒程度でした。早かったです。

一応中身で何しているのかなって思ったら、普通にWindows標準のディスクエラー修正するコマンドとかを使っているだけでした。でもこれ以外と面倒なんですよね。知ってれば簡単ですけど、コマンドプロンプトなんて見たこともない、難しそうって人にとっては、GUIでワンクリックでやってくれたほうが気が楽でしょう。

パーティションの抹消

この機能を試す気はなかったのですが、手元のHDDをゼロフィルする必要があったので一応スクリーンショットを貼っておきます。

パーティションの抹消でセクタを0で埋めています。わからない人向けの説明を入れておくならば、全データを完全に削除し、まっさらな状態にしています。

HDDはWesernDigitalのWD2500AAKX、容量は250GBです。普通にSATAでつないでいます。

何ら問題なくゼロフィルが完了しました。時間も特別かかることはありませんでした。

「MiniTool Partition Wizard」の無料版は使えるのか

個人的な使用感としては、無料の他のパーティション管理ソフトウェアと比較しても、十分使えるソフトウェアです。十分どころか、快適でした。無料ソフトウェアは、探せばいくつかすぐに出てきます。パーティション管理ソフトウェアであっても例外ではありません。しかしながら、無料であってもフリーミアム系のソフトウェアである場合、広告だったり、機能制限が激しいものが多いです。MiniTool Partition Wizardは、機能制限はあるもののパーティション管理機能については、ちょっと使う分には困らない程度の機能制限であり、広告も有りません。動作についてストレスも感じませんでした。

この記事で取り上げた機能以外にも、無料で使える機能はまだあるので、もしパーティション管理ソフトウェアを探している場合は、一度使ってみてもいいと思います。

MiniTool Partition Wizard公式ウェブサイト

一番信頼できるディスクやパーティション管理製品|MiniTool

作りたいものが無くなったら、学ぶ意欲も無くなった

snake
管理者

私は何かやりたいことだったり、作りたいものがあって学ぶことの多かったタイプの人間です。多分。

例を挙げるとするならば、プログラミングです。基本独学でネットで検索してやってきました。今もそのスタイルで特に変わっていません。しかし、このスタイル何か目的があって続けてられたのですが、最近目的がなくなりつつあります。そう思ったらやる気が本当に無くなりました。何かを作るために時間を投下し続けられなくなりました。

何か新しいプログラミング言語を使ってみたいというキモチはあります。何か新しいものを作りたいというキモチもあります。ただ具体的に何のプログラミング言語を使いたくて、何を作りたいのかが何も浮かばない。そうなると目的を持てなくて学ぶこともできなくなりました。

最近の話ですが、個人的な趣味の範囲のゲームを作ってました。ちょっと前に何人かで作るという話になったのでゲームを作ったのですが、明確に目的を持って楽しくできました。しかし、最近この記憶を頼りにゲームを作ろうとしました。ゲームエンジンについて知るのは楽しいですが、そこから生み出すものが無い(目的がない)ので行き詰まりました。改めてゲームをコンセプトを持って作れる人って凄いんだなと思いました。私はそもそもコンセプトを考える段階で躓きました。良いコンセプトが無いとかではなく、コンセプトを考えられないって相当問題ありますね。辛いです。

話を戻しますが、作りたいものが無くなったら、学ぶ意欲も減りました。作りたいものがないので結果として、作るために知識を得るという過程をやる気力が得られなくなりました。これが2、3回程度であれば、気持ちの問題なのでしょうが、流石に何度もこれが続くと心が折れます。もう一度やろうとすれば同じような壁にぶち当たるという考えになって、作り気も起きません。

当分は何も作らず、素直にゲームを沢山遊ぼうかなと思います。

コンテンツを作る人間が、コンテンツを消費せずに何かを作り出すことはできないんでしょうね。

KanboardのDocker-compose.yml

snake
管理者

OSS「Kanboard」をDockerで利用する場合のdocker-compose.yml例

Kanban Project Management Software - Kanboard

データベースに、外部のデータベースを利用することを想定

version: '2' services: kanboard: image: kanboard/kanboard:latest ports:

  • "80:80"
  • "443:443" environment: DATABASE_URL: [DB_DRIVER]://[DB_USER]:[DB_PASSWORD]@[DB_ADDRESS]:[DB_PORT]/[DB_DATABASE] volumes:
  • kanboard_data:/var/www/app/data
  • kanboard_plugins:/var/www/app/plugins
  • kanboard_ssl:/etc/nginx/ssl volumes: kanboard_data: kanboard_plugins: kanboard_ssl:

DATABASE_URL

DB_DRIVER: 利用するデータベース、デフォルトではSQLiteを利用。次から選択: postgres, mysql, sqlite

DB_USER: データベースのユーザー名

DB_PASSWORD: データベースのパスワード

DB_ADDRESS: データベースのアドレス

DB_PORT: データベースのポート

DB_DATABASE: データベースのデータベース名


environmentを記述しない場合、sqliteを使用します。ボリューム「kanboard_data」にデータを保存。

NDIを使用した2PC配信環境の構築

snake
管理者

不定期でゲームや雑談などの配信を行っているのですが、近年ゲームの要求スペックが向上し、配信のFPSが安定しない事が増えてきました。これまではチューニングすることで誤魔化していましたが、最近では限界を感じ始めた為、パソコン周りの環境整理を兼ねて、配信環境の大幅な更新を行いました。

目標

新たな配信環境を作るにあたっての一番の目標は、配信の安定化及びゲームの動作安定化です。

  • 配信の安定化とは、FPSや映像の乱れなどを起こさずに映像を配信すること
  • ゲームの動作安定化とは、ゲームをプレイする際にFPSなどの低下が発生せず、プレイヤーである自分がストレス無く遊べること

これら2つの達成を目標とします。

1PCから2PCへ

前述した2つの目標を達成する為に、どうすれば良いのかを考えました。単にGPUを新しいものへと買い替えてCPUを新しくすれば終わる話ですが、それができるほど金銭的余裕はありません。今ある環境で最適かつ最高のものを考える必要があります。

それで導き出された結論は、「1PCから2PCへ環境を変更する」です。

前提知識として1PCと2PCの説明が必要かと思いますので、下記にまとめます。

1PCとは

1PCは1台のパソコンで配信を全て行う事を指します。これは多くの配信者にとってのスタンダードです。1台のパソコンにゲーム、エンコード、配信などの環境をやることができます。

1PCのメリットは、1台のパソコンで全てが完結する為、余計なことを考える必要がなく、1台の強いパソコンがあればいいという点です。

2PCとは

2PCは2台のパソコンで配信を分業して行うことを指します。有名な配信者・ストリーマーはこれでやっていることがあります。1台で配信に写すゲームなどをやりながら、もう1台は配信のエンコードのみを行うというやり方です。

2PCのメリットは、配信を別のPCに任せるので、配信が安定する点です。配信がゲームであれば、ゲームにGPUの処理を全振りできる利点もあります。

2PCの構成

2PC構成にするにあたって一番重要な点が、どうやって映像と音声をやり取りするかです。

今回は、Network Device Interface(以下、NDIとします)と呼ばれる技術を選択しました。NDIとは、NewTek社が開発したIPを利用した低遅延かつ高品質な映像伝送技術です。細かい技術的な説明は、難しいので省きます。詳細は自分で調べてください。

今回、NDIを使うにあたって必要なものですが、安定した高速なネットワークさえあれば大丈夫です。NDI自体は、回線が安定していないくても使えなくはないものですが、配信の安定化を目標としているのでネットワークが安定して高速である必要があります。

2PCのスペックもここで記しておきます。

PC1(ゲームPC)

OS - Windows 10

CPU - Ryzen 5 2600X

GPU - Nvidia GeForce GTX 1050 Ti

メモリ - 32GB

PC2(配信PC)

OS - Linux Mint

CPU - Intel Core i7-6700HQ @ 2.60GHz

GPU - Intel HD Graphics 530 / Nvidia GeForce GTX 950M

メモリ- 8GB

配信ソフトウェア - OBS Studio

NDIをOBSで使う

NDIを使うのは良いけど、どうやって使うのさ。っていう問題があるわけですが、簡単に使う方法があります。OBSプラグインの「obs-ndi」を使用します。これはOBSを2つ使い、片方のOBSの映像・音声をもう片方のOBSへNDIを使って送信するものです。

OBSにプラグインを導入する

前提としてOBSはインストールされている状態です。されていない場合は、インストールしておいてください。

プラグインをGitHubからダウンロードしてください。

Releases · Palakis/obs-ndi

自分と対応するOSのファイルをダウンロードしてインストールしてください。

Windowsの場合は、Windows-Installer.exeを使えば全てやってくれるので、終わります。

私の環境はLinux Mintなので、debをダウンロードします。Debian系の場合、libndiもインストールが必要なので、libndi4_4.5.1-1_amd64.debとobs-ndi_4.9.1-1_amd64.debの2つをインストールします。

obs-ndiの設定

obs-ndiの設定は、送信側・受信側の両方で行う必要があります。

送信側

obsを起動して、ツール -> NDI Output settings を開く。

Main Outputのチェックマークを入れて、Main Output nameを何か設定する。お好きな名前を設定すればいいですが、パソコンを識別できる名前をおすすめします。

受信側

シーンにNDI Sourceを追加する。

Source nameで送信側で設定した名前を選択する。

Bandwidthは、Highestを選択してください。回線が細くて安定しない場合は、Lowestを選択してください。音声だけで良ければ、Audio onlyで構いません。

その他は、都度設定を変更してください。

映像と音声を送信する

実際に映像を送信してみます。

送信側PCのOBSでキャプチャするウィンドウやゲームなどをシーンに追加してみてください。

送信側PCでOBSにシーンを追加するだけで、受信側PCに映像が届いていることが確認できます。

配信をする場合、受信側PCで配信を開始すれば大丈夫です。

目標は達成した

NDIを活用した2PC構成で配信をしてみて、相当快適でした。近年のゲームの要求スペックはすごい勢いで上がっています。少しでも良い画質、良いFPSでプレイするにはGTX 1050Tiは貧弱なので、2PCを選択したのは良かったです。

配信PCは、GeForce GTX 950Mですが、1080p 60fpsで配信が余裕でいけます。相当異常な負荷がかかる状況になったりしなければ、当分はこれで配信楽しくやっていけそうです。

ちなみにNDIですが、結構色々できます。スマホのカメラ映像をNDIで送信してOBSに取り込んだりもできるので、使い方次第ではもっと色々なことができそうです。LANケーブルさえあれば、導入できるのは相当強みですね。

「エンジニア・プログラマにしか使えないSNS」を見るphpプログラム

snake
管理者

Qiitaに投稿された「エンジニア・プログラマにしか使えないSNSを作ってみた話」のSNSを見るためのphpプログラムを作成しました。

品質は一切保証せず、責任も負いません。自己責任でプログラムを利用してください。

エンジニア・プログラマにしか使えないSNSを作ってみた話 - Qiita

気が向いたら、CSS適用させたり、ユーザー登録できるようになったり、つぶやけるようになったりします。Pull Requestは受け付けています。変更したい人がいれば、自由に送信してください。

色々やろうかなと思っていたんですが、SNSの趣旨からずれてしまいそうなので、見れる程度に留めておこうと思います。これ以上のプログラムは作らないです。

スクリーンショット

ソースコード

最新版はGitHubにおいてあります。

GitHub - ViaSnake/SNS-for-engineers: 「エンジニア・プログラマにしか使えないSNSを作ってみた話」のSNSを見るためのphpプログラム

<?php

if(isset($_GET['page']) && $_GET['page'] > 0) {
$page = $_GET['page'];
} else {
$page = 0;
}

function search($id = "all", $orderby = null, $limit = null, $skip = null) {
$api = 'https://versatileapi.herokuapp.com/api/text/' . $id;
if(!empty($orderby) && !parse_url($api, PHP_URL_QUERY)) {
$api .= '?$orderby=' . urlencode($orderby);
} elseif (!empty($orderby) && parse_url($api, PHP_URL_QUERY)) {
$api .= '&$orderby=' . urlencode($orderby);
}
if(!empty($limit) && !parse_url($api, PHP_URL_QUERY)) {
$api .= '?$limit=' . $limit;
} elseif (!empty($limit) && parse_url($api, PHP_URL_QUERY)) {
$api .= '&$limit=' . $limit;
}
if(!empty($skip) && !parse_url($api, PHP_URL_QUERY)) {
$api .= '?$skip=' . $skip;
} elseif (!empty($skip) && parse_url($api, PHP_URL_QUERY)) {
$api .= '&$skip=' . $skip;
}
$response = file_get_contents($api);
return json_decode($response, true);
}

?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf=8">
<title>SNS for engineers</title>
</head>
<body>
<h1>SNS for engineers</h1>
<p><a href="https://qiita.com/HawkClaws/items/599d7666f55e79ef7f56">エンジニア・プログラマにしか使えないSNSを作ってみた話</a></p>
<hr>

<?php

$data = search("all", "_updated_at desc", 10, $page * 10);

for($i=0; $i < count($data); $i++) {
echo "<p>";
echo date("Y/m/d H:i:s", strtotime($data[$i]["_created_at"]));
echo " ";
echo $data[$i]["_user_id"];
echo "</p>";
echo "<p>";
echo htmlspecialchars($data[$i]["text"], ENT_QUOTES, 'UTF-8');
echo "</p>";
echo "<hr>";
}

if($page > 0) {
echo "<a href=?page=".($page - 1).">前へ</a>";
} else {
echo "前へ";
}

if($page >= 0) {
echo "<a href=?page=".($page + 1).">次へ</a>";
} else {
echo "次へ";
}

?>

</body>
</html>