Skip to content

Commit 8f79dbe

Browse files
authored
Reduce reflect size (#22592)
# Objective After #22452 is merged, the binary size increased a lot (and also compile time). Try to decrease binary size again. ## Solution Change the methods from generic to non-generic. ## Testing compile `3d_shapes` example on macOS: * before #22452 : 94.5mb * at #22452 : 97.7mb * at #22452 + to dynamic (another attempt) : 94.9mb * at #22452 + dyn (**this PR**) : 94.5mb also tried to see what if we disable reflection based cmp/eq entirely (which makes tests fails): * disable reflection based cmp/eq entirely: 94.1mb
1 parent 8b25e04 commit 8f79dbe

File tree

3 files changed

+15
-25
lines changed

3 files changed

+15
-25
lines changed

crates/bevy_reflect/src/enums/helpers.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use core::{
99
};
1010

1111
/// Returns the `u64` hash of the given [enum](Enum).
12-
#[inline]
13-
pub fn enum_hash<TEnum: Enum>(value: &TEnum) -> Option<u64> {
12+
#[inline(never)]
13+
pub fn enum_hash(value: &dyn Enum) -> Option<u64> {
1414
let mut hasher = reflect_hasher();
1515
core::any::Any::type_id(value).hash(&mut hasher);
1616
value.variant_name().hash(&mut hasher);
@@ -29,8 +29,8 @@ pub fn enum_hash<TEnum: Enum>(value: &TEnum) -> Option<u64> {
2929
/// - For each field in `a`, `b` contains a field with the same name and
3030
/// [`PartialReflect::reflect_partial_eq`] returns `Some(true)` for the two field
3131
/// values.
32-
#[inline]
33-
pub fn enum_partial_eq<TEnum: Enum + ?Sized>(a: &TEnum, b: &dyn PartialReflect) -> Option<bool> {
32+
#[inline(never)]
33+
pub fn enum_partial_eq(a: &dyn Enum, b: &dyn PartialReflect) -> Option<bool> {
3434
// Both enums?
3535
let ReflectRef::Enum(b) = b.reflect_ref() else {
3636
return Some(false);
@@ -94,11 +94,8 @@ pub fn enum_partial_eq<TEnum: Enum + ?Sized>(a: &TEnum, b: &dyn PartialReflect)
9494
/// or an element comparison returns `None`).
9595
///
9696
/// The ordering is same with `derive` macro. First order by variant index, then by fields.
97-
#[inline]
98-
pub fn enum_partial_cmp<TEnum: Enum + ?Sized>(
99-
a: &TEnum,
100-
b: &dyn PartialReflect,
101-
) -> Option<::core::cmp::Ordering> {
97+
#[inline(never)]
98+
pub fn enum_partial_cmp(a: &dyn Enum, b: &dyn PartialReflect) -> Option<::core::cmp::Ordering> {
10299
// Both enums?
103100
let ReflectRef::Enum(b) = b.reflect_ref() else {
104101
return None;

crates/bevy_reflect/src/structs.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -516,8 +516,8 @@ impl<'a> IntoIterator for &'a DynamicStruct {
516516
/// values.
517517
///
518518
/// Returns [`None`] if the comparison couldn't even be performed.
519-
#[inline]
520-
pub fn struct_partial_eq<S: Struct + ?Sized>(a: &S, b: &dyn PartialReflect) -> Option<bool> {
519+
#[inline(never)]
520+
pub fn struct_partial_eq(a: &dyn Struct, b: &dyn PartialReflect) -> Option<bool> {
521521
let ReflectRef::Struct(struct_value) = b.reflect_ref() else {
522522
return Some(false);
523523
};
@@ -545,11 +545,8 @@ pub fn struct_partial_eq<S: Struct + ?Sized>(a: &S, b: &dyn PartialReflect) -> O
545545
///
546546
/// Returns [`None`] if the comparison couldn't be performed (e.g., kinds mismatch
547547
/// or an element comparison returns `None`).
548-
#[inline]
549-
pub fn struct_partial_cmp<S: Struct + ?Sized>(
550-
a: &S,
551-
b: &dyn PartialReflect,
552-
) -> Option<::core::cmp::Ordering> {
548+
#[inline(never)]
549+
pub fn struct_partial_cmp(a: &dyn Struct, b: &dyn PartialReflect) -> Option<::core::cmp::Ordering> {
553550
let ReflectRef::Struct(struct_value) = b.reflect_ref() else {
554551
return None;
555552
};

crates/bevy_reflect/src/tuple_struct.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -428,11 +428,8 @@ impl<'a> IntoIterator for &'a DynamicTupleStruct {
428428
/// - [`PartialReflect::reflect_partial_eq`] returns `Some(true)` for pairwise fields of `a` and `b`.
429429
///
430430
/// Returns [`None`] if the comparison couldn't even be performed.
431-
#[inline]
432-
pub fn tuple_struct_partial_eq<S: TupleStruct + ?Sized>(
433-
a: &S,
434-
b: &dyn PartialReflect,
435-
) -> Option<bool> {
431+
#[inline(never)]
432+
pub fn tuple_struct_partial_eq(a: &dyn TupleStruct, b: &dyn PartialReflect) -> Option<bool> {
436433
let ReflectRef::TupleStruct(tuple_struct) = b.reflect_ref() else {
437434
return Some(false);
438435
};
@@ -454,14 +451,13 @@ pub fn tuple_struct_partial_eq<S: TupleStruct + ?Sized>(
454451

455452
Some(true)
456453
}
457-
458454
/// Lexicographically compares two [`TupleStruct`] values and returns their ordering.
459455
///
460456
/// Returns [`None`] if the comparison couldn't be performed (e.g., kinds mismatch
461457
/// or an element comparison returns `None`).
462-
#[inline]
463-
pub fn tuple_struct_partial_cmp<S: TupleStruct + ?Sized>(
464-
a: &S,
458+
#[inline(never)]
459+
pub fn tuple_struct_partial_cmp(
460+
a: &dyn TupleStruct,
465461
b: &dyn PartialReflect,
466462
) -> Option<::core::cmp::Ordering> {
467463
let ReflectRef::TupleStruct(tuple_struct) = b.reflect_ref() else {

0 commit comments

Comments
 (0)