Some recommendations for cpu:
Any event that can be triggered, should be triggered.
Avoid running anything every tick, even though it seems like it might need to. For example, setting something to the mouse position every tick. This can be optimized by setting it to the mouse position only when the mouse moved from it's previous position instead.
Narrow the scope of every event as much as possible, especially in loops or for each element, to act upon only what it needs to act upon.
As for memory usage, that memory article construct.net/en covers it pretty well. Generally speaking you don't want to even get near the limit of available vram of your target system. If you need to exceed that amount, use layouts to break up and manage memory usage.