
After removing `!Send` resources, `GILRS` and `WINIT_WINDOWS` were not made public, which is a breaking change. This was brought up in a [comment on that PR](https://github.com/bevyengine/bevy/pull/18386#issuecomment-2954209010). This PR makes them public. Fixes #19540.
2.1 KiB
title | pull_requests | |||
---|---|---|---|---|
Replace `Gilrs`, `AccessKitAdapters`, and `WinitWindows` resources |
|
NonSend Resources Replaced
As an effort to remove !Send
resources in Bevy, we replaced the following resources:
Gilrs
- For wasm32 only, other platforms are unchanged - Replaced withbevy_gilrs::GILRS
WinitWindows
- Replaced withbevy_winit::WINIT_WINDOWS
AccessKitAdapters
- Replaced withbevy_winit::ACCESS_KIT_ADAPTERS
Each of these are now using thread_local
s to store the data and are temporary solutions to storing !Send
data. Even though thread_local
s are thread safe, they should not be accessed from other threads. If they are accessed from other threads, the data will be uninitialized in each non-main thread, which isn't very useful.
Here is an example of how the data can now be accessed. This example will use WINIT_WINDOWS
as an example, but the same technique can be applied to the others:
Immutable Access
use bevy_winit::WINIT_WINDOWS;
...
WINIT_WINDOWS.with_borrow(|winit_windows| {
// do things with `winit_windows`
});
Mutable Access
use bevy_winit::WINIT_WINDOWS;
...
WINIT_WINDOWS.with_borrow_mut(|winit_windows| {
// do things with `winit_windows`
});
If a borrow is attempted while the data is borrowed elsewhere, the method will panic.
NonSend Systems
Previously, the use of a !Send
resource in a system would force the system to execute on the main thread. Since !Send
resources are removed in Bevy, we needed to create a new way to prevent systems from running on non-main threads. To do this, you can now use bevy_ecs::system::NonSendMarker
as a system parameter:
use bevy_ecs::system::NonSendMarker;
fn my_system(
_non_send_marker: NonSendMarker,
) {
ACCESS_KIT_ADAPTERS.with_borrow_mut(|adapters| {
// do things with adapters
});
}
To prevent a panic, if any of the !Send
resource replacements mentioned in this document are used in a system, the system should always be marked as !Send
with bevy_ecs::system::NonSendMarker
.