This commit is contained in:
syuilo 2026-05-15 15:05:15 +09:00
commit e90a53a851
8 changed files with 82 additions and 43 deletions

View file

@ -3558,16 +3558,20 @@ _qr:
raw: "テキスト"
mfm: "MFM"
_room:
_miWorld:
separateRenderingThread: "描画を別スレッドに分離"
separateRenderingThread_description: "有効にするとパフォーマンスが向上します。不安定になる場合は無効すると改善する可能性があります。"
graphicsQuality: "グラフィックの品質"
frameRate: "フレームレート"
resolution: "解像度"
failedToInitialize: "初期化に失敗しました"
crushed_description: "バグ、またはデバイスのリソース不足の可能性が考えられます。"
antialiasing: "アンチエイリアス"
_miRoom:
snapToGrid: "グリッドにスナップ"
gridScale: "グリッドサイズ"
thereAreUnsavedChanges: "未保存の変更があります"
revertAllChangesConfirmation: "全ての変更を取り消し、部屋を最後に保存した状態まで戻しますか?"
graphicsQuality: "グラフィックの品質"
frameRate: "フレームレート"
resolution: "解像度"
yourDeviceNotSupported_title: "お使いのデバイスはMisskeyRoomをサポートしていません。"
yourDeviceNotSupported_description: "MisskeyRoomを動作させるには、WebGPUをサポートするデバイスが必要です。"
failedToInitialize: "初期化に失敗しました"
crushed_description: "バグ、またはデバイスのリソース不足の可能性が考えられます。"
antialiasing: "アンチエイリアス"

View file

@ -1 +1 @@
これらのサムネイルはdev buildでRoomのカタログダイアログを表示し家具を選択した状態でブラウザのコンソールで`takeScreenshot();`を叩くと生成・ダウンロードできます
これらのサムネイルはdev buildかつWorldのレンダリングを別スレッドにする設定を無効にした状態でRoomのカタログダイアログを表示し家具を選択した状態でブラウザのコンソールで`takeScreenshot();`を叩くと生成・ダウンロードできます

View file

@ -124,7 +124,7 @@ const previewEngineControllerOptions = computed<PreviewEngineControllerOptions>(
graphicsQuality: props.graphicsQuality,
fps: null,
resolution: 1,
workerMode: false,
workerMode: prefer.s['world.separateRenderingThread'],
}));
const controller = markRaw(new PreviewEngineController(previewEngineControllerOptions.value));
@ -141,7 +141,7 @@ onMounted(async () => {
console.error(err);
os.alert({
type: 'error',
title: i18n.ts._room.failedToInitialize,
title: i18n.ts._miWorld.failedToInitialize,
text: (err instanceof Error ? err.message : String(err)),
});
return;

View file

@ -33,7 +33,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<button :class="$style.topMenuButton" class="_button" @click="showOtherMenu"><i class="ti ti-dots"></i></button>
</div>
<div v-if="isModified" :class="$style.modified" class="_panel _shadow">
<span :class="$style.modifiedText">{{ i18n.ts._room.thereAreUnsavedChanges }}</span>
<span :class="$style.modifiedText">{{ i18n.ts._miRoom.thereAreUnsavedChanges }}</span>
<button class="_button" style="color: var(--MI_THEME-error)" @click="revert">戻す</button>
<button class="_button" style="color: var(--MI_THEME-accent)" @click="save">保存</button>
</div>
@ -185,7 +185,7 @@ const roomControllerOptions = computed<RoomControllerOptions>(() => ({
resolution: resolution.value,
antialias: antialias.value,
useVirtualJoystick,
workerMode: false,
workerMode: prefer.s['world.separateRenderingThread'],
}));
const controller = markRaw(new RoomController(props.room.def, roomControllerOptions.value));
@ -196,8 +196,8 @@ onMounted(async () => {
if (!await BABYLON.WebGPUEngine.IsSupportedAsync) {
os.alert({
type: 'warning',
title: i18n.ts._room.yourDeviceNotSupported_title,
text: i18n.ts._room.yourDeviceNotSupported_description,
title: i18n.ts._miRoom.yourDeviceNotSupported_title,
text: i18n.ts._miRoom.yourDeviceNotSupported_description,
});
return;
}
@ -208,7 +208,7 @@ onMounted(async () => {
console.error(err);
os.alert({
type: 'error',
title: i18n.ts._room.failedToInitialize,
title: i18n.ts._miWorld.failedToInitialize,
text: (err instanceof Error ? err.message : String(err)),
});
return;
@ -338,7 +338,7 @@ function toggleLight() {
function showSnappingMenu(ev: PointerEvent) {
os.popupMenu([{
type: 'switch',
text: i18n.ts._room.snapToGrid,
text: i18n.ts._miRoom.snapToGrid,
ref: computed({
get: () => controller.gridSnapping.value.enabled,
set: v => controller.setGridSnapping({ ...controller.gridSnapping.value, enabled: v }),
@ -423,7 +423,7 @@ async function revert() {
const { canceled } = await os.confirm({
type: 'warning',
title: i18n.ts.areYouSure,
text: i18n.ts._room.revertAllChangesConfirmation,
text: i18n.ts._miRoom.revertAllChangesConfirmation,
});
if (canceled) return;
@ -495,7 +495,7 @@ function impor() {
function showOtherMenu(ev: PointerEvent) {
os.popupMenu([{
type: 'radio',
text: i18n.ts._room.graphicsQuality,
text: i18n.ts._miWorld.graphicsQuality,
caption: graphicsQualityRaw.value == null ? i18n.ts.auto : graphicsQualityRaw.value === GRAPHICS_QUALITY.HIGH ? 'High' : graphicsQualityRaw.value === GRAPHICS_QUALITY.MEDIUM ? 'Medium' : 'Low',
options: [{
label: `${i18n.ts.auto} (${graphicsQualityAutoValue.value === GRAPHICS_QUALITY.HIGH ? 'High' : graphicsQualityAutoValue.value === GRAPHICS_QUALITY.MEDIUM ? 'Medium' : 'Low'})`,
@ -513,7 +513,7 @@ function showOtherMenu(ev: PointerEvent) {
ref: graphicsQualityRaw,
}, {
type: 'radio',
text: i18n.ts._room.frameRate,
text: i18n.ts._miWorld.frameRate,
caption: fpsRaw.value == null ? i18n.ts.auto : fpsRaw.value === 'max' ? 'Max' : `~${fpsRaw.value}fps`,
options: [{
label: `${i18n.ts.auto} (${fpsAutoValue.value}fps)`,
@ -534,7 +534,7 @@ function showOtherMenu(ev: PointerEvent) {
ref: fpsRaw,
}, {
type: 'radio',
text: i18n.ts._room.resolution,
text: i18n.ts._miWorld.resolution,
caption: resolutionRaw.value == null ? i18n.ts.auto : resolutionRaw.value + 'x',
options: [{
label: `${i18n.ts.auto} (${resolutionAutoValue.value}x)`,
@ -552,7 +552,7 @@ function showOtherMenu(ev: PointerEvent) {
ref: resolutionRaw,
}, {
type: 'switch',
text: i18n.ts._room.antialiasing,
text: i18n.ts._miWorld.antialiasing,
ref: antialias,
}, {
type: 'divider',

View file

@ -747,6 +747,26 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkFolder>
</SearchMarker>
<SearchMarker v-slot="slotProps" :keywords="['world', 'room']">
<MkFolder :defaultOpen="slotProps.isParentOfTarget">
<template #label><SearchLabel>World / Room</SearchLabel></template>
<template #icon><SearchIcon><i class="ti ti-buildings"></i></SearchIcon></template>
<div class="_gaps_m">
<div class="_gaps_s">
<SearchMarker :keywords="['rendering', 'thread']">
<MkPreferenceContainer k="world.separateRenderingThread">
<MkSwitch v-model="worldSeparateRenderingThread">
<template #label><SearchLabel>{{ i18n.ts._miWorld.separateRenderingThread }}</SearchLabel></template>
<template #caption>{{ i18n.ts._miWorld.separateRenderingThread_description }}</template>
</MkSwitch>
</MkPreferenceContainer>
</SearchMarker>
</div>
</div>
</MkFolder>
</SearchMarker>
<SearchMarker v-slot="slotProps" :keywords="['other']">
<MkFolder :defaultOpen="slotProps.isParentOfTarget">
<template #label><SearchLabel>{{ i18n.ts.other }}</SearchLabel></template>
@ -957,6 +977,7 @@ const useNativeUiForVideoAudioPlayer = prefer.model('useNativeUiForVideoAudioPla
const contextMenu = prefer.model('contextMenu');
const menuStyle = prefer.model('menuStyle');
const makeEveryTextElementsSelectable = prefer.model('makeEveryTextElementsSelectable');
const worldSeparateRenderingThread = prefer.model('world.separateRenderingThread');
const fontSize = ref(miLocalStorage.getItem('fontSize') as '1' | '2' | '3' | null);
const useSystemFont = ref(miLocalStorage.getItem('useSystemFont') != null);
@ -1016,6 +1037,7 @@ watch([
showAvailableReactionsFirstInNote,
animatedMfm,
advancedMfm,
worldSeparateRenderingThread,
], () => {
suggestReload();
});

View file

@ -545,6 +545,9 @@ export const PREF_DEF = definePreferences({
'world.antialias': {
default: true,
},
'world.separateRenderingThread': {
default: true,
},
'experimental.stackingRouterView': {
default: false,

View file

@ -82,7 +82,7 @@ export abstract class EngineControllerBase<T extends RoomEngineBase> {
os.alert({
type: 'error',
title: i18n.ts.somethingHappened,
text: i18n.ts._room.crushed_description,
text: i18n.ts._miWorld.crushed_description,
});
});
await babylonEngine.initAsync();

View file

@ -13278,7 +13278,41 @@ export interface Locale extends ILocale {
*/
"mfm": string;
};
"_room": {
"_miWorld": {
/**
*
*/
"separateRenderingThread": string;
/**
*
*/
"separateRenderingThread_description": string;
/**
*
*/
"graphicsQuality": string;
/**
*
*/
"frameRate": string;
/**
*
*/
"resolution": string;
/**
*
*/
"failedToInitialize": string;
/**
*
*/
"crushed_description": string;
/**
*
*/
"antialiasing": string;
};
"_miRoom": {
/**
*
*/
@ -13295,18 +13329,6 @@ export interface Locale extends ILocale {
*
*/
"revertAllChangesConfirmation": string;
/**
*
*/
"graphicsQuality": string;
/**
*
*/
"frameRate": string;
/**
*
*/
"resolution": string;
/**
* 使MisskeyRoomをサポートしていません
*/
@ -13315,17 +13337,5 @@ export interface Locale extends ILocale {
* MisskeyRoomを動作させるにはWebGPUをサポートするデバイスが必要です
*/
"yourDeviceNotSupported_description": string;
/**
*
*/
"failedToInitialize": string;
/**
*
*/
"crushed_description": string;
/**
*
*/
"antialiasing": string;
};
}